1145519Sdarrenr/*	$FreeBSD: releng/10.3/contrib/ipfilter/lib/mutex_emul.c 255332 2013-09-06 23:11:19Z cy $	*/
2145510Sdarrenr
3170268Sdarrenr/*
4255332Scy * Copyright (C) 2012 by Darren Reed.
5255332Scy *
6255332Scy * See the IPFILTER.LICENCE file for details on licencing.
7255332Scy *
8255332Scy * $Id$
9255332Scy */
10170268Sdarrenr
11145510Sdarrenr#include "ipf.h"
12145510Sdarrenr
13145510Sdarrenr#define	EMM_MAGIC	0x9d7adba3
14145510Sdarrenr
15255332Scystatic	int	mutex_debug = 0;
16255332Scystatic	FILE	*mutex_file = NULL;
17255332Scystatic	int	initcount = 0;
18255332Scy
19255332Scyvoid
20255332ScyeMmutex_enter(mtx, file, line)
21255332Scy	eMmutex_t *mtx;
22255332Scy	char *file;
23255332Scy	int line;
24145510Sdarrenr{
25255332Scy	if (mutex_debug & 2)
26255332Scy		fprintf(mutex_file, "%s:%d:eMmutex_enter(%s)\n", file, line,
27255332Scy		       mtx->eMm_owner);
28145510Sdarrenr	if (mtx->eMm_magic != EMM_MAGIC) {
29145510Sdarrenr		fprintf(stderr, "%s:eMmutex_enter(%p): bad magic: %#x\n",
30145510Sdarrenr			mtx->eMm_owner, mtx, mtx->eMm_magic);
31145510Sdarrenr		abort();
32145510Sdarrenr	}
33145510Sdarrenr	if (mtx->eMm_held != 0) {
34145510Sdarrenr		fprintf(stderr, "%s:eMmutex_enter(%p): already locked: %d\n",
35145510Sdarrenr			mtx->eMm_owner, mtx, mtx->eMm_held);
36145510Sdarrenr		abort();
37145510Sdarrenr	}
38145510Sdarrenr	mtx->eMm_held++;
39145510Sdarrenr	mtx->eMm_heldin = file;
40145510Sdarrenr	mtx->eMm_heldat = line;
41145510Sdarrenr}
42145510Sdarrenr
43145510Sdarrenr
44255332Scyvoid
45255332ScyeMmutex_exit(mtx, file, line)
46255332Scy	eMmutex_t *mtx;
47255332Scy	char *file;
48255332Scy	int line;
49145510Sdarrenr{
50255332Scy	if (mutex_debug & 2)
51255332Scy		fprintf(mutex_file, "%s:%d:eMmutex_exit(%s)\n", file, line,
52255332Scy		       mtx->eMm_owner);
53145510Sdarrenr	if (mtx->eMm_magic != EMM_MAGIC) {
54145510Sdarrenr		fprintf(stderr, "%s:eMmutex_exit(%p): bad magic: %#x\n",
55145510Sdarrenr			mtx->eMm_owner, mtx, mtx->eMm_magic);
56145510Sdarrenr		abort();
57145510Sdarrenr	}
58145510Sdarrenr	if (mtx->eMm_held != 1) {
59145510Sdarrenr		fprintf(stderr, "%s:eMmutex_exit(%p): not locked: %d\n",
60145510Sdarrenr			mtx->eMm_owner, mtx, mtx->eMm_held);
61145510Sdarrenr		abort();
62145510Sdarrenr	}
63145510Sdarrenr	mtx->eMm_held--;
64145510Sdarrenr	mtx->eMm_heldin = NULL;
65145510Sdarrenr	mtx->eMm_heldat = 0;
66145510Sdarrenr}
67145510Sdarrenr
68145510Sdarrenr
69255332Scyvoid
70255332ScyeMmutex_init(mtx, who, file, line)
71255332Scy	eMmutex_t *mtx;
72255332Scy	char *who;
73255332Scy	char *file;
74255332Scy	int line;
75145510Sdarrenr{
76255332Scy	if (mutex_file == NULL && mutex_debug)
77255332Scy		mutex_file = fopen("ipf_mutex_log", "w");
78255332Scy	if (mutex_debug & 1)
79255332Scy		fprintf(mutex_file, "%s:%d:eMmutex_init(%p,%s)\n",
80255332Scy			file, line, mtx, who);
81145510Sdarrenr	if (mtx->eMm_magic == EMM_MAGIC) {	/* safe bet ? */
82145510Sdarrenr		fprintf(stderr,
83145510Sdarrenr			"%s:eMmutex_init(%p): already initialised?: %#x\n",
84145510Sdarrenr			mtx->eMm_owner, mtx, mtx->eMm_magic);
85145510Sdarrenr		abort();
86145510Sdarrenr	}
87145510Sdarrenr	mtx->eMm_magic = EMM_MAGIC;
88145510Sdarrenr	mtx->eMm_held = 0;
89145510Sdarrenr	if (who != NULL)
90145510Sdarrenr		mtx->eMm_owner = strdup(who);
91145510Sdarrenr	else
92145510Sdarrenr		mtx->eMm_owner = NULL;
93255332Scy	initcount++;
94145510Sdarrenr}
95145510Sdarrenr
96145510Sdarrenr
97255332Scyvoid
98255332ScyeMmutex_destroy(mtx, file, line)
99255332Scy	eMmutex_t *mtx;
100255332Scy	char *file;
101255332Scy	int line;
102145510Sdarrenr{
103255332Scy	if (mutex_debug & 1)
104255332Scy		fprintf(mutex_file,
105255332Scy			"%s:%d:eMmutex_destroy(%p,%s)\n", file, line,
106255332Scy			mtx, mtx->eMm_owner);
107145510Sdarrenr	if (mtx->eMm_magic != EMM_MAGIC) {
108145510Sdarrenr		fprintf(stderr, "%s:eMmutex_destroy(%p): bad magic: %#x\n",
109145510Sdarrenr			mtx->eMm_owner, mtx, mtx->eMm_magic);
110145510Sdarrenr		abort();
111145510Sdarrenr	}
112145510Sdarrenr	if (mtx->eMm_held != 0) {
113255332Scy		fprintf(stderr,
114255332Scy			"%s:eMmutex_enter(%p): still locked: %d\n",
115145510Sdarrenr			mtx->eMm_owner, mtx, mtx->eMm_held);
116145510Sdarrenr		abort();
117145510Sdarrenr	}
118255332Scy	if (mtx->eMm_owner != NULL)
119255332Scy		free(mtx->eMm_owner);
120145510Sdarrenr	memset(mtx, 0xa5, sizeof(*mtx));
121255332Scy	initcount--;
122145510Sdarrenr}
123255332Scy
124255332Scy
125255332Scyvoid
126255332Scyipf_mutex_clean()
127255332Scy{
128255332Scy	if (initcount != 0) {
129255332Scy		if (mutex_file)
130255332Scy			fprintf(mutex_file, "initcount %d\n", initcount);
131255332Scy		abort();
132255332Scy	}
133255332Scy}
134