Home | History | Annotate | Line # | Download | only in lib
rwlock_emul.c revision 1.1.1.1
      1  1.1  christos /*	$NetBSD: rwlock_emul.c,v 1.1.1.1 2012/03/23 21:20:10 christos Exp $	*/
      2  1.1  christos 
      3  1.1  christos /*
      4  1.1  christos  * Copyright (C) 2012 by Darren Reed.
      5  1.1  christos  *
      6  1.1  christos  * See the IPFILTER.LICENCE file for details on licencing.
      7  1.1  christos  *
      8  1.1  christos  * Id
      9  1.1  christos  */
     10  1.1  christos 
     11  1.1  christos #include "ipf.h"
     12  1.1  christos 
     13  1.1  christos #define	EMM_MAGIC	0x97dd8b3a
     14  1.1  christos 
     15  1.1  christos void eMrwlock_read_enter(rw, file, line)
     16  1.1  christos 	eMrwlock_t *rw;
     17  1.1  christos 	char *file;
     18  1.1  christos 	int line;
     19  1.1  christos {
     20  1.1  christos 	if (rw->eMrw_magic != EMM_MAGIC) {
     21  1.1  christos 		fprintf(stderr, "%s:eMrwlock_read_enter(%p): bad magic: %#x\n",
     22  1.1  christos 			rw->eMrw_owner, rw, rw->eMrw_magic);
     23  1.1  christos 		abort();
     24  1.1  christos 	}
     25  1.1  christos 	if (rw->eMrw_read != 0 || rw->eMrw_write != 0) {
     26  1.1  christos 		fprintf(stderr,
     27  1.1  christos 			"%s:eMrwlock_read_enter(%p): already locked: %d/%d\n",
     28  1.1  christos 			rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
     29  1.1  christos 		abort();
     30  1.1  christos 	}
     31  1.1  christos 	rw->eMrw_read++;
     32  1.1  christos 	rw->eMrw_heldin = file;
     33  1.1  christos 	rw->eMrw_heldat = line;
     34  1.1  christos }
     35  1.1  christos 
     36  1.1  christos 
     37  1.1  christos void eMrwlock_write_enter(rw, file, line)
     38  1.1  christos 	eMrwlock_t *rw;
     39  1.1  christos 	char *file;
     40  1.1  christos 	int line;
     41  1.1  christos {
     42  1.1  christos 	if (rw->eMrw_magic != EMM_MAGIC) {
     43  1.1  christos 		fprintf(stderr, "%s:eMrwlock_write_enter(%p): bad magic: %#x\n",
     44  1.1  christos 			rw->eMrw_owner, rw, rw->eMrw_magic);
     45  1.1  christos 		abort();
     46  1.1  christos 	}
     47  1.1  christos 	if (rw->eMrw_read != 0 || rw->eMrw_write != 0) {
     48  1.1  christos 		fprintf(stderr,
     49  1.1  christos 			"%s:eMrwlock_write_enter(%p): already locked: %d/%d\n",
     50  1.1  christos 			rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
     51  1.1  christos 		abort();
     52  1.1  christos 	}
     53  1.1  christos 	rw->eMrw_write++;
     54  1.1  christos 	rw->eMrw_heldin = file;
     55  1.1  christos 	rw->eMrw_heldat = line;
     56  1.1  christos }
     57  1.1  christos 
     58  1.1  christos 
     59  1.1  christos void eMrwlock_downgrade(rw, file, line)
     60  1.1  christos 	eMrwlock_t *rw;
     61  1.1  christos 	char *file;
     62  1.1  christos 	int line;
     63  1.1  christos {
     64  1.1  christos 	if (rw->eMrw_magic != EMM_MAGIC) {
     65  1.1  christos 		fprintf(stderr, "%s:eMrwlock_write_enter(%p): bad magic: %#x\n",
     66  1.1  christos 			rw->eMrw_owner, rw, rw->eMrw_magic);
     67  1.1  christos 		abort();
     68  1.1  christos 	}
     69  1.1  christos 	if (rw->eMrw_read != 0 || rw->eMrw_write != 1) {
     70  1.1  christos 		fprintf(stderr,
     71  1.1  christos 			"%s:eMrwlock_write_enter(%p): already locked: %d/%d\n",
     72  1.1  christos 			rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
     73  1.1  christos 		abort();
     74  1.1  christos 	}
     75  1.1  christos 	rw->eMrw_write--;
     76  1.1  christos 	rw->eMrw_read++;
     77  1.1  christos 	rw->eMrw_heldin = file;
     78  1.1  christos 	rw->eMrw_heldat = line;
     79  1.1  christos }
     80  1.1  christos 
     81  1.1  christos 
     82  1.1  christos void eMrwlock_exit(rw)
     83  1.1  christos 	eMrwlock_t *rw;
     84  1.1  christos {
     85  1.1  christos 	if (rw->eMrw_magic != EMM_MAGIC) {
     86  1.1  christos 		fprintf(stderr, "%s:eMrwlock_exit(%p): bad magic: %#x\n",
     87  1.1  christos 			rw->eMrw_owner, rw, rw->eMrw_magic);
     88  1.1  christos 		abort();
     89  1.1  christos 	}
     90  1.1  christos 	if (rw->eMrw_read != 1 && rw->eMrw_write != 1) {
     91  1.1  christos 		fprintf(stderr, "%s:eMrwlock_exit(%p): not locked: %d/%d\n",
     92  1.1  christos 			rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write);
     93  1.1  christos 		abort();
     94  1.1  christos 	}
     95  1.1  christos 	if (rw->eMrw_read == 1)
     96  1.1  christos 		rw->eMrw_read--;
     97  1.1  christos 	else if (rw->eMrw_write == 1)
     98  1.1  christos 		rw->eMrw_write--;
     99  1.1  christos 	rw->eMrw_heldin = NULL;
    100  1.1  christos 	rw->eMrw_heldat = 0;
    101  1.1  christos }
    102  1.1  christos 
    103  1.1  christos 
    104  1.1  christos static int initcount = 0;
    105  1.1  christos 
    106  1.1  christos void eMrwlock_init(rw, who)
    107  1.1  christos 	eMrwlock_t *rw;
    108  1.1  christos 	char *who;
    109  1.1  christos {
    110  1.1  christos 	if (rw->eMrw_magic == EMM_MAGIC) {	/* safe bet ? */
    111  1.1  christos 		fprintf(stderr,
    112  1.1  christos 			"%s:eMrwlock_init(%p): already initialised?: %#x\n",
    113  1.1  christos 			rw->eMrw_owner, rw, rw->eMrw_magic);
    114  1.1  christos 		abort();
    115  1.1  christos 	}
    116  1.1  christos 	rw->eMrw_magic = EMM_MAGIC;
    117  1.1  christos 	rw->eMrw_read = 0;
    118  1.1  christos 	rw->eMrw_write = 0;
    119  1.1  christos 	if (who != NULL)
    120  1.1  christos 		rw->eMrw_owner = strdup(who);
    121  1.1  christos 	else
    122  1.1  christos 		rw->eMrw_owner = NULL;
    123  1.1  christos 	initcount++;
    124  1.1  christos }
    125  1.1  christos 
    126  1.1  christos 
    127  1.1  christos void eMrwlock_destroy(rw)
    128  1.1  christos 	eMrwlock_t *rw;
    129  1.1  christos {
    130  1.1  christos 	if (rw->eMrw_magic != EMM_MAGIC) {
    131  1.1  christos 		fprintf(stderr, "%s:eMrwlock_destroy(%p): bad magic: %#x\n",
    132  1.1  christos 			rw->eMrw_owner, rw, rw->eMrw_magic);
    133  1.1  christos 		abort();
    134  1.1  christos 	}
    135  1.1  christos 	if (rw->eMrw_owner != NULL)
    136  1.1  christos 		free(rw->eMrw_owner);
    137  1.1  christos 	memset(rw, 0xa5, sizeof(*rw));
    138  1.1  christos 	initcount--;
    139  1.1  christos }
    140  1.1  christos 
    141  1.1  christos void ipf_rwlock_clean()
    142  1.1  christos {
    143  1.1  christos 	if (initcount != 0)
    144  1.1  christos 		abort();
    145  1.1  christos }
    146