xref: /freebsd/sbin/ipf/libipf/mutex_emul.c (revision 2e3f49888ec8851bafb22011533217487764fdb0)
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 
14 static	int	mutex_debug = 0;
15 static	FILE	*mutex_file = NULL;
16 static	int	initcount = 0;
17 
18 void
19 eMmutex_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 
40 void
41 eMmutex_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 
62 void
63 eMmutex_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 
86 void
87 eMmutex_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 
111 void
112 ipf_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