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