コード例 #1
0
ファイル: dlist.c プロジェクト: Masshat/C_and_CPP
size_t   dlist_length(DList* thiz)
{
    size_t length = 0;

    return_val_if_fail(thiz != NULL, 0);

    dlist_rdlock(thiz);

    length = dlist_length_nolock(thiz);

    dlist_unlock(thiz);

    return length;
}
コード例 #2
0
ファイル: dlist.c プロジェクト: iDings/sysprog-code
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;
}