net: socketpair to use ring_buffer instead of k_pipe

Replaced the k_pipe-based implementation in sockpair with ring_buffer
based implementation instead.
The move to ring_buffer is done to avoid overhead of k_pipe and to align
with the new k_pipe API.
This does not pose any added risk to concurrency as the read and write
functions are protected by semaphores for both spairs.

Signed-off-by: Måns Ansgariusson <Mansgariusson@gmail.com>
This commit is contained in:
Måns Ansgariusson 2024-12-31 17:20:05 +01:00 committed by Benjamin Cabé
commit c39291b7f0
2 changed files with 6 additions and 13 deletions

View file

@ -324,7 +324,6 @@ config NET_SOCKETS_CAN_RECEIVERS
config NET_SOCKETPAIR config NET_SOCKETPAIR
bool "Support for socketpair" bool "Support for socketpair"
select PIPES
help help
Communicate over a pair of connected, unnamed UNIX domain sockets. Communicate over a pair of connected, unnamed UNIX domain sockets.

View file

@ -47,7 +47,7 @@ __net_socket struct spair {
int remote; /**< the remote endpoint file descriptor */ int remote; /**< the remote endpoint file descriptor */
uint32_t flags; /**< status and option bits */ uint32_t flags; /**< status and option bits */
struct k_sem sem; /**< semaphore for exclusive structure access */ struct k_sem sem; /**< semaphore for exclusive structure access */
struct k_pipe recv_q; /**< receive queue of local endpoint */ struct ring_buf recv_q;
/** indicates local @a recv_q isn't empty */ /** indicates local @a recv_q isn't empty */
struct k_poll_signal readable; struct k_poll_signal readable;
/** indicates local @a recv_q isn't full */ /** indicates local @a recv_q isn't full */
@ -106,7 +106,7 @@ static inline size_t spair_write_avail(struct spair *spair)
return 0; return 0;
} }
return k_pipe_write_avail(&remote->recv_q); return ring_buf_space_get(&remote->recv_q);
} }
/** /**
@ -117,7 +117,7 @@ static inline size_t spair_write_avail(struct spair *spair)
*/ */
static inline size_t spair_read_avail(struct spair *spair) static inline size_t spair_read_avail(struct spair *spair)
{ {
return k_pipe_read_avail(&spair->recv_q); return ring_buf_size_get(&spair->recv_q);
} }
/** Swap two 32-bit integers */ /** Swap two 32-bit integers */
@ -250,7 +250,7 @@ static struct spair *spair_new(void)
spair->flags = SPAIR_FLAGS_DEFAULT; spair->flags = SPAIR_FLAGS_DEFAULT;
k_sem_init(&spair->sem, 1, 1); k_sem_init(&spair->sem, 1, 1);
k_pipe_init(&spair->recv_q, spair->buf, sizeof(spair->buf)); ring_buf_init(&spair->recv_q, sizeof(spair->buf), spair->buf);
k_poll_signal_init(&spair->readable); k_poll_signal_init(&spair->readable);
k_poll_signal_init(&spair->writeable); k_poll_signal_init(&spair->writeable);
@ -550,10 +550,7 @@ static ssize_t spair_write(void *obj, const void *buffer, size_t count)
} }
} }
res = k_pipe_put(&remote->recv_q, (void *)buffer, count, bytes_written = ring_buf_put(&remote->recv_q, (void *)buffer, count);
&bytes_written, 1, K_NO_WAIT);
__ASSERT(res == 0, "k_pipe_put() failed: %d", res);
if (spair_write_avail(spair) == 0) { if (spair_write_avail(spair) == 0) {
k_poll_signal_reset(&remote->writeable); k_poll_signal_reset(&remote->writeable);
} }
@ -724,10 +721,7 @@ static ssize_t spair_read(void *obj, void *buffer, size_t count)
} }
} }
res = k_pipe_get(&spair->recv_q, (void *)buffer, count, &bytes_read, bytes_read = ring_buf_get(&spair->recv_q, (void *)buffer, count);
1, K_NO_WAIT);
__ASSERT(res == 0, "k_pipe_get() failed: %d", res);
if (spair_read_avail(spair) == 0 && !sock_is_eof(spair)) { if (spair_read_avail(spair) == 0 && !sock_is_eof(spair)) {
k_poll_signal_reset(&spair->readable); k_poll_signal_reset(&spair->readable);
} }