@@ -36,30 +36,39 @@ void cmark_arena_push(void) {
3636}
3737
3838int cmark_arena_pop (void ) {
39+ int ret = 1 ;
40+ CMARK_INITIALIZE_AND_LOCK (arena );
3941 if (!A )
40- return 0 ;
41- while (A && !A -> push_point ) {
42- free (A -> ptr );
43- struct arena_chunk * n = A -> prev ;
44- free (A );
45- A = n ;
42+ ret = 0 ;
43+ else {
44+ while (A && !A -> push_point ) {
45+ free (A -> ptr );
46+ struct arena_chunk * n = A -> prev ;
47+ free (A );
48+ A = n ;
49+ }
50+ if (A )
51+ A -> push_point = 0 ;
4652 }
47- if (A )
48- A -> push_point = 0 ;
49- return 1 ;
53+ CMARK_UNLOCK (arena );
54+ return ret ;
5055}
5156
5257static void init_arena (void ) {
58+ CMARK_INITIALIZE_AND_LOCK (arena );
5359 A = alloc_arena_chunk (4 * 1048576 , NULL );
60+ CMARK_UNLOCK (arena );
5461}
5562
5663void cmark_arena_reset (void ) {
64+ CMARK_INITIALIZE_AND_LOCK (arena );
5765 while (A ) {
5866 free (A -> ptr );
5967 struct arena_chunk * n = A -> prev ;
6068 free (A );
6169 A = n ;
6270 }
71+ CMARK_UNLOCK (arena );
6372}
6473
6574static void * arena_calloc (size_t nmem , size_t size ) {
@@ -74,20 +83,23 @@ static void *arena_calloc(size_t nmem, size_t size) {
7483 sz = (sz + align ) & ~align ;
7584
7685 CMARK_INITIALIZE_AND_LOCK (arena );
77-
86+
87+ void * ptr = NULL ;
88+
7889 if (sz > A -> sz ) {
7990 A -> prev = alloc_arena_chunk (sz , A -> prev );
80- return (uint8_t * ) A -> prev -> ptr + sizeof (size_t );
81- }
82- if (sz > A -> sz - A -> used ) {
83- A = alloc_arena_chunk (A -> sz + A -> sz / 2 , A );
91+ ptr = (uint8_t * ) A -> prev -> ptr ;
92+ } else {
93+ if (sz > A -> sz - A -> used ) {
94+ A = alloc_arena_chunk (A -> sz + A -> sz / 2 , A );
95+ }
96+ ptr = (uint8_t * ) A -> ptr + A -> used ;
97+ A -> used += sz ;
98+ * ((size_t * ) ptr ) = sz - sizeof (size_t );
8499 }
85- void * ptr = (uint8_t * ) A -> ptr + A -> used ;
86- A -> used += sz ;
87100
88101 CMARK_UNLOCK (arena );
89-
90- * ((size_t * ) ptr ) = sz - sizeof (size_t );
102+
91103 return (uint8_t * ) ptr + sizeof (size_t );
92104}
93105
0 commit comments