rwlock_emul.c revision 145519
1/* $FreeBSD: head/contrib/ipfilter/lib/rwlock_emul.c 145519 2005-04-25 18:20:15Z darrenr $ */ 2 3#include "ipf.h" 4 5#define EMM_MAGIC 0x97dd8b3a 6 7void eMrwlock_read_enter(rw, file, line) 8eMrwlock_t *rw; 9char *file; 10int line; 11{ 12 if (rw->eMrw_magic != EMM_MAGIC) { 13 fprintf(stderr, "%s:eMrwlock_read_enter(%p): bad magic: %#x\n", 14 rw->eMrw_owner, rw, rw->eMrw_magic); 15 abort(); 16 } 17 if (rw->eMrw_read != 0 || rw->eMrw_write != 0) { 18 fprintf(stderr, 19 "%s:eMrwlock_read_enter(%p): already locked: %d/%d\n", 20 rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write); 21 abort(); 22 } 23 rw->eMrw_read++; 24 rw->eMrw_heldin = file; 25 rw->eMrw_heldat = line; 26} 27 28 29void eMrwlock_write_enter(rw, file, line) 30eMrwlock_t *rw; 31char *file; 32int line; 33{ 34 if (rw->eMrw_magic != EMM_MAGIC) { 35 fprintf(stderr, "%s:eMrwlock_write_enter(%p): bad magic: %#x\n", 36 rw->eMrw_owner, rw, rw->eMrw_magic); 37 abort(); 38 } 39 if (rw->eMrw_read != 0 || rw->eMrw_write != 0) { 40 fprintf(stderr, 41 "%s:eMrwlock_write_enter(%p): already locked: %d/%d\n", 42 rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write); 43 abort(); 44 } 45 rw->eMrw_write++; 46 rw->eMrw_heldin = file; 47 rw->eMrw_heldat = line; 48} 49 50 51void eMrwlock_downgrade(rw, file, line) 52eMrwlock_t *rw; 53char *file; 54int line; 55{ 56 if (rw->eMrw_magic != EMM_MAGIC) { 57 fprintf(stderr, "%s:eMrwlock_write_enter(%p): bad magic: %#x\n", 58 rw->eMrw_owner, rw, rw->eMrw_magic); 59 abort(); 60 } 61 if (rw->eMrw_read != 0 || rw->eMrw_write != 1) { 62 fprintf(stderr, 63 "%s:eMrwlock_write_enter(%p): already locked: %d/%d\n", 64 rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write); 65 abort(); 66 } 67 rw->eMrw_write--; 68 rw->eMrw_read++; 69 rw->eMrw_heldin = file; 70 rw->eMrw_heldat = line; 71} 72 73 74void eMrwlock_exit(rw) 75eMrwlock_t *rw; 76{ 77 if (rw->eMrw_magic != EMM_MAGIC) { 78 fprintf(stderr, "%s:eMrwlock_exit(%p): bad magic: %#x\n", 79 rw->eMrw_owner, rw, rw->eMrw_magic); 80 abort(); 81 } 82 if (rw->eMrw_read != 1 && rw->eMrw_write != 1) { 83 fprintf(stderr, "%s:eMrwlock_exit(%p): not locked: %d/%d\n", 84 rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write); 85 abort(); 86 } 87 if (rw->eMrw_read == 1) 88 rw->eMrw_read--; 89 else if (rw->eMrw_write == 1) 90 rw->eMrw_write--; 91 rw->eMrw_heldin = NULL; 92 rw->eMrw_heldat = 0; 93} 94 95 96void eMrwlock_init(rw, who) 97eMrwlock_t *rw; 98char *who; 99{ 100 if (rw->eMrw_magic == EMM_MAGIC) { /* safe bet ? */ 101 fprintf(stderr, 102 "%s:eMrwlock_init(%p): already initialised?: %#x\n", 103 rw->eMrw_owner, rw, rw->eMrw_magic); 104 abort(); 105 } 106 rw->eMrw_magic = EMM_MAGIC; 107 rw->eMrw_read = 0; 108 rw->eMrw_write = 0; 109 if (who != NULL) 110 rw->eMrw_owner = strdup(who); 111 else 112 rw->eMrw_owner = NULL; 113} 114 115 116void eMrwlock_destroy(rw) 117eMrwlock_t *rw; 118{ 119 if (rw->eMrw_magic != EMM_MAGIC) { 120 fprintf(stderr, "%s:eMrwlock_destroy(%p): bad magic: %#x\n", 121 rw->eMrw_owner, rw, rw->eMrw_magic); 122 abort(); 123 } 124 memset(rw, 0xa5, sizeof(*rw)); 125} 126