55
55
# define VALGRIND_DEFINED_SPACE (p, s )
56
56
#endif /* JERRY_VALGRIND */
57
57
58
- /* *
59
- * Magic numbers for heap memory blocks
60
- */
61
- typedef enum
62
- {
63
- MEM_MAGIC_NUM_OF_FREE_BLOCK = 0xc809 ,
64
- MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK = 0x5b46
65
- } mem_magic_num_of_block_t ;
66
-
67
58
/* *
68
59
* State of the block to initialize (argument of mem_init_block_header)
69
60
*
@@ -108,9 +99,6 @@ typedef struct __attribute__ ((aligned (MEM_ALIGNMENT))) mem_block_header_t
108
99
* 0 - if the block is the first block */
109
100
mem_heap_offset_t next_p : MEM_HEAP_OFFSET_LOG; /* *< next block's offset;
110
101
* 0 - if the block is the last block */
111
- uint16_t magic_num; /* *< magic number (mem_magic_num_of_block_t):
112
- * MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK for allocated block
113
- * or MEM_MAGIC_NUM_OF_FREE_BLOCK for free block */
114
102
} mem_block_header_t ;
115
103
116
104
#if MEM_HEAP_OFFSET_LOG <= 16
@@ -152,6 +140,7 @@ mem_heap_state_t mem_heap;
152
140
static size_t mem_get_block_chunks_count (const mem_block_header_t *block_header_p);
153
141
static size_t mem_get_block_data_space_size (const mem_block_header_t *block_header_p);
154
142
static size_t mem_get_block_chunks_count_from_data_size (size_t block_allocated_size);
143
+ static bool mem_is_block_free (const mem_block_header_t *block_header_p);
155
144
156
145
static void mem_init_block_header (uint8_t *first_chunk_p,
157
146
size_t size_in_chunks,
@@ -370,6 +359,18 @@ mem_get_block_chunks_count_from_data_size (size_t block_allocated_size) /**< siz
370
359
return JERRY_ALIGNUP (sizeof (mem_block_header_t ) + block_allocated_size, MEM_HEAP_CHUNK_SIZE) / MEM_HEAP_CHUNK_SIZE;
371
360
} /* mem_get_block_chunks_count_from_data_size */
372
361
362
+ /* *
363
+ * Check whether specified block is free.
364
+ *
365
+ * @return true - if block is free,
366
+ * false - otherwise
367
+ */
368
+ static bool
369
+ mem_is_block_free (const mem_block_header_t *block_header_p) /* *< block header */
370
+ {
371
+ return (block_header_p->allocated_bytes == 0 );
372
+ } /* mem_is_block_free */
373
+
373
374
/* *
374
375
* Startup initialization of heap
375
376
*/
@@ -410,7 +411,7 @@ mem_heap_finalize (void)
410
411
VALGRIND_DEFINED_SPACE (mem_heap.heap_start , mem_heap.heap_size );
411
412
412
413
JERRY_ASSERT (mem_heap.first_block_p == mem_heap.last_block_p );
413
- JERRY_ASSERT ( mem_heap.first_block_p -> magic_num == MEM_MAGIC_NUM_OF_FREE_BLOCK );
414
+ JERRY_ASSERT ( mem_is_block_free ( mem_heap.first_block_p ) );
414
415
415
416
VALGRIND_NOACCESS_SPACE (mem_heap.heap_start , mem_heap.heap_size );
416
417
@@ -431,23 +432,23 @@ mem_init_block_header (uint8_t *first_chunk_p, /**< address of the first
431
432
432
433
VALGRIND_UNDEFINED_STRUCT (block_header_p);
433
434
435
+ mem_set_block_prev (block_header_p, prev_block_p);
436
+ mem_set_block_next (block_header_p, next_block_p);
437
+ mem_set_block_allocated_bytes (block_header_p, allocated_bytes);
438
+
439
+ JERRY_ASSERT (allocated_bytes <= mem_get_block_data_space_size (block_header_p));
440
+
434
441
if (block_state == MEM_BLOCK_FREE)
435
442
{
436
- block_header_p->magic_num = MEM_MAGIC_NUM_OF_FREE_BLOCK;
437
-
438
- JERRY_ASSERT (allocated_bytes == 0 );
443
+ JERRY_ASSERT (allocated_bytes == 0 );
444
+ JERRY_ASSERT (mem_is_block_free (block_header_p));
439
445
}
440
446
else
441
447
{
442
- block_header_p->magic_num = MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK;
448
+ JERRY_ASSERT (allocated_bytes != 0 );
449
+ JERRY_ASSERT (!mem_is_block_free (block_header_p));
443
450
}
444
451
445
- mem_set_block_prev (block_header_p, prev_block_p);
446
- mem_set_block_next (block_header_p, next_block_p);
447
- mem_set_block_allocated_bytes (block_header_p, allocated_bytes);
448
-
449
- JERRY_ASSERT (allocated_bytes <= mem_get_block_data_space_size (block_header_p));
450
-
451
452
VALGRIND_NOACCESS_STRUCT (block_header_p);
452
453
} /* mem_init_block_header */
453
454
@@ -489,7 +490,7 @@ void* mem_heap_alloc_block_internal (size_t size_in_bytes, /**< size
489
490
{
490
491
VALGRIND_DEFINED_STRUCT (block_p);
491
492
492
- if (block_p-> magic_num == MEM_MAGIC_NUM_OF_FREE_BLOCK )
493
+ if (mem_is_block_free (block_p) )
493
494
{
494
495
if (mem_get_block_data_space_size (block_p) >= size_in_bytes)
495
496
{
@@ -498,7 +499,7 @@ void* mem_heap_alloc_block_internal (size_t size_in_bytes, /**< size
498
499
}
499
500
else
500
501
{
501
- JERRY_ASSERT (block_p-> magic_num == MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK );
502
+ JERRY_ASSERT (! mem_is_block_free (block_p) );
502
503
}
503
504
504
505
mem_block_header_t *next_block_p = mem_get_next_block_by_direction (block_p, direction);
@@ -715,25 +716,16 @@ mem_heap_free_block (void *ptr) /**< pointer to beginning of data space of the b
715
716
716
717
VALGRIND_NOACCESS_SPACE (uint8_ptr, block_p->allocated_bytes );
717
718
718
- /* checking magic nums that are neighbour to data space */
719
- JERRY_ASSERT (block_p->magic_num == MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK);
720
- if (next_block_p != NULL )
721
- {
722
- VALGRIND_DEFINED_STRUCT (next_block_p);
723
-
724
- JERRY_ASSERT (next_block_p->magic_num == MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK
725
- || next_block_p->magic_num == MEM_MAGIC_NUM_OF_FREE_BLOCK);
726
-
727
- VALGRIND_NOACCESS_STRUCT (next_block_p);
728
- }
719
+ JERRY_ASSERT (!mem_is_block_free (block_p));
729
720
730
- block_p->magic_num = MEM_MAGIC_NUM_OF_FREE_BLOCK;
721
+ /* marking the block free */
722
+ block_p->allocated_bytes = 0 ;
731
723
732
724
if (next_block_p != NULL )
733
725
{
734
726
VALGRIND_DEFINED_STRUCT (next_block_p);
735
727
736
- if (next_block_p-> magic_num == MEM_MAGIC_NUM_OF_FREE_BLOCK )
728
+ if (mem_is_block_free (next_block_p) )
737
729
{
738
730
/* merge with the next block */
739
731
MEM_HEAP_STAT_FREE_BLOCK_MERGE ();
@@ -764,7 +756,7 @@ mem_heap_free_block (void *ptr) /**< pointer to beginning of data space of the b
764
756
{
765
757
VALGRIND_DEFINED_STRUCT (prev_block_p);
766
758
767
- if (prev_block_p-> magic_num == MEM_MAGIC_NUM_OF_FREE_BLOCK )
759
+ if (mem_is_block_free (prev_block_p) )
768
760
{
769
761
/* merge with the previous block */
770
762
MEM_HEAP_STAT_FREE_BLOCK_MERGE ();
@@ -834,7 +826,7 @@ mem_heap_get_block_start (void *ptr) /**< pointer into a block */
834
826
835
827
if (is_found)
836
828
{
837
- JERRY_ASSERT (block_p-> magic_num == MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK );
829
+ JERRY_ASSERT (! mem_is_block_free (block_p) );
838
830
JERRY_ASSERT (block_p + 1 <= ptr);
839
831
JERRY_ASSERT (ptr < ((uint8_t *) (block_p + 1 ) + block_p->allocated_bytes ));
840
832
}
@@ -894,9 +886,9 @@ mem_heap_print (bool dump_block_headers, /**< print block headers */
894
886
{
895
887
VALGRIND_DEFINED_STRUCT (block_p);
896
888
897
- printf (" Block (%p): magic num=0x%08x , size in chunks=%lu, previous block->%p next block->%p\n " ,
889
+ printf (" Block (%p): state=%s , size in chunks=%lu, previous block->%p next block->%p\n " ,
898
890
(void *) block_p,
899
- block_p-> magic_num ,
891
+ mem_is_block_free ( block_p) ? " free " : " allocated " ,
900
892
(unsigned long ) mem_get_block_chunks_count (block_p),
901
893
(void *) mem_get_next_block_by_direction (block_p, MEM_DIRECTION_PREV),
902
894
(void *) mem_get_next_block_by_direction (block_p, MEM_DIRECTION_NEXT));
@@ -973,11 +965,9 @@ mem_check_heap (void)
973
965
{
974
966
VALGRIND_DEFINED_STRUCT (block_p);
975
967
976
- JERRY_ASSERT (block_p->magic_num == MEM_MAGIC_NUM_OF_FREE_BLOCK
977
- || block_p->magic_num == MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK);
978
968
chunk_sizes_sum += mem_get_block_chunks_count (block_p);
979
969
980
- if (block_p-> magic_num == MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK )
970
+ if (! mem_is_block_free (block_p) )
981
971
{
982
972
allocated_sum += block_p->allocated_bytes ;
983
973
}
@@ -1011,8 +1001,6 @@ mem_check_heap (void)
1011
1001
{
1012
1002
VALGRIND_DEFINED_STRUCT (block_p);
1013
1003
1014
- JERRY_ASSERT (block_p->magic_num == MEM_MAGIC_NUM_OF_FREE_BLOCK
1015
- || block_p->magic_num == MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK);
1016
1004
chunk_sizes_sum += mem_get_block_chunks_count (block_p);
1017
1005
1018
1006
prev_block_p = mem_get_next_block_by_direction (block_p, MEM_DIRECTION_PREV);
@@ -1076,7 +1064,7 @@ mem_heap_stat_init ()
1076
1064
static void
1077
1065
mem_heap_stat_alloc_block (mem_block_header_t *block_header_p) /* *< allocated block */
1078
1066
{
1079
- JERRY_ASSERT (block_header_p-> magic_num == MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK );
1067
+ JERRY_ASSERT (! mem_is_block_free (block_header_p) );
1080
1068
1081
1069
const size_t chunks = mem_get_block_chunks_count (block_header_p);
1082
1070
const size_t bytes = block_header_p->allocated_bytes ;
@@ -1134,7 +1122,7 @@ mem_heap_stat_alloc_block (mem_block_header_t *block_header_p) /**< allocated bl
1134
1122
static void
1135
1123
mem_heap_stat_free_block (mem_block_header_t *block_header_p) /* *< block to be freed */
1136
1124
{
1137
- JERRY_ASSERT (block_header_p-> magic_num == MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK );
1125
+ JERRY_ASSERT (! mem_is_block_free (block_header_p) );
1138
1126
1139
1127
const size_t chunks = mem_get_block_chunks_count (block_header_p);
1140
1128
const size_t bytes = block_header_p->allocated_bytes ;
0 commit comments