1145519Sdarrenr/* $FreeBSD: releng/10.3/contrib/ipfilter/lib/mutex_emul.c 255332 2013-09-06 23:11:19Z cy $ */ 2145510Sdarrenr 3170268Sdarrenr/* 4255332Scy * Copyright (C) 2012 by Darren Reed. 5255332Scy * 6255332Scy * See the IPFILTER.LICENCE file for details on licencing. 7255332Scy * 8255332Scy * $Id$ 9255332Scy */ 10170268Sdarrenr 11145510Sdarrenr#include "ipf.h" 12145510Sdarrenr 13145510Sdarrenr#define EMM_MAGIC 0x9d7adba3 14145510Sdarrenr 15255332Scystatic int mutex_debug = 0; 16255332Scystatic FILE *mutex_file = NULL; 17255332Scystatic int initcount = 0; 18255332Scy 19255332Scyvoid 20255332ScyeMmutex_enter(mtx, file, line) 21255332Scy eMmutex_t *mtx; 22255332Scy char *file; 23255332Scy int line; 24145510Sdarrenr{ 25255332Scy if (mutex_debug & 2) 26255332Scy fprintf(mutex_file, "%s:%d:eMmutex_enter(%s)\n", file, line, 27255332Scy mtx->eMm_owner); 28145510Sdarrenr if (mtx->eMm_magic != EMM_MAGIC) { 29145510Sdarrenr fprintf(stderr, "%s:eMmutex_enter(%p): bad magic: %#x\n", 30145510Sdarrenr mtx->eMm_owner, mtx, mtx->eMm_magic); 31145510Sdarrenr abort(); 32145510Sdarrenr } 33145510Sdarrenr if (mtx->eMm_held != 0) { 34145510Sdarrenr fprintf(stderr, "%s:eMmutex_enter(%p): already locked: %d\n", 35145510Sdarrenr mtx->eMm_owner, mtx, mtx->eMm_held); 36145510Sdarrenr abort(); 37145510Sdarrenr } 38145510Sdarrenr mtx->eMm_held++; 39145510Sdarrenr mtx->eMm_heldin = file; 40145510Sdarrenr mtx->eMm_heldat = line; 41145510Sdarrenr} 42145510Sdarrenr 43145510Sdarrenr 44255332Scyvoid 45255332ScyeMmutex_exit(mtx, file, line) 46255332Scy eMmutex_t *mtx; 47255332Scy char *file; 48255332Scy int line; 49145510Sdarrenr{ 50255332Scy if (mutex_debug & 2) 51255332Scy fprintf(mutex_file, "%s:%d:eMmutex_exit(%s)\n", file, line, 52255332Scy mtx->eMm_owner); 53145510Sdarrenr if (mtx->eMm_magic != EMM_MAGIC) { 54145510Sdarrenr fprintf(stderr, "%s:eMmutex_exit(%p): bad magic: %#x\n", 55145510Sdarrenr mtx->eMm_owner, mtx, mtx->eMm_magic); 56145510Sdarrenr abort(); 57145510Sdarrenr } 58145510Sdarrenr if (mtx->eMm_held != 1) { 59145510Sdarrenr fprintf(stderr, "%s:eMmutex_exit(%p): not locked: %d\n", 60145510Sdarrenr mtx->eMm_owner, mtx, mtx->eMm_held); 61145510Sdarrenr abort(); 62145510Sdarrenr } 63145510Sdarrenr mtx->eMm_held--; 64145510Sdarrenr mtx->eMm_heldin = NULL; 65145510Sdarrenr mtx->eMm_heldat = 0; 66145510Sdarrenr} 67145510Sdarrenr 68145510Sdarrenr 69255332Scyvoid 70255332ScyeMmutex_init(mtx, who, file, line) 71255332Scy eMmutex_t *mtx; 72255332Scy char *who; 73255332Scy char *file; 74255332Scy int line; 75145510Sdarrenr{ 76255332Scy if (mutex_file == NULL && mutex_debug) 77255332Scy mutex_file = fopen("ipf_mutex_log", "w"); 78255332Scy if (mutex_debug & 1) 79255332Scy fprintf(mutex_file, "%s:%d:eMmutex_init(%p,%s)\n", 80255332Scy file, line, mtx, who); 81145510Sdarrenr if (mtx->eMm_magic == EMM_MAGIC) { /* safe bet ? */ 82145510Sdarrenr fprintf(stderr, 83145510Sdarrenr "%s:eMmutex_init(%p): already initialised?: %#x\n", 84145510Sdarrenr mtx->eMm_owner, mtx, mtx->eMm_magic); 85145510Sdarrenr abort(); 86145510Sdarrenr } 87145510Sdarrenr mtx->eMm_magic = EMM_MAGIC; 88145510Sdarrenr mtx->eMm_held = 0; 89145510Sdarrenr if (who != NULL) 90145510Sdarrenr mtx->eMm_owner = strdup(who); 91145510Sdarrenr else 92145510Sdarrenr mtx->eMm_owner = NULL; 93255332Scy initcount++; 94145510Sdarrenr} 95145510Sdarrenr 96145510Sdarrenr 97255332Scyvoid 98255332ScyeMmutex_destroy(mtx, file, line) 99255332Scy eMmutex_t *mtx; 100255332Scy char *file; 101255332Scy int line; 102145510Sdarrenr{ 103255332Scy if (mutex_debug & 1) 104255332Scy fprintf(mutex_file, 105255332Scy "%s:%d:eMmutex_destroy(%p,%s)\n", file, line, 106255332Scy mtx, mtx->eMm_owner); 107145510Sdarrenr if (mtx->eMm_magic != EMM_MAGIC) { 108145510Sdarrenr fprintf(stderr, "%s:eMmutex_destroy(%p): bad magic: %#x\n", 109145510Sdarrenr mtx->eMm_owner, mtx, mtx->eMm_magic); 110145510Sdarrenr abort(); 111145510Sdarrenr } 112145510Sdarrenr if (mtx->eMm_held != 0) { 113255332Scy fprintf(stderr, 114255332Scy "%s:eMmutex_enter(%p): still locked: %d\n", 115145510Sdarrenr mtx->eMm_owner, mtx, mtx->eMm_held); 116145510Sdarrenr abort(); 117145510Sdarrenr } 118255332Scy if (mtx->eMm_owner != NULL) 119255332Scy free(mtx->eMm_owner); 120145510Sdarrenr memset(mtx, 0xa5, sizeof(*mtx)); 121255332Scy initcount--; 122145510Sdarrenr} 123255332Scy 124255332Scy 125255332Scyvoid 126255332Scyipf_mutex_clean() 127255332Scy{ 128255332Scy if (initcount != 0) { 129255332Scy if (mutex_file) 130255332Scy fprintf(mutex_file, "initcount %d\n", initcount); 131255332Scy abort(); 132255332Scy } 133255332Scy} 134