1
2 /*
3 * Copyright (C) 2012 by Darren Reed.
4 *
5 * See the IPFILTER.LICENCE file for details on licencing.
6 *
7 * $Id$
8 */
9
10 #include "ipf.h"
11
12 #define EMM_MAGIC 0x97dd8b3a
13
eMrwlock_read_enter(eMrwlock_t * rw,char * file,int line)14 void eMrwlock_read_enter(eMrwlock_t *rw, char *file, int line)
15 {
16 if (rw->eMrw_magic != EMM_MAGIC) {
17 fprintf(stderr, "%s:eMrwlock_read_enter(%p): bad magic: %#x\n",
18 rw->eMrw_owner, rw, rw->eMrw_magic);
19 abort();
20 }
21 if (rw->eMrw_read != 0 || rw->eMrw_write != 0) {
22 fprintf(stderr,
23 "%s:eMrwlock_read_enter(%p): already locked: %d/%d\n",
24 rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
25 abort();
26 }
27 rw->eMrw_read++;
28 rw->eMrw_heldin = file;
29 rw->eMrw_heldat = line;
30 }
31
32
eMrwlock_write_enter(eMrwlock_t * rw,char * file,int line)33 void eMrwlock_write_enter(eMrwlock_t *rw, char *file, int line)
34 {
35 if (rw->eMrw_magic != EMM_MAGIC) {
36 fprintf(stderr, "%s:eMrwlock_write_enter(%p): bad magic: %#x\n",
37 rw->eMrw_owner, rw, rw->eMrw_magic);
38 abort();
39 }
40 if (rw->eMrw_read != 0 || rw->eMrw_write != 0) {
41 fprintf(stderr,
42 "%s:eMrwlock_write_enter(%p): already locked: %d/%d\n",
43 rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
44 abort();
45 }
46 rw->eMrw_write++;
47 rw->eMrw_heldin = file;
48 rw->eMrw_heldat = line;
49 }
50
51
eMrwlock_try_upgrade(eMrwlock_t * rw,char * file,int line)52 void eMrwlock_try_upgrade(eMrwlock_t *rw, char *file, 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 != 0) {
60 fprintf(stderr,
61 "%s:eMrwlock_try_upgrade(%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_heldin = file;
67 rw->eMrw_heldat = line;
68 }
69
eMrwlock_downgrade(eMrwlock_t * rw,char * file,int line)70 void eMrwlock_downgrade(eMrwlock_t *rw, char *file, int line)
71 {
72 if (rw->eMrw_magic != EMM_MAGIC) {
73 fprintf(stderr, "%s:eMrwlock_write_enter(%p): bad magic: %#x\n",
74 rw->eMrw_owner, rw, rw->eMrw_magic);
75 abort();
76 }
77 if (rw->eMrw_read != 0 || rw->eMrw_write != 1) {
78 fprintf(stderr,
79 "%s:eMrwlock_write_enter(%p): already locked: %d/%d\n",
80 rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
81 abort();
82 }
83 rw->eMrw_write--;
84 rw->eMrw_read++;
85 rw->eMrw_heldin = file;
86 rw->eMrw_heldat = line;
87 }
88
89
eMrwlock_exit(eMrwlock_t * rw)90 void eMrwlock_exit(eMrwlock_t *rw)
91 {
92 if (rw->eMrw_magic != EMM_MAGIC) {
93 fprintf(stderr, "%s:eMrwlock_exit(%p): bad magic: %#x\n",
94 rw->eMrw_owner, rw, rw->eMrw_magic);
95 abort();
96 }
97 if (rw->eMrw_read != 1 && rw->eMrw_write != 1) {
98 fprintf(stderr, "%s:eMrwlock_exit(%p): not locked: %d/%d\n",
99 rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
100 abort();
101 }
102 if (rw->eMrw_read == 1)
103 rw->eMrw_read--;
104 else if (rw->eMrw_write == 1)
105 rw->eMrw_write--;
106 rw->eMrw_heldin = NULL;
107 rw->eMrw_heldat = 0;
108 }
109
110
111 static int initcount = 0;
112
eMrwlock_init(eMrwlock_t * rw,char * who)113 void eMrwlock_init(eMrwlock_t *rw, char *who)
114 {
115 if (rw->eMrw_magic == EMM_MAGIC) { /* safe bet ? */
116 fprintf(stderr,
117 "%s:eMrwlock_init(%p): already initialised?: %#x\n",
118 rw->eMrw_owner, rw, rw->eMrw_magic);
119 abort();
120 }
121 rw->eMrw_magic = EMM_MAGIC;
122 rw->eMrw_read = 0;
123 rw->eMrw_write = 0;
124 if (who != NULL)
125 rw->eMrw_owner = strdup(who);
126 else
127 rw->eMrw_owner = NULL;
128 initcount++;
129 }
130
131
eMrwlock_destroy(eMrwlock_t * rw)132 void eMrwlock_destroy(eMrwlock_t *rw)
133 {
134 if (rw->eMrw_magic != EMM_MAGIC) {
135 fprintf(stderr, "%s:eMrwlock_destroy(%p): bad magic: %#x\n",
136 rw->eMrw_owner, rw, rw->eMrw_magic);
137 abort();
138 }
139 if (rw->eMrw_owner != NULL)
140 free(rw->eMrw_owner);
141 memset(rw, 0xa5, sizeof(*rw));
142 initcount--;
143 }
144
ipf_rwlock_clean(void)145 void ipf_rwlock_clean(void)
146 {
147 if (initcount != 0)
148 abort();
149 }
150