aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2024-06-18 16:09:30 -0400
committerTest_User <hax@andrewyu.org>2024-06-18 16:09:30 -0400
commit9cd7fa33426d7b9823b3d0c29fff27fc063db4b0 (patch)
treecceb99931e2fe02ff599501123dff67826465f9c
parentadced03b24272f31f5d7dc8764c8ca7fc7821c7e (diff)
downloadhaxircd-9cd7fa33426d7b9823b3d0c29fff27fc063db4b0.tar.gz
haxircd-9cd7fa33426d7b9823b3d0c29fff27fc063db4b0.zip
More futexes, so it actually works decently now... still no pthread mutex support here though
-rw-r--r--networks/plaintext_buffered.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/networks/plaintext_buffered.c b/networks/plaintext_buffered.c
index 2fc1e3a..dc40ad3 100644
--- a/networks/plaintext_buffered.c
+++ b/networks/plaintext_buffered.c
@@ -47,6 +47,7 @@ struct plaintext_buffered_handle {
MUTEX_TYPE mutex;
#ifdef USE_FUTEX
MUTEX_TYPE release_read;
+ MUTEX_TYPE release_write;
#endif
int fd;
char valid;
@@ -65,19 +66,22 @@ void * plaintext_buffered_send_thread(void *handle) {
size_t len;
len = info->buffer_len;
- if (!info->valid)
- goto plaintext_buffered_send_thread_error_unlock;
-
#ifdef USE_FUTEX
- info->release_read = (len == 0);
+ if (len == 0)
+ info->release_read = 1;
+ mutex_unlock(&(info->release_write));
#endif
+ if (!info->valid)
+ goto plaintext_buffered_send_thread_error_unlock;
+
mutex_unlock(&(info->mutex));
#ifdef USE_FUTEX
- mutex_lock(&(info->release_read));
- if (len == 0)
+ if (len == 0) {
+ mutex_lock(&(info->release_read));
continue;
+ }
#endif
if (read_buffer_index + len > PLAINTEXT_BUFFERED_LEN)
@@ -112,6 +116,13 @@ void * plaintext_buffered_send_thread(void *handle) {
mutex_destroy(&(info->mutex));
free(info);
return 0;
+ } else {
+#ifdef USE_FUTEX
+ info->release_read = 1;
+ mutex_unlock(&(info->mutex));
+ mutex_lock(&(info->release_read));
+ continue;
+#endif
}
mutex_unlock(&(info->mutex));
}
@@ -134,6 +145,14 @@ int plaintext_buffered_send(void *handle, struct string msg) {
return 1;
if (len > PLAINTEXT_BUFFERED_LEN - plaintext_handle->buffer_len)
len = PLAINTEXT_BUFFERED_LEN - plaintext_handle->buffer_len;
+#ifdef USE_FUTEX
+ if (len == 0) {
+ plaintext_handle->release_write = 1;
+ mutex_unlock(&(plaintext_handle->mutex));
+ mutex_lock(&(plaintext_handle->release_write));
+ continue;
+ }
+#endif
memcpy(&(plaintext_handle->buffer[plaintext_handle->write_buffer_index]), msg.data, len);
plaintext_handle->write_buffer_index += len;
if (plaintext_handle->write_buffer_index >= PLAINTEXT_BUFFERED_LEN)