5 #define EMM_MAGIC 0x97dd8b3a
7 void eMrwlock_read_enter(rw, file, line)
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);
17 if (rw->eMrw_read != 0 || rw->eMrw_write != 0) {
19 "%s:eMrwlock_read_enter(%p): already locked: %d/%d\n",
20 rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
24 rw->eMrw_heldin = file;
25 rw->eMrw_heldat = line;
29 void eMrwlock_write_enter(rw, file, line)
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);
39 if (rw->eMrw_read != 0 || rw->eMrw_write != 0) {
41 "%s:eMrwlock_write_enter(%p): already locked: %d/%d\n",
42 rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
46 rw->eMrw_heldin = file;
47 rw->eMrw_heldat = line;
51 void eMrwlock_downgrade(rw, file, line)
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);
61 if (rw->eMrw_read != 0 || rw->eMrw_write != 1) {
63 "%s:eMrwlock_write_enter(%p): already locked: %d/%d\n",
64 rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
69 rw->eMrw_heldin = file;
70 rw->eMrw_heldat = line;
74 void eMrwlock_exit(rw)
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);
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);
87 if (rw->eMrw_read == 1)
89 else if (rw->eMrw_write == 1)
91 rw->eMrw_heldin = NULL;
96 void eMrwlock_init(rw, who)
100 if (rw->eMrw_magic == EMM_MAGIC) { /* safe bet ? */
102 "%s:eMrwlock_init(%p): already initialised?: %#x\n",
103 rw->eMrw_owner, rw, rw->eMrw_magic);
106 rw->eMrw_magic = EMM_MAGIC;
110 rw->eMrw_owner = strdup(who);
112 rw->eMrw_owner = NULL;
116 void eMrwlock_destroy(rw)
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);
124 memset(rw, 0xa5, sizeof(*rw));