Home | History | Annotate | Line # | Download | only in lib
      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
     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