1 /* $NetBSD: mutex_emul.c,v 1.2 2012/07/22 14:27:36 darrenr Exp $ */
2
3 /*
4 * Copyright (C) 2012 by Darren Reed.
5 *
6 * See the IPFILTER.LICENCE file for details on licencing.
7 *
8 * Id: mutex_emul.c,v 1.1.1.2 2012/07/22 13:44:39 darrenr Exp $
9 */
10
11 #include "ipf.h"
12
13 #define EMM_MAGIC 0x9d7adba3
14
15 static int mutex_debug = 0;
16 static FILE *mutex_file = NULL;
17 static int initcount = 0;
18
19 void
eMmutex_enter(mtx,file,line)20 eMmutex_enter(mtx, file, line)
21 eMmutex_t *mtx;
22 char *file;
23 int line;
24 {
25 if (mutex_debug & 2)
26 fprintf(mutex_file, "%s:%d:eMmutex_enter(%s)\n", file, line,
27 mtx->eMm_owner);
28 if (mtx->eMm_magic != EMM_MAGIC) {
29 fprintf(stderr, "%s:eMmutex_enter(%p): bad magic: %#x\n",
30 mtx->eMm_owner, mtx, mtx->eMm_magic);
31 abort();
32 }
33 if (mtx->eMm_held != 0) {
34 fprintf(stderr, "%s:eMmutex_enter(%p): already locked: %d\n",
35 mtx->eMm_owner, mtx, mtx->eMm_held);
36 abort();
37 }
38 mtx->eMm_held++;
39 mtx->eMm_heldin = file;
40 mtx->eMm_heldat = line;
41 }
42
43
44 void
eMmutex_exit(mtx,file,line)45 eMmutex_exit(mtx, file, line)
46 eMmutex_t *mtx;
47 char *file;
48 int line;
49 {
50 if (mutex_debug & 2)
51 fprintf(mutex_file, "%s:%d:eMmutex_exit(%s)\n", file, line,
52 mtx->eMm_owner);
53 if (mtx->eMm_magic != EMM_MAGIC) {
54 fprintf(stderr, "%s:eMmutex_exit(%p): bad magic: %#x\n",
55 mtx->eMm_owner, mtx, mtx->eMm_magic);
56 abort();
57 }
58 if (mtx->eMm_held != 1) {
59 fprintf(stderr, "%s:eMmutex_exit(%p): not locked: %d\n",
60 mtx->eMm_owner, mtx, mtx->eMm_held);
61 abort();
62 }
63 mtx->eMm_held--;
64 mtx->eMm_heldin = NULL;
65 mtx->eMm_heldat = 0;
66 }
67
68
69 void
eMmutex_init(mtx,who,file,line)70 eMmutex_init(mtx, who, file, line)
71 eMmutex_t *mtx;
72 char *who;
73 char *file;
74 int line;
75 {
76 if (mutex_file == NULL && mutex_debug)
77 mutex_file = fopen("ipf_mutex_log", "w");
78 if (mutex_debug & 1)
79 fprintf(mutex_file, "%s:%d:eMmutex_init(%p,%s)\n",
80 file, line, mtx, who);
81 if (mtx->eMm_magic == EMM_MAGIC) { /* safe bet ? */
82 fprintf(stderr,
83 "%s:eMmutex_init(%p): already initialised?: %#x\n",
84 mtx->eMm_owner, mtx, mtx->eMm_magic);
85 abort();
86 }
87 mtx->eMm_magic = EMM_MAGIC;
88 mtx->eMm_held = 0;
89 if (who != NULL)
90 mtx->eMm_owner = strdup(who);
91 else
92 mtx->eMm_owner = NULL;
93 initcount++;
94 }
95
96
97 void
eMmutex_destroy(mtx,file,line)98 eMmutex_destroy(mtx, file, line)
99 eMmutex_t *mtx;
100 char *file;
101 int line;
102 {
103 if (mutex_debug & 1)
104 fprintf(mutex_file,
105 "%s:%d:eMmutex_destroy(%p,%s)\n", file, line,
106 mtx, mtx->eMm_owner);
107 if (mtx->eMm_magic != EMM_MAGIC) {
108 fprintf(stderr, "%s:eMmutex_destroy(%p): bad magic: %#x\n",
109 mtx->eMm_owner, mtx, mtx->eMm_magic);
110 abort();
111 }
112 if (mtx->eMm_held != 0) {
113 fprintf(stderr,
114 "%s:eMmutex_enter(%p): still locked: %d\n",
115 mtx->eMm_owner, mtx, mtx->eMm_held);
116 abort();
117 }
118 if (mtx->eMm_owner != NULL)
119 free(mtx->eMm_owner);
120 memset(mtx, 0xa5, sizeof(*mtx));
121 initcount--;
122 }
123
124
125 void
ipf_mutex_clean()126 ipf_mutex_clean()
127 {
128 if (initcount != 0) {
129 if (mutex_file)
130 fprintf(mutex_file, "initcount %d\n", initcount);
131 abort();
132 }
133 }
134