Ret dlist_insert(DList* thiz, size_t index, void* data) { Ret ret = RET_OK; DListNode* node = NULL; DListNode* cursor = NULL; return_val_if_fail(thiz != NULL, RET_INVALID_PARAMS); dlist_wrlock(thiz); do { if((node = dlist_create_node(thiz, data)) == NULL) { ret = RET_OOM; break; } if(thiz->first == NULL) { thiz->first = node; break; } cursor = dlist_get_node(thiz, index, 1); if(index < dlist_length_nolock(thiz)) { node->next = cursor; if(cursor->prev != NULL) { cursor->prev->next = node; } cursor->prev = node; if(thiz->first == cursor) { thiz->first = node; } } else { cursor->next = node; node->prev = cursor; } } while(0); dlist_unlock(thiz); return ret; }
Ret dlist_set_by_index(DList* thiz, size_t index, void* data) { DListNode* cursor = NULL; return_val_if_fail(thiz != NULL, RET_INVALID_PARAMS); dlist_wrlock(thiz); cursor = dlist_get_node(thiz, index, 0); if (cursor != NULL) { cursor->data = data; } dlist_unlock(thiz); return cursor != NULL ? RET_OK : RET_INVALID_PARAMS; }
Ret dlist_delete(DList* thiz, size_t index) { Ret ret = RET_OK; DListNode* cursor = NULL; return_val_if_fail(thiz != NULL, RET_INVALID_PARAMS); dlist_wrlock(thiz); cursor = dlist_get_node(thiz, index, 0); do { if(cursor == NULL) { ret = RET_INVALID_PARAMS; break; } if(cursor != NULL) { if(cursor == thiz->first) { thiz->first = cursor->next; } if(cursor->next != NULL) { cursor->next->prev = cursor->prev; } if(cursor->prev != NULL) { cursor->prev->next = cursor->next; } dlist_destroy_node(thiz, cursor); } } while(0); dlist_unlock(thiz); return RET_OK; }
void dlist_destroy(DList* thiz) { DListNode* iter = NULL; DListNode* next = NULL; return_if_fail(thiz != NULL); dlist_wrlock(thiz); iter = thiz->first; while (iter != NULL) { next = iter->next; dlist_destroy_node(thiz, iter); iter = next; } thiz->first = NULL; dlist_destroy_locker(thiz); SAFE_FREE(thiz); return; }