diff options
author | Dirk Engling <erdgeist@erdgeist.org> | 2021-04-19 22:12:50 +0200 |
---|---|---|
committer | Dirk Engling <erdgeist@erdgeist.org> | 2021-04-19 22:12:50 +0200 |
commit | fde79836e6ebb339f67f99768b5b75dde619779e (patch) | |
tree | 46e30189243ed2c0c1cc07a93ec23bda383fb1f9 /ot_accesslist.c | |
parent | 7c905ba729f78b71a77be198a5c9680ce3644367 (diff) |
Try accessing the access lists without locks by making the replacement process as atomic as possible.
Diffstat (limited to 'ot_accesslist.c')
-rw-r--r-- | ot_accesslist.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/ot_accesslist.c b/ot_accesslist.c index cdb964d..12bd29e 100644 --- a/ot_accesslist.c +++ b/ot_accesslist.c | |||
@@ -35,7 +35,7 @@ static int vector_compare_hash(const void *hash1, const void *hash2 ) { | |||
35 | 35 | ||
36 | /* Read initial access list */ | 36 | /* Read initial access list */ |
37 | static void accesslist_readfile( void ) { | 37 | static void accesslist_readfile( void ) { |
38 | ot_hash *info_hash, *accesslist_new = NULL; | 38 | ot_hash *info_hash, *accesslist_new = NULL, *accesslist_old; |
39 | char *map, *map_end, *read_offs; | 39 | char *map, *map_end, *read_offs; |
40 | size_t maplen; | 40 | size_t maplen; |
41 | 41 | ||
@@ -90,19 +90,19 @@ static void accesslist_readfile( void ) { | |||
90 | 90 | ||
91 | /* Now exchange the accesslist vector in the least race condition prone way */ | 91 | /* Now exchange the accesslist vector in the least race condition prone way */ |
92 | pthread_mutex_lock(&g_accesslist_mutex); | 92 | pthread_mutex_lock(&g_accesslist_mutex); |
93 | free( g_accesslist ); | 93 | |
94 | g_accesslist = accesslist_new; | 94 | accesslist_old = g_accesslist; /* Keep a copy for later free */ |
95 | g_accesslist_size = info_hash - accesslist_new; | 95 | g_accesslist_size = 0; /* Set size to 0 to prevent clients from searching through uninitialised memory */ |
96 | g_accesslist = accesslist_new; /* Only now set a new list */ | ||
97 | g_accesslist_size = info_hash - accesslist_new; /* And finally store it's size */ | ||
98 | free(g_accesslist_old); /* If new list is active, the old one can be destroyed */ | ||
96 | pthread_mutex_unlock(&g_accesslist_mutex); | 99 | pthread_mutex_unlock(&g_accesslist_mutex); |
97 | } | 100 | } |
98 | 101 | ||
99 | int accesslist_hashisvalid( ot_hash hash ) { | 102 | int accesslist_hashisvalid( ot_hash hash ) { |
100 | void *exactmatch; | 103 | void *exactmatch; |
101 | 104 | ||
102 | /* Lock should hardly ever be contended */ | ||
103 | pthread_mutex_lock(&g_accesslist_mutex); | ||
104 | exactmatch = bsearch( hash, g_accesslist, g_accesslist_size, OT_HASH_COMPARE_SIZE, vector_compare_hash ); | 105 | exactmatch = bsearch( hash, g_accesslist, g_accesslist_size, OT_HASH_COMPARE_SIZE, vector_compare_hash ); |
105 | pthread_mutex_unlock(&g_accesslist_mutex); | ||
106 | 106 | ||
107 | #ifdef WANT_ACCESSLIST_BLACK | 107 | #ifdef WANT_ACCESSLIST_BLACK |
108 | return exactmatch == NULL; | 108 | return exactmatch == NULL; |