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