diff options
author | Test_User <hax@andrewyu.org> | 2024-06-19 08:48:20 -0400 |
---|---|---|
committer | Test_User <hax@andrewyu.org> | 2024-06-19 08:48:20 -0400 |
commit | ab45d828cea484f72ec8573a29524894eb9b24ac (patch) | |
tree | d96114631cd6d9054ca65d76a3dda32a016e7a03 | |
parent | c3d40c8d4671c59414c737b00cc55eb5d44992c9 (diff) | |
download | haxircd-ab45d828cea484f72ec8573a29524894eb9b24ac.tar.gz haxircd-ab45d828cea484f72ec8573a29524894eb9b24ac.zip |
Mark futexes as private since it's all same-process, fix timeout on plaintext connections
-rw-r--r-- | mutex.h | 4 | ||||
-rw-r--r-- | networks/plaintext.c | 9 | ||||
-rw-r--r-- | networks/plaintext_buffered.c | 11 |
3 files changed, 21 insertions, 3 deletions
@@ -44,12 +44,12 @@ inline int mutex_init(uint32_t *futex) { inline void mutex_lock(uint32_t *futex) { uint32_t val; while ((val = __sync_lock_test_and_set(futex, 1))) - syscall(SYS_futex, futex, FUTEX_WAIT, val, 0, 0, 0); + syscall(SYS_futex, futex, FUTEX_PRIVATE_FLAG | FUTEX_WAIT, val, 0, 0, 0); } inline void mutex_unlock(uint32_t *futex) { __sync_lock_release(futex); - syscall(SYS_futex, futex, FUTEX_WAKE, 1, 0, 0, 0); + syscall(SYS_futex, futex, FUTEX_PRIVATE_FLAG | FUTEX_WAKE, 1, 0, 0, 0); } inline void mutex_destroy(uint32_t *futex) { diff --git a/networks/plaintext.c b/networks/plaintext.c index 4279f8c..7914b9e 100644 --- a/networks/plaintext.c +++ b/networks/plaintext.c @@ -143,6 +143,15 @@ int plaintext_accept(int listen_fd, void **handle, struct string *addr) { if (con_fd == -1) return -1; + { + struct timeval timeout = { + .tv_sec = PING_INTERVAL, + .tv_usec = 0, + }; + + setsockopt(con_fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + } + addr->data = malloc(address_len); if (addr->data == 0 && address_len != 0) { close(con_fd); diff --git a/networks/plaintext_buffered.c b/networks/plaintext_buffered.c index 6f5016c..73a7803 100644 --- a/networks/plaintext_buffered.c +++ b/networks/plaintext_buffered.c @@ -114,7 +114,7 @@ void * plaintext_buffered_send_thread(void *handle) { ssize_t res; do { res = send(info->fd, &(info->buffer[read_buffer_index]), len, 0); - } while (res == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK || errno == ETIMEDOUT)); + } while (res == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); if (res < 0) goto plaintext_buffered_send_thread_error; @@ -333,6 +333,15 @@ int plaintext_buffered_accept(int listen_fd, void **handle, struct string *addr) if (con_fd == -1) return -1; + { + struct timeval timeout = { + .tv_sec = PING_INTERVAL, + .tv_usec = 0, + }; + + setsockopt(con_fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + } + struct plaintext_buffered_handle *plaintext_handle = malloc(sizeof(*plaintext_handle)); if (!plaintext_handle) goto plaintext_buffered_accept_close; |