void SEStringList::d_unref()
{
    if (0 == d)
        return;

    SEMutex* lock = &d->lock;

    lock->Acquire();

    if (d->ref > 1)
        d->ref--;
    else {
        Data* tmp_d = d;
        d = 0;
        lock->Release();

        Element* tmp = tmp_d->list;

        while (tmp) {
            Element* next = tmp->next;

            delete tmp;

            tmp = next;
        }

        if (tmp_d->quick_list)
            delete[] tmp_d->quick_list;

        delete tmp_d;
        return;
    }

    lock->Release();
}
Example #2
0
void SEPtrDict::d_unref()
{
        if (0 == d)
                return;

        SEMutex* lock = &d->lock;
        
        lock->Acquire(); 

        if (d->ref > 1)
                d->ref--;
        else {
                Data* tmp_d = d;                
                d = 0;
                
                lock->Release();

                for (size_t n = 0; n < SIZE; n++) {
                        while (tmp_d->dict[n]) {
                                Element* tmp = tmp_d->dict[n]->next;

                                delete tmp_d->dict[n];

                                tmp_d->dict[n] = tmp;
                        }
                }

                if (tmp_d->quick_list)
                        delete[] tmp_d->quick_list;

                delete tmp_d;
                
                return; 
        }
        
        lock->Release();
}
void SERefList::d_unref()
{
    if (0 == d)
        return;

    SEMutex* lock = &d->lock;

    lock->Acquire();

    if (d->ref > 1)
        d->ref--;
    else {
        Element* tmp = d->list;

        while (tmp) {
            Element* next = tmp->next;

            delete tmp;

            tmp = next;
        }

        if (d->quick_list)
            delete[] d->quick_list;

        Data* keep = d;
        d = 0;
        lock->Release();
        delete keep;



        return;
    }

    lock->Release();
}