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(); }
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(); }