xref: /illumos-gate/usr/src/cmd/ipf/lib/rwlock_emul.c (revision f3ac678143127d4c6c1793fadabb5ded04e127b6)
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