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