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