aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2024-06-20 18:29:24 -0400
committerTest_User <hax@andrewyu.org>2024-06-20 18:29:24 -0400
commitef6f87193ab6628a2366b004a21c5cb21304c663 (patch)
tree8406b6c90f6f4a65ac19360e4fbc640779b52aa5
parent6a858830eb5ab1c8cd78e502471f88333b9bcca5 (diff)
downloadhaxircd-ef6f87193ab6628a2366b004a21c5cb21304c663.tar.gz
haxircd-ef6f87193ab6628a2366b004a21c5cb21304c663.zip
Seperate futex fom atomics
-rw-r--r--Makefile13
-rw-r--r--mutex.h10
-rw-r--r--networks/openssl_buffered.c28
-rw-r--r--networks/plaintext_buffered.c28
4 files changed, 41 insertions, 38 deletions
diff --git a/Makefile b/Makefile
index 4994a14..ff77124 100644
--- a/Makefile
+++ b/Makefile
@@ -50,6 +50,7 @@ LDFLAGS = -lpthread
printf '%s\n' 'LAST_HAXSERV_PSEUDOCLIENT = $(HAXSERV_PSEUDOCLIENT)' >> .makeopts
printf '%s\n' 'LAST_SAFE_STACK = $(SAFE_STACK)' >> .makeopts
printf '%s\n' 'LAST_FUTEX = $(FUTEX)' >> .makeopts
+ printf '%s\n' 'LAST_ATOMICS = $(ATOMICS)' >> .makeopts
printf '%s\n' 'LAST_CFLAGS = $(ORIGINAL_CFLAGS)' >> .makeopts
printf '%s\n' 'LAST_CC = $(CC)' >> .makeopts
@@ -213,6 +214,14 @@ else
FUTEX := $(LAST_FUTEX)
endif
+ifneq ($(ATOMICS),)
+ifneq ($(ATOMICS),$(LAST_ATOMICS))
+rebuild = 1
+endif
+else
+ATOMICS := $(LAST_ATOMICS)
+endif
+
ifeq ($(rebuild),1)
.PHONY: .makeopts
endif
@@ -390,6 +399,10 @@ ifeq ($(FUTEX),1)
CFLAGS += -DUSE_FUTEX
endif
+ifeq ($(ATOMICS),1)
+CFLAGS += -DUSE_ATOMICS
+endif
+
ifeq ($(SAFE_STACK),1)
diff --git a/mutex.h b/mutex.h
index 4e42dab..fd513eb 100644
--- a/mutex.h
+++ b/mutex.h
@@ -42,11 +42,15 @@ inline int mutex_init(uint32_t *futex) {
}
inline void mutex_lock(uint32_t *futex) {
- if (__sync_fetch_and_or(futex, 0x1) == 0)
- return;
+ do {
+ if (__sync_fetch_and_or(futex, 0x1) == 0)
+ return;
+
+ if (__sync_fetch_and_or(futex, 0x3) == 0)
+ return;
- while (__sync_fetch_and_or(futex, 0x3) != 0)
syscall(SYS_futex, futex, FUTEX_PRIVATE_FLAG | FUTEX_WAIT, 3, 0, 0, 0);
+ } while (1);
}
inline void mutex_unlock(uint32_t *futex) {
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