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