Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}