From ef6f87193ab6628a2366b004a21c5cb21304c663 Mon Sep 17 00:00:00 2001 From: Test_User Date: Thu, 20 Jun 2024 18:29:24 -0400 Subject: Seperate futex fom atomics --- networks/openssl_buffered.c | 28 +++++++++++----------------- networks/plaintext_buffered.c | 28 ++++++++++------------------ 2 files changed, 21 insertions(+), 35 deletions(-) (limited to 'networks') diff --git a/networks/openssl_buffered.c b/networks/openssl_buffered.c index 87d20a5..07714d4 100644 --- a/networks/openssl_buffered.c +++ b/networks/openssl_buffered.c @@ -91,12 +91,12 @@ void * openssl_buffered_send_thread(void *handle) { size_t read_buffer_index = 0; size_t len = 0; while (1) { -#ifdef USE_FUTEX +#ifdef USE_ATOMICS #else mutex_lock(&(info->mutex)); #endif -#ifdef USE_FUTEX +#ifdef USE_ATOMICS len = __sync_sub_and_fetch(&(info->buffer_len), len); #else info->buffer_len -= len; @@ -110,11 +110,9 @@ void * openssl_buffered_send_thread(void *handle) { sem_post(&(info->release_write)); #endif -#ifdef USE_FUTEX - if (!__sync_fetch_and_or(&(info->valid), 0)) { - mutex_lock(&(info->mutex)); - goto openssl_buffered_send_thread_error_unlock; - } +#ifdef USE_ATOMICS + if (!__sync_fetch_and_or(&(info->valid), 0)) + goto openssl_buffered_send_thread_error; #else if (!info->valid) goto openssl_buffered_send_thread_error_unlock; @@ -227,14 +225,10 @@ void * openssl_buffered_send_thread(void *handle) { int openssl_buffered_send(void *handle, struct string msg) { struct openssl_buffered_handle *openssl_handle = handle; while (msg.len > 0) { -#ifdef USE_FUTEX -#else - mutex_lock(&(openssl_handle->mutex)); -#endif - -#ifdef USE_FUTEX +#ifdef USE_ATOMICS size_t len = OPENSSL_BUFFERED_LEN - __sync_fetch_and_or(&(openssl_handle->buffer_len), 0); #else + mutex_lock(&(openssl_handle->mutex)); size_t len = OPENSSL_BUFFERED_LEN - openssl_handle->buffer_len; #endif @@ -244,7 +238,7 @@ int openssl_buffered_send(void *handle, struct string msg) { if (len > OPENSSL_BUFFERED_LEN - openssl_handle->write_buffer_index) len = OPENSSL_BUFFERED_LEN - openssl_handle->write_buffer_index; -#ifdef USE_FUTEX +#ifdef USE_ATOMICS if (!__sync_fetch_and_or(&(openssl_handle->valid), 0)) return 1; #else @@ -268,17 +262,17 @@ int openssl_buffered_send(void *handle, struct string msg) { #endif memcpy(&(openssl_handle->buffer[openssl_handle->write_buffer_index]), msg.data, len); -#ifdef USE_FUTEX +#ifdef USE_ATOMICS __sync_fetch_and_add(&(openssl_handle->buffer_len), len); #else openssl_handle->buffer_len += len; + + mutex_unlock(&(openssl_handle->mutex)); #endif #ifdef USE_FUTEX mutex_unlock(&(openssl_handle->release_read)); #else - mutex_unlock(&(openssl_handle->mutex)); - sem_trywait(&(openssl_handle->release_read)); sem_post(&(openssl_handle->release_read)); #endif diff --git a/networks/plaintext_buffered.c b/networks/plaintext_buffered.c index 6ff5718..33bface 100644 --- a/networks/plaintext_buffered.c +++ b/networks/plaintext_buffered.c @@ -75,17 +75,13 @@ void * plaintext_buffered_send_thread(void *handle) { size_t read_buffer_index = 0; ssize_t res = 0; while (1) { -#ifdef USE_FUTEX +#ifdef USE_ATOMICS + size_t len = __sync_sub_and_fetch(&(info->buffer_len), (size_t)res); #else mutex_lock(&(info->mutex)); -#endif - size_t len; -#ifdef USE_FUTEX - len = __sync_sub_and_fetch(&(info->buffer_len), (size_t)res); -#else info->buffer_len -= (size_t)res; - len = info->buffer_len; + size_t len = info->buffer_len; #endif #ifdef USE_FUTEX @@ -95,7 +91,7 @@ void * plaintext_buffered_send_thread(void *handle) { sem_post(&(info->release_write)); #endif -#ifdef USE_FUTEX +#ifdef USE_ATOMICS if (!__sync_fetch_and_or(&(info->valid), 0)) { // TODO: Clean up mutexes in exit code too mutex_lock(&(info->mutex)); goto plaintext_buffered_send_thread_error_unlock; @@ -183,14 +179,10 @@ void * plaintext_buffered_send_thread(void *handle) { int plaintext_buffered_send(void *handle, struct string msg) { struct plaintext_buffered_handle *plaintext_handle = handle; while (msg.len > 0) { -#ifdef USE_FUTEX -#else - mutex_lock(&(plaintext_handle->mutex)); -#endif - -#ifdef USE_FUTEX +#ifdef USE_ATOMICS size_t len = PLAINTEXT_BUFFERED_LEN - __sync_fetch_and_or(&(plaintext_handle->buffer_len), 0); // There's no fetch-only for __sync #else + mutex_lock(&(plaintext_handle->mutex)); size_t len = PLAINTEXT_BUFFERED_LEN - plaintext_handle->buffer_len; #endif @@ -200,7 +192,7 @@ int plaintext_buffered_send(void *handle, struct string msg) { if (len > PLAINTEXT_BUFFERED_LEN - plaintext_handle->write_buffer_index) len = PLAINTEXT_BUFFERED_LEN - plaintext_handle->write_buffer_index; -#ifdef USE_FUTEX +#ifdef USE_ATOMICS if (!__sync_fetch_and_or(&(plaintext_handle->valid), 0)) return 1; #else @@ -224,17 +216,17 @@ int plaintext_buffered_send(void *handle, struct string msg) { #endif memcpy(&(plaintext_handle->buffer[plaintext_handle->write_buffer_index]), msg.data, len); -#ifdef USE_FUTEX +#ifdef USE_ATOMICS __sync_fetch_and_add(&(plaintext_handle->buffer_len), len); // No __sync add-only either #else plaintext_handle->buffer_len += len; + + mutex_unlock(&(plaintext_handle->mutex)); #endif #ifdef USE_FUTEX mutex_unlock(&(plaintext_handle->release_read)); #else - mutex_unlock(&(plaintext_handle->mutex)); - sem_trywait(&(plaintext_handle->release_read)); sem_post(&(plaintext_handle->release_read)); #endif -- cgit v1.2.3