initialize free lists correctly
This commit was SVN r1006.
Этот коммит содержится в:
родитель
66209260b9
Коммит
e20000098e
@ -221,13 +221,17 @@
|
|||||||
* @param object Pointer to the object
|
* @param object Pointer to the object
|
||||||
* @param type The object type
|
* @param type The object type
|
||||||
*/
|
*/
|
||||||
#define OBJ_CONSTRUCT(object, type) \
|
|
||||||
|
#define OBJ_CONSTRUCT(object, type) \
|
||||||
|
OBJ_CONSTRUCT_INTERNAL(object, OBJ_CLASS(type))
|
||||||
|
|
||||||
|
#define OBJ_CONSTRUCT_INTERNAL(object, type) \
|
||||||
do { \
|
do { \
|
||||||
if (0 == OBJ_CLASS(type)->cls_initialized) { \
|
if (0 == (type)->cls_initialized) { \
|
||||||
lam_class_initialize(OBJ_CLASS(type)); \
|
lam_class_initialize((type)); \
|
||||||
} \
|
} \
|
||||||
if (object) { \
|
if (object) { \
|
||||||
((lam_object_t *) (object))->obj_class = OBJ_CLASS(type); \
|
((lam_object_t *) (object))->obj_class = (type); \
|
||||||
((lam_object_t *) (object))->obj_reference_count = 1; \
|
((lam_object_t *) (object))->obj_reference_count = 1; \
|
||||||
lam_obj_run_constructors((lam_object_t *) (object)); \
|
lam_obj_run_constructors((lam_object_t *) (object)); \
|
||||||
} \
|
} \
|
||||||
|
@ -19,10 +19,18 @@ lam_class_t lam_free_list_t_class = {
|
|||||||
|
|
||||||
static void lam_free_list_construct(lam_free_list_t* fl)
|
static void lam_free_list_construct(lam_free_list_t* fl)
|
||||||
{
|
{
|
||||||
|
OBJ_CONSTRUCT(&fl->fl_lock, lam_mutex_t);
|
||||||
|
fl->fl_max_to_alloc = 0;
|
||||||
|
fl->fl_num_allocated = 0;
|
||||||
|
fl->fl_num_per_alloc = 0;
|
||||||
|
fl->fl_elem_size = 0;
|
||||||
|
fl->fl_elem_class = 0;
|
||||||
|
fl->fl_allocator = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lam_free_list_destruct(lam_free_list_t* fl)
|
static void lam_free_list_destruct(lam_free_list_t* fl)
|
||||||
{
|
{
|
||||||
|
OBJ_DESTRUCT(&fl->fl_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
int lam_free_list_init(
|
int lam_free_list_init(
|
||||||
@ -61,10 +69,7 @@ int lam_free_list_grow(lam_free_list_t* flist, size_t num_elements)
|
|||||||
for(i=0; i<num_elements; i++) {
|
for(i=0; i<num_elements; i++) {
|
||||||
lam_list_item_t* item = (lam_list_item_t*)ptr;
|
lam_list_item_t* item = (lam_list_item_t*)ptr;
|
||||||
if (NULL != flist->fl_elem_class) {
|
if (NULL != flist->fl_elem_class) {
|
||||||
/* bypass OBJ_CONSTRUCT() in this case (generic types) */
|
OBJ_CONSTRUCT_INTERNAL(item, flist->fl_elem_class);
|
||||||
((lam_object_t *) item)->obj_class = flist->fl_elem_class;
|
|
||||||
((lam_object_t *) item)
|
|
||||||
->obj_class->cls_construct((lam_object_t *) item);
|
|
||||||
}
|
}
|
||||||
lam_list_append(&flist->super, item);
|
lam_list_append(&flist->super, item);
|
||||||
ptr += flist->fl_elem_size;
|
ptr += flist->fl_elem_size;
|
||||||
|
@ -451,10 +451,7 @@ static int lam_free_lists_create_more_elts(lam_free_lists_t *flist, int pool_idx
|
|||||||
current_loc = (char *) ptr;
|
current_loc = (char *) ptr;
|
||||||
for (desc = 0; desc < flist->fl_elt_per_chunk; desc++)
|
for (desc = 0; desc < flist->fl_elt_per_chunk; desc++)
|
||||||
{
|
{
|
||||||
/* bypass OBJ_CONSTRUCT() in this case (generic types) */
|
OBJ_CONSTRUCT_INTERNAL(current_loc, flist->fl_elt_cls);
|
||||||
((lam_object_t *) current_loc)->obj_class = flist->fl_elt_cls;
|
|
||||||
((lam_object_t *) current_loc)
|
|
||||||
->obj_class->cls_construct((lam_object_t *) current_loc);
|
|
||||||
current_loc += flist->fl_elt_size;
|
current_loc += flist->fl_elt_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user