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	0x9d7adba3
13
14static	int	mutex_debug = 0;
15static	FILE	*mutex_file = NULL;
16static	int	initcount = 0;
17
18void
19eMmutex_enter(eMmutex_t *mtx, char *file, int line)
20{
21	if (mutex_debug & 2)
22		fprintf(mutex_file, "%s:%d:eMmutex_enter(%s)\n", file, line,
23		       mtx->eMm_owner);
24	if (mtx->eMm_magic != EMM_MAGIC) {
25		fprintf(stderr, "%s:eMmutex_enter(%p): bad magic: %#x\n",
26			mtx->eMm_owner, mtx, mtx->eMm_magic);
27		abort();
28	}
29	if (mtx->eMm_held != 0) {
30		fprintf(stderr, "%s:eMmutex_enter(%p): already locked: %d\n",
31			mtx->eMm_owner, mtx, mtx->eMm_held);
32		abort();
33	}
34	mtx->eMm_held++;
35	mtx->eMm_heldin = file;
36	mtx->eMm_heldat = line;
37}
38
39
40void
41eMmutex_exit(eMmutex_t *mtx, char *file, int line)
42{
43	if (mutex_debug & 2)
44		fprintf(mutex_file, "%s:%d:eMmutex_exit(%s)\n", file, line,
45		       mtx->eMm_owner);
46	if (mtx->eMm_magic != EMM_MAGIC) {
47		fprintf(stderr, "%s:eMmutex_exit(%p): bad magic: %#x\n",
48			mtx->eMm_owner, mtx, mtx->eMm_magic);
49		abort();
50	}
51	if (mtx->eMm_held != 1) {
52		fprintf(stderr, "%s:eMmutex_exit(%p): not locked: %d\n",
53			mtx->eMm_owner, mtx, mtx->eMm_held);
54		abort();
55	}
56	mtx->eMm_held--;
57	mtx->eMm_heldin = NULL;
58	mtx->eMm_heldat = 0;
59}
60
61
62void
63eMmutex_init(eMmutex_t *mtx, char *who, char *file, int line)
64{
65	if (mutex_file == NULL && mutex_debug)
66		mutex_file = fopen("ipf_mutex_log", "w");
67	if (mutex_debug & 1)
68		fprintf(mutex_file, "%s:%d:eMmutex_init(%p,%s)\n",
69			file, line, mtx, who);
70	if (mtx->eMm_magic == EMM_MAGIC) {	/* safe bet ? */
71		fprintf(stderr,
72			"%s:eMmutex_init(%p): already initialised?: %#x\n",
73			mtx->eMm_owner, mtx, mtx->eMm_magic);
74		abort();
75	}
76	mtx->eMm_magic = EMM_MAGIC;
77	mtx->eMm_held = 0;
78	if (who != NULL)
79		mtx->eMm_owner = strdup(who);
80	else
81		mtx->eMm_owner = NULL;
82	initcount++;
83}
84
85
86void
87eMmutex_destroy(eMmutex_t *mtx, char *file, int line)
88{
89	if (mutex_debug & 1)
90		fprintf(mutex_file,
91			"%s:%d:eMmutex_destroy(%p,%s)\n", file, line,
92			mtx, mtx->eMm_owner);
93	if (mtx->eMm_magic != EMM_MAGIC) {
94		fprintf(stderr, "%s:eMmutex_destroy(%p): bad magic: %#x\n",
95			mtx->eMm_owner, mtx, mtx->eMm_magic);
96		abort();
97	}
98	if (mtx->eMm_held != 0) {
99		fprintf(stderr,
100			"%s:eMmutex_enter(%p): still locked: %d\n",
101			mtx->eMm_owner, mtx, mtx->eMm_held);
102		abort();
103	}
104	if (mtx->eMm_owner != NULL)
105		free(mtx->eMm_owner);
106	memset(mtx, 0xa5, sizeof(*mtx));
107	initcount--;
108}
109
110
111void
112ipf_mutex_clean(void)
113{
114	if (initcount != 0) {
115		if (mutex_file)
116			fprintf(mutex_file, "initcount %d\n", initcount);
117		abort();
118	}
119}
120