From fe3006cd23baf55df902e20ee277b209248b2f19 Mon Sep 17 00:00:00 2001 From: Danny Povolotski Date: Thu, 14 Mar 2024 03:49:06 +0300 Subject: [PATCH 1/8] remove for loop from buffer read/write --- src/pshmbuffer.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/pshmbuffer.c b/src/pshmbuffer.c index 5b8372a..05c5f82 100644 --- a/src/pshmbuffer.c +++ b/src/pshmbuffer.c @@ -193,10 +193,18 @@ p_shm_buffer_read (PShmBuffer *buf, data_aval = pp_shm_buffer_get_used_space (buf); to_copy = (data_aval <= len) ? data_aval : len; - for (i = 0; i < to_copy; ++i) - memcpy ((pchar *) storage + i, - (pchar *) addr + P_SHM_BUFFER_DATA_OFFSET + ((read_pos + i) % buf->size), - 1); + int start_pos = P_SHM_BUFFER_DATA_OFFSET + (read_pos % buf->size); + + if (start_pos + to_copy <= P_SHM_BUFFER_DATA_OFFSET + buf->size) + { + memcpy((pchar*)storage, (pchar*)addr + start_pos, to_copy); + } + else + { + int first_part_size = P_SHM_BUFFER_DATA_OFFSET + buf->size - start_pos; + memcpy((pchar*)storage, (pchar*)addr + start_pos, first_part_size); + memcpy((pchar*)storage + first_part_size, (pchar*)addr, to_copy - first_part_size); + } read_pos = (read_pos + to_copy) % buf->size; memcpy ((pchar *) addr + P_SHM_BUFFER_READ_OFFSET, &read_pos, sizeof (read_pos)); @@ -247,10 +255,18 @@ p_shm_buffer_write (PShmBuffer *buf, return 0; } - for (i = 0; i < len; ++i) - memcpy ((pchar *) addr + P_SHM_BUFFER_DATA_OFFSET + ((write_pos + i) % buf->size), - (pchar *) data + i, - 1); + int start_pos = P_SHM_BUFFER_DATA_OFFSET + (write_pos % buf->size); + + if (start_pos + len <= P_SHM_BUFFER_DATA_OFFSET + buf->size) + { + memcpy((pchar*)addr + start_pos, (pchar*)data, len); + } + else + { + int first_part_size = P_SHM_BUFFER_DATA_OFFSET + buf->size - start_pos; + memcpy((pchar*)addr + start_pos, (pchar*)data, first_part_size); + memcpy((pchar*)addr, (pchar*)data + first_part_size, len - first_part_size); + } write_pos = (write_pos + len) % buf->size; memcpy ((pchar *) addr + P_SHM_BUFFER_WRITE_OFFSET, &write_pos, sizeof (write_pos)); From 899eb999f4a0fe73bf0ed397b73647969e9128bc Mon Sep 17 00:00:00 2001 From: Danny Povolotski Date: Thu, 14 Mar 2024 04:09:29 +0300 Subject: [PATCH 2/8] fix tests not passing --- src/pshmbuffer.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pshmbuffer.c b/src/pshmbuffer.c index 05c5f82..4db7170 100644 --- a/src/pshmbuffer.c +++ b/src/pshmbuffer.c @@ -193,7 +193,7 @@ p_shm_buffer_read (PShmBuffer *buf, data_aval = pp_shm_buffer_get_used_space (buf); to_copy = (data_aval <= len) ? data_aval : len; - int start_pos = P_SHM_BUFFER_DATA_OFFSET + (read_pos % buf->size); + int start_pos = P_SHM_BUFFER_DATA_OFFSET + (read_pos % buf->size); if (start_pos + to_copy <= P_SHM_BUFFER_DATA_OFFSET + buf->size) { @@ -201,9 +201,9 @@ p_shm_buffer_read (PShmBuffer *buf, } else { - int first_part_size = P_SHM_BUFFER_DATA_OFFSET + buf->size - start_pos; + int first_part_size = buf->size - start_pos; memcpy((pchar*)storage, (pchar*)addr + start_pos, first_part_size); - memcpy((pchar*)storage + first_part_size, (pchar*)addr, to_copy - first_part_size); + memcpy((pchar*)storage + first_part_size, (pchar*)addr + P_SHM_BUFFER_DATA_OFFSET, to_copy - first_part_size); } read_pos = (read_pos + to_copy) % buf->size; @@ -263,9 +263,9 @@ p_shm_buffer_write (PShmBuffer *buf, } else { - int first_part_size = P_SHM_BUFFER_DATA_OFFSET + buf->size - start_pos; + int first_part_size = buf->size - start_pos; memcpy((pchar*)addr + start_pos, (pchar*)data, first_part_size); - memcpy((pchar*)addr, (pchar*)data + first_part_size, len - first_part_size); + memcpy((pchar*)addr + P_SHM_BUFFER_DATA_OFFSET, (pchar*)data + first_part_size, len - first_part_size); } write_pos = (write_pos + len) % buf->size; From 6f674021a502808a85bb4ceee96945d210e63472 Mon Sep 17 00:00:00 2001 From: Danny Povolotski Date: Thu, 14 Mar 2024 04:13:07 +0300 Subject: [PATCH 3/8] actually fix tests this time --- src/pshmbuffer.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pshmbuffer.c b/src/pshmbuffer.c index 4db7170..4979f4f 100644 --- a/src/pshmbuffer.c +++ b/src/pshmbuffer.c @@ -193,16 +193,16 @@ p_shm_buffer_read (PShmBuffer *buf, data_aval = pp_shm_buffer_get_used_space (buf); to_copy = (data_aval <= len) ? data_aval : len; - int start_pos = P_SHM_BUFFER_DATA_OFFSET + (read_pos % buf->size); + int start_pos = read_pos % buf->size; - if (start_pos + to_copy <= P_SHM_BUFFER_DATA_OFFSET + buf->size) + if (start_pos + to_copy <= buf->size) { - memcpy((pchar*)storage, (pchar*)addr + start_pos, to_copy); + memcpy((pchar*)storage, (pchar*)addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, to_copy); } else { int first_part_size = buf->size - start_pos; - memcpy((pchar*)storage, (pchar*)addr + start_pos, first_part_size); + memcpy((pchar*)storage, (pchar*)addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, first_part_size); memcpy((pchar*)storage + first_part_size, (pchar*)addr + P_SHM_BUFFER_DATA_OFFSET, to_copy - first_part_size); } @@ -255,16 +255,16 @@ p_shm_buffer_write (PShmBuffer *buf, return 0; } - int start_pos = P_SHM_BUFFER_DATA_OFFSET + (write_pos % buf->size); + int start_pos = write_pos % buf->size; - if (start_pos + len <= P_SHM_BUFFER_DATA_OFFSET + buf->size) + if (start_pos + len <= buf->size) { - memcpy((pchar*)addr + start_pos, (pchar*)data, len); + memcpy((pchar*)addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, (pchar*)data, len); } else { int first_part_size = buf->size - start_pos; - memcpy((pchar*)addr + start_pos, (pchar*)data, first_part_size); + memcpy((pchar*)addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, (pchar*)data, first_part_size); memcpy((pchar*)addr + P_SHM_BUFFER_DATA_OFFSET, (pchar*)data + first_part_size, len - first_part_size); } From f6c37246c3b672b7d9e23b021aad579d07c11520 Mon Sep 17 00:00:00 2001 From: Danny Povolotski Date: Thu, 14 Mar 2024 04:20:38 +0300 Subject: [PATCH 4/8] remove minor code smell --- src/pshmbuffer.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pshmbuffer.c b/src/pshmbuffer.c index 4979f4f..073f149 100644 --- a/src/pshmbuffer.c +++ b/src/pshmbuffer.c @@ -158,7 +158,7 @@ p_shm_buffer_read (PShmBuffer *buf, psize write_pos; psize data_aval; psize to_copy; - puint i; + psize start_pos; ppointer addr; if (P_UNLIKELY (buf == NULL || storage == NULL || len == 0)) { @@ -193,7 +193,7 @@ p_shm_buffer_read (PShmBuffer *buf, data_aval = pp_shm_buffer_get_used_space (buf); to_copy = (data_aval <= len) ? data_aval : len; - int start_pos = read_pos % buf->size; + start_pos = read_pos % buf->size; if (start_pos + to_copy <= buf->size) { @@ -223,7 +223,7 @@ p_shm_buffer_write (PShmBuffer *buf, { psize read_pos; psize write_pos; - puint i; + psize start_pos; ppointer addr; if (P_UNLIKELY (buf == NULL || data == NULL || len == 0)) { @@ -255,7 +255,7 @@ p_shm_buffer_write (PShmBuffer *buf, return 0; } - int start_pos = write_pos % buf->size; + start_pos = write_pos % buf->size; if (start_pos + len <= buf->size) { From d72f95b0f9865df5701a7e1d01cf87a3ae0e9f7e Mon Sep 17 00:00:00 2001 From: Danny Povolotski Date: Thu, 14 Mar 2024 04:26:46 +0300 Subject: [PATCH 5/8] clean up whitespace --- src/pshmbuffer.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pshmbuffer.c b/src/pshmbuffer.c index 073f149..1c1e86b 100644 --- a/src/pshmbuffer.c +++ b/src/pshmbuffer.c @@ -158,7 +158,7 @@ p_shm_buffer_read (PShmBuffer *buf, psize write_pos; psize data_aval; psize to_copy; - psize start_pos; + psize start_pos; ppointer addr; if (P_UNLIKELY (buf == NULL || storage == NULL || len == 0)) { @@ -223,7 +223,7 @@ p_shm_buffer_write (PShmBuffer *buf, { psize read_pos; psize write_pos; - psize start_pos; + psize start_pos; ppointer addr; if (P_UNLIKELY (buf == NULL || data == NULL || len == 0)) { @@ -255,8 +255,8 @@ p_shm_buffer_write (PShmBuffer *buf, return 0; } - start_pos = write_pos % buf->size; - + start_pos = write_pos % buf->size; + if (start_pos + len <= buf->size) { memcpy((pchar*)addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, (pchar*)data, len); From 2388e416f1f4b2b3207555c4a8657016c5b55c59 Mon Sep 17 00:00:00 2001 From: Danny Povolotski Date: Thu, 14 Mar 2024 04:29:36 +0300 Subject: [PATCH 6/8] clean up whitespace (2) --- src/pshmbuffer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pshmbuffer.c b/src/pshmbuffer.c index 1c1e86b..e055e25 100644 --- a/src/pshmbuffer.c +++ b/src/pshmbuffer.c @@ -158,7 +158,7 @@ p_shm_buffer_read (PShmBuffer *buf, psize write_pos; psize data_aval; psize to_copy; - psize start_pos; + psize start_pos; ppointer addr; if (P_UNLIKELY (buf == NULL || storage == NULL || len == 0)) { @@ -194,7 +194,7 @@ p_shm_buffer_read (PShmBuffer *buf, to_copy = (data_aval <= len) ? data_aval : len; start_pos = read_pos % buf->size; - + if (start_pos + to_copy <= buf->size) { memcpy((pchar*)storage, (pchar*)addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, to_copy); From 4a8040c53ab34969355f2c2218523f8fecb451b7 Mon Sep 17 00:00:00 2001 From: Alexander Saprykin Date: Sun, 17 Mar 2024 12:14:31 +0100 Subject: [PATCH 7/8] Adjust code style and internal types --- src/pshmbuffer.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/pshmbuffer.c b/src/pshmbuffer.c index e055e25..683c9a3 100644 --- a/src/pshmbuffer.c +++ b/src/pshmbuffer.c @@ -193,17 +193,15 @@ p_shm_buffer_read (PShmBuffer *buf, data_aval = pp_shm_buffer_get_used_space (buf); to_copy = (data_aval <= len) ? data_aval : len; - start_pos = read_pos % buf->size; + start_pos = read_pos % buf->size; - if (start_pos + to_copy <= buf->size) - { - memcpy((pchar*)storage, (pchar*)addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, to_copy); - } - else - { - int first_part_size = buf->size - start_pos; - memcpy((pchar*)storage, (pchar*)addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, first_part_size); - memcpy((pchar*)storage + first_part_size, (pchar*)addr + P_SHM_BUFFER_DATA_OFFSET, to_copy - first_part_size); + if (start_pos + to_copy <= buf->size) { + memcpy ((pchar *) storage, (pchar *) addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, to_copy); + } else { + psize first_part_size = buf->size - start_pos; + + memcpy ((pchar *) storage, (pchar *) addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, first_part_size); + memcpy ((pchar *) storage + first_part_size, (pchar *) addr + P_SHM_BUFFER_DATA_OFFSET, to_copy - first_part_size); } read_pos = (read_pos + to_copy) % buf->size; @@ -257,15 +255,13 @@ p_shm_buffer_write (PShmBuffer *buf, start_pos = write_pos % buf->size; - if (start_pos + len <= buf->size) - { - memcpy((pchar*)addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, (pchar*)data, len); - } - else - { - int first_part_size = buf->size - start_pos; - memcpy((pchar*)addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, (pchar*)data, first_part_size); - memcpy((pchar*)addr + P_SHM_BUFFER_DATA_OFFSET, (pchar*)data + first_part_size, len - first_part_size); + if (start_pos + len <= buf->size) { + memcpy ((pchar *) addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, (pchar *) data, len); + } else { + psize first_part_size = buf->size - start_pos; + + memcpy ((pchar *) addr + P_SHM_BUFFER_DATA_OFFSET + start_pos, (pchar *) data, first_part_size); + memcpy ((pchar *) addr + P_SHM_BUFFER_DATA_OFFSET, (pchar *) data + first_part_size, len - first_part_size); } write_pos = (write_pos + len) % buf->size; From 0f932b9963b5f6fa56a86d7eb543ba54aadfeb9a Mon Sep 17 00:00:00 2001 From: Alexander Saprykin Date: Sun, 17 Mar 2024 12:15:09 +0100 Subject: [PATCH 8/8] Update copyright notes for shared memory buffer --- src/pshmbuffer.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pshmbuffer.c b/src/pshmbuffer.c index 683c9a3..eb0f554 100644 --- a/src/pshmbuffer.c +++ b/src/pshmbuffer.c @@ -1,7 +1,8 @@ /* * The MIT License * - * Copyright (C) 2010-2023 Alexander Saprykin + * Copyright (C) 2010-2024 Alexander Saprykin + * Copyright (C) 2024 Danny Povolotski * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the