diff options
author | dimitri staessens <[email protected]> | 2017-03-30 08:06:52 +0000 |
---|---|---|
committer | Sander Vrijders <[email protected]> | 2017-03-30 08:06:52 +0000 |
commit | b2610a681dde939db5eabd22ccdb71aecf76a825 (patch) | |
tree | dda4c54850fbe23bd859f186dfe33787526aa6b9 /src/lib | |
parent | a167185b7fe6a459a46cb71214caf37fb0c21fa8 (diff) | |
parent | 0a9c02d4aa581a397d17b96199eca14c8b137371 (diff) | |
download | ouroboros-b2610a681dde939db5eabd22ccdb71aecf76a825.tar.gz ouroboros-b2610a681dde939db5eabd22ccdb71aecf76a825.zip |
Merged in dstaesse/ouroboros/be-less-locks (pull request #435)
lib: Reduce locking overhead in rdrbuff
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/shm_rdrbuff.c | 65 |
1 files changed, 20 insertions, 45 deletions
diff --git a/src/lib/shm_rdrbuff.c b/src/lib/shm_rdrbuff.c index 0976c4bd..b8d73650 100644 --- a/src/lib/shm_rdrbuff.c +++ b/src/lib/shm_rdrbuff.c @@ -376,9 +376,17 @@ ssize_t shm_rdrbuff_write(struct shm_rdrbuff * rdrb, *rdrb->head = 0; } #endif - sdb = get_head_ptr(rdrb); + sdb = get_head_ptr(rdrb); + sdb->flags = SDB_VALID; + sdb->idx = *rdrb->head; +#ifdef SHM_RDRB_MULTI_BLOCK + *rdrb->head = (*rdrb->head + blocks) & ((SHM_BUFFER_SIZE) - 1); +#else + *rdrb->head = (*rdrb->head + 1) & ((SHM_BUFFER_SIZE) - 1); +#endif + pthread_mutex_unlock(rdrb->lock); + sdb->size = size; - sdb->flags = SDB_VALID; sdb->du_head = headspace; sdb->du_tail = sdb->du_head + len; #ifdef SHM_RDRB_MULTI_BLOCK @@ -386,14 +394,6 @@ ssize_t shm_rdrbuff_write(struct shm_rdrbuff * rdrb, #endif memcpy(((uint8_t *) (sdb + 1)) + headspace, data, len); - sdb->idx = *rdrb->head; -#ifdef SHM_RDRB_MULTI_BLOCK - *rdrb->head = (*rdrb->head + blocks) & ((SHM_BUFFER_SIZE) - 1); -#else - *rdrb->head = (*rdrb->head + 1) & ((SHM_BUFFER_SIZE) - 1); -#endif - pthread_mutex_unlock(rdrb->lock); - return sdb->idx; } @@ -457,9 +457,17 @@ ssize_t shm_rdrbuff_write_b(struct shm_rdrbuff * rdrb, *rdrb->head = 0; } #endif - sdb = get_head_ptr(rdrb); + sdb = get_head_ptr(rdrb); + sdb->flags = SDB_VALID; + sdb->idx = *rdrb->head; +#ifdef SHM_RDRB_MULTI_BLOCK + *rdrb->head = (*rdrb->head + blocks) & ((SHM_BUFFER_SIZE) - 1); +#else + *rdrb->head = (*rdrb->head + 1) & ((SHM_BUFFER_SIZE) - 1); +#endif + pthread_cleanup_pop(true); + sdb->size = size; - sdb->flags = SDB_VALID; sdb->du_head = headspace; sdb->du_tail = sdb->du_head + len; #ifdef SHM_RDRB_MULTI_BLOCK @@ -467,13 +475,6 @@ ssize_t shm_rdrbuff_write_b(struct shm_rdrbuff * rdrb, #endif memcpy(((uint8_t *) (sdb + 1)) + headspace, data, len); - sdb->idx = *rdrb->head; -#ifdef SHM_RDRB_MULTI_BLOCK - *rdrb->head = (*rdrb->head + blocks) & ((SHM_BUFFER_SIZE) - 1); -#else - *rdrb->head = (*rdrb->head + 1) & ((SHM_BUFFER_SIZE) - 1); -#endif - pthread_cleanup_pop(true); return sdb->idx; } @@ -489,23 +490,10 @@ ssize_t shm_rdrbuff_read(uint8_t ** dst, assert(rdrb); assert(idx < (SHM_BUFFER_SIZE)); -#ifdef __APPLE__ - pthread_mutex_lock(rdrb->lock); -#else - if (pthread_mutex_lock(rdrb->lock) == EOWNERDEAD) - pthread_mutex_consistent(rdrb->lock); -#endif - if (shm_rdrb_empty(rdrb)) { - pthread_mutex_unlock(rdrb->lock); - return -1; - } - sdb = idx_to_du_buff_ptr(rdrb, idx); len = (ssize_t) (sdb->du_tail - sdb->du_head); *dst = ((uint8_t *) (sdb + 1)) + sdb->du_head; - pthread_mutex_unlock(rdrb->lock); - return len; } @@ -516,21 +504,8 @@ struct shm_du_buff * shm_rdrbuff_get(struct shm_rdrbuff * rdrb, size_t idx) assert(rdrb); assert(idx < (SHM_BUFFER_SIZE)); -#ifdef __APPLE__ - pthread_mutex_lock(rdrb->lock); -#else - if (pthread_mutex_lock(rdrb->lock) == EOWNERDEAD) - pthread_mutex_consistent(rdrb->lock); -#endif - if (shm_rdrb_empty(rdrb)) { - pthread_mutex_unlock(rdrb->lock); - return NULL; - } - sdb = idx_to_du_buff_ptr(rdrb, idx); - pthread_mutex_unlock(rdrb->lock); - return sdb; } |