forked from enlightenment/efl
eo ptr ind: empty tables are freed except 1 kept as spare
- this reduces unused memory usage - the spare table avoids the free/alloc corner case
This commit is contained in:
parent
3e4127da52
commit
f253cfc12c
|
@ -22,7 +22,7 @@
|
||||||
* - a tree structure is used, composed of a top level table pointing at
|
* - a tree structure is used, composed of a top level table pointing at
|
||||||
* mid tables pointing at tables composed of entries.
|
* mid tables pointing at tables composed of entries.
|
||||||
* - tables are allocated when needed (i.e no more empty entries in allocated tables.
|
* - tables are allocated when needed (i.e no more empty entries in allocated tables.
|
||||||
* For now there is no mechanism to free empty tables.
|
* - empty tables are freed, except one kept as spare table.
|
||||||
*
|
*
|
||||||
* An Eo id is contructed by bits manipulation of table indexes and a generation.
|
* An Eo id is contructed by bits manipulation of table indexes and a generation.
|
||||||
*
|
*
|
||||||
|
@ -69,7 +69,7 @@
|
||||||
# define BITS_ENTRY_ID 12
|
# define BITS_ENTRY_ID 12
|
||||||
# define BITS_GENERATION_COUNTER 10
|
# define BITS_GENERATION_COUNTER 10
|
||||||
# define DROPPED_TABLES 0
|
# define DROPPED_TABLES 0
|
||||||
# define DROPPED_ENTRIES 3
|
# define DROPPED_ENTRIES 4
|
||||||
typedef int16_t Table_Index;
|
typedef int16_t Table_Index;
|
||||||
typedef uint16_t Generation_Counter;
|
typedef uint16_t Generation_Counter;
|
||||||
#else
|
#else
|
||||||
|
@ -79,7 +79,7 @@ typedef uint16_t Generation_Counter;
|
||||||
# define BITS_ENTRY_ID 12
|
# define BITS_ENTRY_ID 12
|
||||||
# define BITS_GENERATION_COUNTER 30
|
# define BITS_GENERATION_COUNTER 30
|
||||||
# define DROPPED_TABLES 2
|
# define DROPPED_TABLES 2
|
||||||
# define DROPPED_ENTRIES 2
|
# define DROPPED_ENTRIES 3
|
||||||
typedef int16_t Table_Index;
|
typedef int16_t Table_Index;
|
||||||
typedef uint32_t Generation_Counter;
|
typedef uint32_t Generation_Counter;
|
||||||
#endif
|
#endif
|
||||||
|
@ -214,6 +214,8 @@ typedef struct
|
||||||
Table_Index fifo_tail;
|
Table_Index fifo_tail;
|
||||||
/* Packed mid table and table indexes */
|
/* Packed mid table and table indexes */
|
||||||
Eo_Id partial_id;
|
Eo_Id partial_id;
|
||||||
|
/* Counter of free entries */
|
||||||
|
unsigned int free_entries;
|
||||||
/* Entries of the table holding real pointers and generations */
|
/* Entries of the table holding real pointers and generations */
|
||||||
_Eo_Id_Entry entries[MAX_ENTRY_ID];
|
_Eo_Id_Entry entries[MAX_ENTRY_ID];
|
||||||
} _Eo_Ids_Table;
|
} _Eo_Ids_Table;
|
||||||
|
@ -224,6 +226,9 @@ static _Eo_Ids_Table **_eo_ids_tables[MAX_MID_TABLE_ID] = { NULL };
|
||||||
/* Current table used for following allocations */
|
/* Current table used for following allocations */
|
||||||
static _Eo_Ids_Table *_current_table = NULL;
|
static _Eo_Ids_Table *_current_table = NULL;
|
||||||
|
|
||||||
|
/* Spare empty table */
|
||||||
|
static _Eo_Ids_Table *_empty_table = NULL;
|
||||||
|
|
||||||
/* Next generation to use when assigning a new entry to a Eo pointer */
|
/* Next generation to use when assigning a new entry to a Eo pointer */
|
||||||
Generation_Counter _eo_generation_counter = 0;
|
Generation_Counter _eo_generation_counter = 0;
|
||||||
|
|
||||||
|
@ -285,6 +290,7 @@ _get_available_entry(_Eo_Ids_Table *table)
|
||||||
entry = &(table->entries[table->start]);
|
entry = &(table->entries[table->start]);
|
||||||
UNPROTECT(table);
|
UNPROTECT(table);
|
||||||
table->start++;
|
table->start++;
|
||||||
|
table->free_entries--;
|
||||||
}
|
}
|
||||||
else if (table->fifo_head != -1)
|
else if (table->fifo_head != -1)
|
||||||
{
|
{
|
||||||
|
@ -295,6 +301,7 @@ _get_available_entry(_Eo_Ids_Table *table)
|
||||||
table->fifo_head = table->fifo_tail = -1;
|
table->fifo_head = table->fifo_tail = -1;
|
||||||
else
|
else
|
||||||
table->fifo_head = entry->next_in_fifo;
|
table->fifo_head = entry->next_in_fifo;
|
||||||
|
table->free_entries--;
|
||||||
}
|
}
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
|
@ -320,9 +327,20 @@ _search_tables()
|
||||||
|
|
||||||
if (!table)
|
if (!table)
|
||||||
{
|
{
|
||||||
/* Allocate a new table and reserve the first entry */
|
if (_empty_table)
|
||||||
table = _eo_id_mem_calloc(1, sizeof(_Eo_Ids_Table));
|
{
|
||||||
|
/* Recycle the available empty table */
|
||||||
|
table = _empty_table;
|
||||||
|
_empty_table = NULL;
|
||||||
|
UNPROTECT(table);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Allocate a new one and reserve the first entry */
|
||||||
|
table = _eo_id_mem_calloc(1, sizeof(_Eo_Ids_Table));
|
||||||
|
}
|
||||||
table->start = 1;
|
table->start = 1;
|
||||||
|
table->free_entries = MAX_ENTRY_ID - 1;
|
||||||
table->fifo_head = table->fifo_tail = -1;
|
table->fifo_head = table->fifo_tail = -1;
|
||||||
table->partial_id = EO_COMPOSE_PARTIAL_ID(mid_table_id, table_id);
|
table->partial_id = EO_COMPOSE_PARTIAL_ID(mid_table_id, table_id);
|
||||||
entry = &(table->entries[0]);
|
entry = &(table->entries[0]);
|
||||||
|
@ -397,6 +415,7 @@ _eo_id_release(const Eo_Id obj_id)
|
||||||
if (entry && entry->active && (entry->generation == generation))
|
if (entry && entry->active && (entry->generation == generation))
|
||||||
{
|
{
|
||||||
UNPROTECT(table);
|
UNPROTECT(table);
|
||||||
|
table->free_entries++;
|
||||||
/* Disable the entry */
|
/* Disable the entry */
|
||||||
entry->active = 0;
|
entry->active = 0;
|
||||||
entry->next_in_fifo = -1;
|
entry->next_in_fifo = -1;
|
||||||
|
@ -411,6 +430,19 @@ _eo_id_release(const Eo_Id obj_id)
|
||||||
table->fifo_tail = entry_id;
|
table->fifo_tail = entry_id;
|
||||||
}
|
}
|
||||||
PROTECT(table);
|
PROTECT(table);
|
||||||
|
if (table->free_entries == MAX_ENTRY_ID)
|
||||||
|
{
|
||||||
|
UNPROTECT(_eo_ids_tables[mid_table_id]);
|
||||||
|
TABLE_FROM_IDS = NULL;
|
||||||
|
PROTECT(_eo_ids_tables[mid_table_id]);
|
||||||
|
/* Recycle or free the empty table */
|
||||||
|
if (!_empty_table)
|
||||||
|
_empty_table = table;
|
||||||
|
else
|
||||||
|
_eo_id_mem_free(table);
|
||||||
|
if (_current_table == table)
|
||||||
|
_current_table = NULL;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -439,7 +471,8 @@ _eo_free_ids_tables()
|
||||||
}
|
}
|
||||||
_eo_ids_tables[mid_table_id] = NULL;
|
_eo_ids_tables[mid_table_id] = NULL;
|
||||||
}
|
}
|
||||||
_current_table = NULL;
|
if (_empty_table) _eo_id_mem_free(_empty_table);
|
||||||
|
_empty_table = _current_table = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef EFL_DEBUG
|
#ifdef EFL_DEBUG
|
||||||
|
|
Loading…
Reference in New Issue