]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ipfilter/lib/mutex_emul.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / ipfilter / lib / mutex_emul.c
1 /*      $FreeBSD$       */
2
3 /*
4  * Copyright (C) 2012 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  *
8  * $Id$
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
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
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
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
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
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 }