Quellcode durchsuchen

mem: TLSF use larger first level bitmap

The current settings on 64 bits arch require a 33 bits wide first level bitmap.
Use unsigned long instead of int.
Camille Oudot vor 10 Jahren
Ursprung
Commit
5e04515410
1 geänderte Dateien mit 13 neuen und 5 gelöschten Zeilen
  1. 13 5
      mem/tlsf.c

+ 13 - 5
mem/tlsf.c

@@ -167,7 +167,15 @@ typedef struct control_t
 	size_t max_fragments;
 	size_t max_fragments;
 #endif
 #endif
 	/* Bitmaps for free lists. */
 	/* Bitmaps for free lists. */
+#if defined (TLSF_64BIT)
+#	define TLSF_FL_ZERO 0L
+#	define TLSF_FL_ONE 1L
+	unsigned long fl_bitmap;
+#else
+#	define TLSF_FL_ZERO 0
+#	define TLSF_FL_ONE 1
 	unsigned int fl_bitmap;
 	unsigned int fl_bitmap;
+#endif
 	unsigned int sl_bitmap[FL_INDEX_COUNT];
 	unsigned int sl_bitmap[FL_INDEX_COUNT];
 
 
 	/* Head of free lists. */
 	/* Head of free lists. */
@@ -366,7 +374,7 @@ static block_header_t* search_suitable_block(control_t* control, int* fli, int*
 	if (!sl_map)
 	if (!sl_map)
 	{
 	{
 		/* No block exists. Search in the next largest first-level list. */
 		/* No block exists. Search in the next largest first-level list. */
-		const unsigned int fl_map = control->fl_bitmap & (~0 << (fl + 1));
+		const unsigned int fl_map = control->fl_bitmap & (~TLSF_FL_ZERO << (fl + 1));
 		if (!fl_map)
 		if (!fl_map)
 		{
 		{
 			/* No free blocks available, memory has been exhausted. */
 			/* No free blocks available, memory has been exhausted. */
@@ -408,7 +416,7 @@ static void remove_free_block(control_t* control, block_header_t* block, int fl,
 			/* If the second bitmap is now empty, clear the fl bitmap. */
 			/* If the second bitmap is now empty, clear the fl bitmap. */
 			if (!control->sl_bitmap[fl])
 			if (!control->sl_bitmap[fl])
 			{
 			{
-				control->fl_bitmap &= ~(1 << fl);
+				control->fl_bitmap &= ~(TLSF_FL_ONE << fl);
 			}
 			}
 		}
 		}
 	}
 	}
@@ -434,7 +442,7 @@ static void insert_free_block(control_t* control, block_header_t* block, int fl,
 	** and second-level bitmaps appropriately.
 	** and second-level bitmaps appropriately.
 	*/
 	*/
 	control->blocks[fl][sl] = block;
 	control->blocks[fl][sl] = block;
-	control->fl_bitmap |= (1 << fl);
+	control->fl_bitmap |= (TLSF_FL_ONE << fl);
 	control->sl_bitmap[fl] |= (1 << sl);
 	control->sl_bitmap[fl] |= (1 << sl);
 #if defined TLSF_STATS
 #if defined TLSF_STATS
 	TLSF_INCREASE_FRAGMENTS(control);
 	TLSF_INCREASE_FRAGMENTS(control);
@@ -613,7 +621,7 @@ static void control_construct(control_t* control)
 	control->block_null.next_free = &control->block_null;
 	control->block_null.next_free = &control->block_null;
 	control->block_null.prev_free = &control->block_null;
 	control->block_null.prev_free = &control->block_null;
 
 
-	control->fl_bitmap = 0;
+	control->fl_bitmap = TLSF_FL_ZERO;
 	for (i = 0; i < FL_INDEX_COUNT; ++i)
 	for (i = 0; i < FL_INDEX_COUNT; ++i)
 	{
 	{
 		control->sl_bitmap[i] = 0;
 		control->sl_bitmap[i] = 0;
@@ -664,7 +672,7 @@ int tlsf_check(tlsf_t tlsf)
 	{
 	{
 		for (j = 0; j < SL_INDEX_COUNT; ++j)
 		for (j = 0; j < SL_INDEX_COUNT; ++j)
 		{
 		{
-			const int fl_map = control->fl_bitmap & (1 << i);
+			const int fl_map = control->fl_bitmap & (TLSF_FL_ONE << i);
 			const int sl_list = control->sl_bitmap[i];
 			const int sl_list = control->sl_bitmap[i];
 			const int sl_map = sl_list & (1 << j);
 			const int sl_map = sl_list & (1 << j);
 			const block_header_t* block = control->blocks[i][j];
 			const block_header_t* block = control->blocks[i][j];