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
eMmutex_enter(eMmutex_t * mtx,char * file,int line)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
eMmutex_exit(eMmutex_t * mtx,char * file,int line)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
eMmutex_init(eMmutex_t * mtx,char * who,char * file,int line)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
eMmutex_destroy(eMmutex_t * mtx,char * file,int line)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
ipf_mutex_clean(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