Skip to content

Commit 437dcb0

Browse files
add locks around arena ops
1 parent d62fa12 commit 437dcb0

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

src/arena.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1+
#include <pthread.h>
2+
#include <stdatomic.h>
13
#include <stdlib.h>
24
#include <string.h>
35
#include <stdint.h>
46
#include "cmark-gfm.h"
57
#include "cmark-gfm-extension_api.h"
8+
#include "mutex.h"
9+
10+
static pthread_mutex_t arena_lock;
11+
static atomic_int arena_latch = 0;
612

713
static struct arena_chunk {
814
size_t sz, used;
@@ -24,10 +30,13 @@ static struct arena_chunk *alloc_arena_chunk(size_t sz, struct arena_chunk *prev
2430
}
2531

2632
void cmark_arena_push(void) {
33+
initialize_mutex_once(&arena_lock, &arena_latch);
34+
pthread_mutex_lock(&arena_lock);
2735
if (!A)
2836
return;
2937
A->push_point = 1;
3038
A = alloc_arena_chunk(10240, A);
39+
pthread_mutex_unlock(&arena_lock);
3140
}
3241

3342
int cmark_arena_pop(void) {
@@ -68,6 +77,9 @@ static void *arena_calloc(size_t nmem, size_t size) {
6877
const size_t align = sizeof(size_t) - 1;
6978
sz = (sz + align) & ~align;
7079

80+
// the arena lock will have already been set up by a previous call to init_arena
81+
pthread_mutex_lock(&arena_lock);
82+
7183
if (sz > A->sz) {
7284
A->prev = alloc_arena_chunk(sz, A->prev);
7385
return (uint8_t *) A->prev->ptr + sizeof(size_t);
@@ -77,6 +89,9 @@ static void *arena_calloc(size_t nmem, size_t size) {
7789
}
7890
void *ptr = (uint8_t *) A->ptr + A->used;
7991
A->used += sz;
92+
93+
pthread_mutex_unlock(&arena_lock);
94+
8095
*((size_t *) ptr) = sz - sizeof(size_t);
8196
return (uint8_t *) ptr + sizeof(size_t);
8297
}

0 commit comments

Comments
 (0)