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 } 134