void belle_sip_object_unref(void *ptr){ belle_sip_object_t *obj=BELLE_SIP_OBJECT(ptr); if (obj->ref==-1) belle_sip_fatal("Object with name [%s] freed twice !",obj->name); if (obj->ref==0 && obj->pool){ belle_sip_object_pool_remove(obj->pool,obj); obj->ref=-1; belle_sip_object_delete(obj); return; } obj->ref--; if (obj->ref==0){ obj->ref=-1; belle_sip_object_delete(obj); } }
void belle_sip_object_unref(void *ptr){ belle_sip_object_t *obj=BELLE_SIP_OBJECT(ptr); if (obj->ref==-1) { belle_sip_error("Object [%p] freed twice !",obj); if (obj->vptr && obj->vptr->type_name) belle_sip_error("Object type might be [%s]",obj->vptr->type_name); if (obj->name) belle_sip_error("Object name might be [%s]",obj->name); belle_sip_fatal("Fatal object error encountered, aborting."); return; } if (obj->ref==0 && obj->pool){ belle_sip_object_pool_remove(obj->pool,obj); obj->ref=-1; belle_sip_object_delete(obj); return; } obj->ref--; if (obj->ref==0){ obj->ref=-1; belle_sip_object_delete(obj); } }
void belle_sip_object_pool_clean(belle_sip_object_pool_t *pool){ belle_sip_list_t *elem,*next; if (!belle_sip_object_pool_cleanable(pool)){ belle_sip_warning("Thread pool [%p] cannot be cleaned from thread [%lu] because it was created for thread [%lu]", pool,belle_sip_thread_self_id(),(unsigned long)pool->thread_id); return; } for(elem=pool->objects;elem!=NULL;elem=next){ belle_sip_object_t *obj=(belle_sip_object_t*)elem->data; if (obj->ref==0){ belle_sip_message("Garbage collecting unowned object of type %s",obj->vptr->type_name); obj->ref=-1; belle_sip_object_delete(obj); next=elem->next; belle_sip_free(elem); }else { belle_sip_fatal("Object %p is in unowned list but with ref count %i, bug.",obj,obj->ref); next=elem->next; } } pool->objects=NULL; }