align buffer chunks to sizeof(void*) instead of hard coding 8 bytes
Signed-off-by: Michael Gary Dodson <md403@cam.ac.uk>
This commit is contained in:
parent
b513eaac00
commit
004932817e
2 changed files with 22 additions and 13 deletions
|
@ -102,6 +102,13 @@ DDSRT_STATIC_ASSERT (sizeof (struct nn_rmsg) == offsetof (struct nn_rmsg, chunk)
|
||||||
#define NN_RMSG_PAYLOAD(m) ((unsigned char *) (m + 1))
|
#define NN_RMSG_PAYLOAD(m) ((unsigned char *) (m + 1))
|
||||||
#define NN_RMSG_PAYLOADOFF(m, o) (NN_RMSG_PAYLOAD (m) + (o))
|
#define NN_RMSG_PAYLOADOFF(m, o) (NN_RMSG_PAYLOAD (m) + (o))
|
||||||
|
|
||||||
|
/* Align rmsg chunks to the larger of sizeof(void*) or 8.
|
||||||
|
|
||||||
|
Ideally, we would use C11's alignof(struct nn_rmsg); however, to avoid dependency on C11,
|
||||||
|
we ensure rmsg chunks are at least aligned to sizeof(void *) or 8,
|
||||||
|
whichever is larger. */
|
||||||
|
#define ALIGNOF_RMSG (sizeof(void *) > 8 ? sizeof(void *) : 8)
|
||||||
|
|
||||||
struct receiver_state {
|
struct receiver_state {
|
||||||
ddsi_guid_prefix_t src_guid_prefix; /* 12 */
|
ddsi_guid_prefix_t src_guid_prefix; /* 12 */
|
||||||
ddsi_guid_prefix_t dst_guid_prefix; /* 12 */
|
ddsi_guid_prefix_t dst_guid_prefix; /* 12 */
|
||||||
|
|
|
@ -303,9 +303,11 @@ static void nn_rbuf_release (struct nn_rbuf *rbuf);
|
||||||
#define RMSGTRACE(...) TRACE_CFG (rmsg, rmsg->chunk.rbuf->rbufpool->logcfg, __VA_ARGS__)
|
#define RMSGTRACE(...) TRACE_CFG (rmsg, rmsg->chunk.rbuf->rbufpool->logcfg, __VA_ARGS__)
|
||||||
#define RDATATRACE(rdata, ...) TRACE_CFG ((rdata)->rmsg, (rdata)->rmsg->chunk.rbuf->rbufpool->logcfg, __VA_ARGS__)
|
#define RDATATRACE(rdata, ...) TRACE_CFG ((rdata)->rmsg, (rdata)->rmsg->chunk.rbuf->rbufpool->logcfg, __VA_ARGS__)
|
||||||
|
|
||||||
static uint32_t align8uint32 (uint32_t x)
|
static uint32_t align_rmsg (uint32_t x)
|
||||||
{
|
{
|
||||||
return (x + 7u) & (uint32_t)-8;
|
x += (uint32_t) ALIGNOF_RMSG - 1;
|
||||||
|
x -= x % (uint32_t) ALIGNOF_RMSG;
|
||||||
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
|
@ -553,15 +555,15 @@ struct nn_rmsg *nn_rmsg_new (struct nn_rbufpool *rbp)
|
||||||
|
|
||||||
void nn_rmsg_setsize (struct nn_rmsg *rmsg, uint32_t size)
|
void nn_rmsg_setsize (struct nn_rmsg *rmsg, uint32_t size)
|
||||||
{
|
{
|
||||||
uint32_t size8 = align8uint32 (size);
|
uint32_t size8P = align_rmsg (size);
|
||||||
RMSGTRACE ("rmsg_setsize(%p, %"PRIu32" => %"PRIu32")\n", (void *) rmsg, size, size8);
|
RMSGTRACE ("rmsg_setsize(%p, %"PRIu32" => %"PRIu32")\n", (void *) rmsg, size, size8P);
|
||||||
ASSERT_RBUFPOOL_OWNER (rmsg->chunk.rbuf->rbufpool);
|
ASSERT_RBUFPOOL_OWNER (rmsg->chunk.rbuf->rbufpool);
|
||||||
ASSERT_RMSG_UNCOMMITTED (rmsg);
|
ASSERT_RMSG_UNCOMMITTED (rmsg);
|
||||||
assert (ddsrt_atomic_ld32 (&rmsg->refcount) == RMSG_REFCOUNT_UNCOMMITTED_BIAS);
|
assert (ddsrt_atomic_ld32 (&rmsg->refcount) == RMSG_REFCOUNT_UNCOMMITTED_BIAS);
|
||||||
assert (rmsg->chunk.u.size == 0);
|
assert (rmsg->chunk.u.size == 0);
|
||||||
assert (size8 <= rmsg->chunk.rbuf->max_rmsg_size);
|
assert (size8P <= rmsg->chunk.rbuf->max_rmsg_size);
|
||||||
assert (rmsg->lastchunk == &rmsg->chunk);
|
assert (rmsg->lastchunk == &rmsg->chunk);
|
||||||
rmsg->chunk.u.size = size8;
|
rmsg->chunk.u.size = size8P;
|
||||||
#if USE_VALGRIND
|
#if USE_VALGRIND
|
||||||
VALGRIND_MEMPOOL_CHANGE (rmsg->chunk.rbuf->rbufpool, rmsg, rmsg, offsetof (struct nn_rmsg, chunk.u.payload) + rmsg->chunk.size);
|
VALGRIND_MEMPOOL_CHANGE (rmsg->chunk.rbuf->rbufpool, rmsg, rmsg, offsetof (struct nn_rmsg, chunk.u.payload) + rmsg->chunk.size);
|
||||||
#endif
|
#endif
|
||||||
|
@ -620,7 +622,7 @@ void nn_rmsg_commit (struct nn_rmsg *rmsg)
|
||||||
ASSERT_RBUFPOOL_OWNER (chunk->rbuf->rbufpool);
|
ASSERT_RBUFPOOL_OWNER (chunk->rbuf->rbufpool);
|
||||||
ASSERT_RMSG_UNCOMMITTED (rmsg);
|
ASSERT_RMSG_UNCOMMITTED (rmsg);
|
||||||
assert (chunk->u.size <= chunk->rbuf->max_rmsg_size);
|
assert (chunk->u.size <= chunk->rbuf->max_rmsg_size);
|
||||||
assert ((chunk->u.size % 8) == 0);
|
assert ((chunk->u.size % ALIGNOF_RMSG) == 0);
|
||||||
assert (ddsrt_atomic_ld32 (&rmsg->refcount) >= RMSG_REFCOUNT_UNCOMMITTED_BIAS);
|
assert (ddsrt_atomic_ld32 (&rmsg->refcount) >= RMSG_REFCOUNT_UNCOMMITTED_BIAS);
|
||||||
assert (ddsrt_atomic_ld32 (&rmsg->chunk.rbuf->n_live_rmsg_chunks) > 0);
|
assert (ddsrt_atomic_ld32 (&rmsg->chunk.rbuf->n_live_rmsg_chunks) > 0);
|
||||||
assert (ddsrt_atomic_ld32 (&chunk->rbuf->n_live_rmsg_chunks) > 0);
|
assert (ddsrt_atomic_ld32 (&chunk->rbuf->n_live_rmsg_chunks) > 0);
|
||||||
|
@ -677,15 +679,15 @@ void *nn_rmsg_alloc (struct nn_rmsg *rmsg, uint32_t size)
|
||||||
{
|
{
|
||||||
struct nn_rmsg_chunk *chunk = rmsg->lastchunk;
|
struct nn_rmsg_chunk *chunk = rmsg->lastchunk;
|
||||||
struct nn_rbuf *rbuf = chunk->rbuf;
|
struct nn_rbuf *rbuf = chunk->rbuf;
|
||||||
uint32_t size8 = align8uint32 (size);
|
uint32_t size8P = align_rmsg (size);
|
||||||
void *ptr;
|
void *ptr;
|
||||||
RMSGTRACE ("rmsg_alloc(%p, %"PRIu32" => %"PRIu32")\n", (void *) rmsg, size, size8);
|
RMSGTRACE ("rmsg_alloc(%p, %"PRIu32" => %"PRIu32")\n", (void *) rmsg, size, size8P);
|
||||||
ASSERT_RBUFPOOL_OWNER (rbuf->rbufpool);
|
ASSERT_RBUFPOOL_OWNER (rbuf->rbufpool);
|
||||||
ASSERT_RMSG_UNCOMMITTED (rmsg);
|
ASSERT_RMSG_UNCOMMITTED (rmsg);
|
||||||
assert ((chunk->u.size % 8) == 0);
|
assert ((chunk->u.size % ALIGNOF_RMSG) == 0);
|
||||||
assert (size8 <= rbuf->max_rmsg_size);
|
assert (size8P <= rbuf->max_rmsg_size);
|
||||||
|
|
||||||
if (chunk->u.size + size8 > rbuf->max_rmsg_size)
|
if (chunk->u.size + size8P > rbuf->max_rmsg_size)
|
||||||
{
|
{
|
||||||
struct nn_rbufpool *rbp = rbuf->rbufpool;
|
struct nn_rbufpool *rbp = rbuf->rbufpool;
|
||||||
struct nn_rmsg_chunk *newchunk;
|
struct nn_rmsg_chunk *newchunk;
|
||||||
|
@ -703,7 +705,7 @@ void *nn_rmsg_alloc (struct nn_rmsg *rmsg, uint32_t size)
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = (unsigned char *) (chunk + 1) + chunk->u.size;
|
ptr = (unsigned char *) (chunk + 1) + chunk->u.size;
|
||||||
chunk->u.size += size8;
|
chunk->u.size += size8P;
|
||||||
RMSGTRACE ("rmsg_alloc(%p, %"PRIu32") = %p\n", (void *) rmsg, size, ptr);
|
RMSGTRACE ("rmsg_alloc(%p, %"PRIu32") = %p\n", (void *) rmsg, size, ptr);
|
||||||
#if USE_VALGRIND
|
#if USE_VALGRIND
|
||||||
if (chunk == &rmsg->chunk) {
|
if (chunk == &rmsg->chunk) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue