X-Git-Url: http://git.liburcu.org/?p=userspace-rcu.git;a=blobdiff_plain;f=urcu-bp.c;h=9c7da3d8d235355246de95dfb5de87c8dcc1fec8;hp=22e17ccdd0a81eafe3b49917bb610f10a5e2ac3c;hb=5f6503c78ee929cd77d6e51987b5826de5a5fe99;hpb=d3ac5bb7c43cbe5412a4e3a13692ec7a90b9fbbb diff --git a/urcu-bp.c b/urcu-bp.c index 22e17cc..9c7da3d 100644 --- a/urcu-bp.c +++ b/urcu-bp.c @@ -373,7 +373,8 @@ void expand_arena(struct registry_arena *arena) sizeof(struct registry_chunk) + sizeof(struct rcu_reader)); new_chunk_len = ARENA_INIT_ALLOC; - new_chunk = mmap(NULL, new_chunk_len, + new_chunk = (struct registry_chunk *) mmap(NULL, + new_chunk_len, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); @@ -407,7 +408,8 @@ void expand_arena(struct registry_arena *arena) } /* Remap did not succeed, we need to add a new chunk. */ - new_chunk = mmap(NULL, new_chunk_len, + new_chunk = (struct registry_chunk *) mmap(NULL, + new_chunk_len, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); @@ -579,6 +581,17 @@ void urcu_bp_thread_exit_notifier(void *rcu_key) rcu_bp_unregister(rcu_key); } +static +void rcu_sys_membarrier_status(int available) +{ + /* + * membarrier has blocking behavior, which changes the + * application behavior too much compared to using barriers when + * synchronize_rcu is used repeatedly (without using call_rcu). + * Don't use membarrier for now. + */ +} + static void rcu_bp_init(void) { @@ -591,9 +604,8 @@ void rcu_bp_init(void) if (ret) abort(); ret = membarrier(MEMBARRIER_CMD_QUERY, 0); - if (ret >= 0 && (ret & MEMBARRIER_CMD_SHARED)) { - urcu_bp_has_sys_membarrier = 1; - } + rcu_sys_membarrier_status(ret >= 0 + && (ret & MEMBARRIER_CMD_SHARED)); initialized = 1; } mutex_unlock(&init_lock); @@ -609,9 +621,10 @@ void rcu_bp_exit(void) cds_list_for_each_entry_safe(chunk, tmp, ®istry_arena.chunk_list, node) { - munmap(chunk, chunk->data_len + munmap((void *) chunk, chunk->data_len + sizeof(struct registry_chunk)); } + CDS_INIT_LIST_HEAD(®istry_arena.chunk_list); ret = pthread_key_delete(urcu_bp_key); if (ret) abort();