1*f3ac6781SToomas Soome #include "ipf.h"
2*f3ac6781SToomas Soome
3*f3ac6781SToomas Soome #define EMM_MAGIC 0x97dd8b3a
4*f3ac6781SToomas Soome
eMrwlock_read_enter(rw,file,line)5*f3ac6781SToomas Soome void eMrwlock_read_enter(rw, file, line)
6*f3ac6781SToomas Soome eMrwlock_t *rw;
7*f3ac6781SToomas Soome char *file;
8*f3ac6781SToomas Soome int line;
9*f3ac6781SToomas Soome {
10*f3ac6781SToomas Soome if (rw->eMrw_magic != EMM_MAGIC) {
11*f3ac6781SToomas Soome fprintf(stderr, "%s:eMrwlock_read_enter(%p): bad magic: %#x\n",
12*f3ac6781SToomas Soome rw->eMrw_owner, rw, rw->eMrw_magic);
13*f3ac6781SToomas Soome abort();
14*f3ac6781SToomas Soome }
15*f3ac6781SToomas Soome if (rw->eMrw_read != 0 || rw->eMrw_write != 0) {
16*f3ac6781SToomas Soome fprintf(stderr,
17*f3ac6781SToomas Soome "%s:eMrwlock_read_enter(%p): already locked: %d/%d\n",
18*f3ac6781SToomas Soome rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
19*f3ac6781SToomas Soome abort();
20*f3ac6781SToomas Soome }
21*f3ac6781SToomas Soome rw->eMrw_read++;
22*f3ac6781SToomas Soome rw->eMrw_heldin = file;
23*f3ac6781SToomas Soome rw->eMrw_heldat = line;
24*f3ac6781SToomas Soome }
25*f3ac6781SToomas Soome
26*f3ac6781SToomas Soome
eMrwlock_write_enter(rw,file,line)27*f3ac6781SToomas Soome void eMrwlock_write_enter(rw, file, line)
28*f3ac6781SToomas Soome eMrwlock_t *rw;
29*f3ac6781SToomas Soome char *file;
30*f3ac6781SToomas Soome int line;
31*f3ac6781SToomas Soome {
32*f3ac6781SToomas Soome if (rw->eMrw_magic != EMM_MAGIC) {
33*f3ac6781SToomas Soome fprintf(stderr, "%s:eMrwlock_write_enter(%p): bad magic: %#x\n",
34*f3ac6781SToomas Soome rw->eMrw_owner, rw, rw->eMrw_magic);
35*f3ac6781SToomas Soome abort();
36*f3ac6781SToomas Soome }
37*f3ac6781SToomas Soome if (rw->eMrw_read != 0 || rw->eMrw_write != 0) {
38*f3ac6781SToomas Soome fprintf(stderr,
39*f3ac6781SToomas Soome "%s:eMrwlock_write_enter(%p): already locked: %d/%d\n",
40*f3ac6781SToomas Soome rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
41*f3ac6781SToomas Soome abort();
42*f3ac6781SToomas Soome }
43*f3ac6781SToomas Soome rw->eMrw_write++;
44*f3ac6781SToomas Soome rw->eMrw_heldin = file;
45*f3ac6781SToomas Soome rw->eMrw_heldat = line;
46*f3ac6781SToomas Soome }
47*f3ac6781SToomas Soome
48*f3ac6781SToomas Soome
eMrwlock_downgrade(rw,file,line)49*f3ac6781SToomas Soome void eMrwlock_downgrade(rw, file, line)
50*f3ac6781SToomas Soome eMrwlock_t *rw;
51*f3ac6781SToomas Soome char *file;
52*f3ac6781SToomas Soome int line;
53*f3ac6781SToomas Soome {
54*f3ac6781SToomas Soome if (rw->eMrw_magic != EMM_MAGIC) {
55*f3ac6781SToomas Soome fprintf(stderr, "%s:eMrwlock_write_enter(%p): bad magic: %#x\n",
56*f3ac6781SToomas Soome rw->eMrw_owner, rw, rw->eMrw_magic);
57*f3ac6781SToomas Soome abort();
58*f3ac6781SToomas Soome }
59*f3ac6781SToomas Soome if (rw->eMrw_read != 0 || rw->eMrw_write != 1) {
60*f3ac6781SToomas Soome fprintf(stderr,
61*f3ac6781SToomas Soome "%s:eMrwlock_write_enter(%p): already locked: %d/%d\n",
62*f3ac6781SToomas Soome rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
63*f3ac6781SToomas Soome abort();
64*f3ac6781SToomas Soome }
65*f3ac6781SToomas Soome rw->eMrw_write--;
66*f3ac6781SToomas Soome rw->eMrw_read++;
67*f3ac6781SToomas Soome rw->eMrw_heldin = file;
68*f3ac6781SToomas Soome rw->eMrw_heldat = line;
69*f3ac6781SToomas Soome }
70*f3ac6781SToomas Soome
71*f3ac6781SToomas Soome
eMrwlock_exit(rw)72*f3ac6781SToomas Soome void eMrwlock_exit(rw)
73*f3ac6781SToomas Soome eMrwlock_t *rw;
74*f3ac6781SToomas Soome {
75*f3ac6781SToomas Soome if (rw->eMrw_magic != EMM_MAGIC) {
76*f3ac6781SToomas Soome fprintf(stderr, "%s:eMrwlock_exit(%p): bad magic: %#x\n",
77*f3ac6781SToomas Soome rw->eMrw_owner, rw, rw->eMrw_magic);
78*f3ac6781SToomas Soome abort();
79*f3ac6781SToomas Soome }
80*f3ac6781SToomas Soome if (rw->eMrw_read != 1 && rw->eMrw_write != 1) {
81*f3ac6781SToomas Soome fprintf(stderr, "%s:eMrwlock_exit(%p): not locked: %d/%d\n",
82*f3ac6781SToomas Soome rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
83*f3ac6781SToomas Soome abort();
84*f3ac6781SToomas Soome }
85*f3ac6781SToomas Soome if (rw->eMrw_read == 1)
86*f3ac6781SToomas Soome rw->eMrw_read--;
87*f3ac6781SToomas Soome else if (rw->eMrw_write == 1)
88*f3ac6781SToomas Soome rw->eMrw_write--;
89*f3ac6781SToomas Soome rw->eMrw_heldin = NULL;
90*f3ac6781SToomas Soome rw->eMrw_heldat = 0;
91*f3ac6781SToomas Soome }
92*f3ac6781SToomas Soome
93*f3ac6781SToomas Soome
eMrwlock_init(rw,who)94*f3ac6781SToomas Soome void eMrwlock_init(rw, who)
95*f3ac6781SToomas Soome eMrwlock_t *rw;
96*f3ac6781SToomas Soome char *who;
97*f3ac6781SToomas Soome {
98*f3ac6781SToomas Soome if (rw->eMrw_magic == EMM_MAGIC) { /* safe bet ? */
99*f3ac6781SToomas Soome fprintf(stderr,
100*f3ac6781SToomas Soome "%s:eMrwlock_init(%p): already initialised?: %#x\n",
101*f3ac6781SToomas Soome rw->eMrw_owner, rw, rw->eMrw_magic);
102*f3ac6781SToomas Soome abort();
103*f3ac6781SToomas Soome }
104*f3ac6781SToomas Soome rw->eMrw_magic = EMM_MAGIC;
105*f3ac6781SToomas Soome rw->eMrw_read = 0;
106*f3ac6781SToomas Soome rw->eMrw_write = 0;
107*f3ac6781SToomas Soome if (who != NULL)
108*f3ac6781SToomas Soome rw->eMrw_owner = strdup(who);
109*f3ac6781SToomas Soome else
110*f3ac6781SToomas Soome rw->eMrw_owner = NULL;
111*f3ac6781SToomas Soome }
112*f3ac6781SToomas Soome
113*f3ac6781SToomas Soome
eMrwlock_destroy(rw)114*f3ac6781SToomas Soome void eMrwlock_destroy(rw)
115*f3ac6781SToomas Soome eMrwlock_t *rw;
116*f3ac6781SToomas Soome {
117*f3ac6781SToomas Soome if (rw->eMrw_magic != EMM_MAGIC) {
118*f3ac6781SToomas Soome fprintf(stderr, "%s:eMrwlock_destroy(%p): bad magic: %#x\n",
119*f3ac6781SToomas Soome rw->eMrw_owner, rw, rw->eMrw_magic);
120*f3ac6781SToomas Soome abort();
121*f3ac6781SToomas Soome }
122*f3ac6781SToomas Soome memset(rw, 0xa5, sizeof(*rw));
123*f3ac6781SToomas Soome }
124