1 1.2 darrenr /* $NetBSD: rwlock_emul.c,v 1.2 2012/07/22 14:27:37 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.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