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