MINOR: ring: add a flag to indicate a mapped file

Till now we used to rely on a heuristic pointer comparison to check if
a ring was mapped or allocated. Better assign a flag to clarify this
because it's going to become difficult otherwise.
This commit is contained in:
Willy Tarreau 2024-03-03 17:50:11 +01:00
parent 80441a6983
commit 01abdcb307
2 changed files with 13 additions and 1 deletions

View File

@ -96,6 +96,9 @@
#define RING_WF_WAIT_MODE 0x00000001 /* wait for new contents */
#define RING_WF_SEEK_NEW 0x00000002 /* seek to new contents */
/* ring flags */
#define RING_FL_MAPPED 0x00000001 /* mmapped area, must not free() */
/* keep values below in decimal, they may be dumped in error messages */
#define RING_WRITING_SIZE 255 /* the next message's size is being written */
#define RING_MAX_READERS 254 /* highest supported value for RC */
@ -105,6 +108,7 @@ struct ring {
struct list waiters; // list of waiters, for now, CLI "show event"
__decl_thread(HA_RWLOCK_T lock);
int readers_count;
uint flags; // RING_FL_*
};
#endif /* _HAPROXY_RING_T_H */

View File

@ -43,6 +43,8 @@ void ring_init(struct ring *ring, void *area, size_t size)
LIST_INIT(&ring->waiters);
ring->readers_count = 0;
ring->buf = b_make(area, size, 0, 0);
ring->flags = 0;
/* write the initial RC byte */
b_putchr(&ring->buf, 0);
}
@ -83,18 +85,23 @@ struct ring *ring_new(size_t size)
struct ring *ring_make_from_area(void *area, size_t size)
{
struct ring *ring = NULL;
uint flags = 0;
if (size < sizeof(*ring))
return NULL;
if (!area)
area = malloc(size);
else
flags |= RING_FL_MAPPED;
if (!area)
return NULL;
ring = area;
area += sizeof(*ring);
ring_init(ring, area, size - sizeof(*ring));
ring->flags |= flags;
return ring;
}
@ -113,6 +120,7 @@ struct ring *ring_cast_from_area(void *area)
HA_RWLOCK_INIT(&ring->lock);
LIST_INIT(&ring->waiters);
ring->readers_count = 0;
ring->flags = RING_FL_MAPPED;
return ring;
}
@ -156,7 +164,7 @@ void ring_free(struct ring *ring)
return;
/* make sure it was not allocated by ring_make_from_area */
if (ring->buf.area == (void *)ring + sizeof(*ring))
if (ring->flags & RING_FL_MAPPED)
return;
free(ring_area(ring));