Home | History | Annotate | Line # | Download | only in lib
rwlock_emul.c revision 1.1.1.2
      1      1.1  christos /*	$NetBSD: rwlock_emul.c,v 1.1.1.2 2012/07/22 13:44:42 darrenr 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.1.2   darrenr  * $Id: rwlock_emul.c,v 1.1.1.2 2012/07/22 13:44:42 darrenr Exp $
      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