void BaseDepot::MakeEmpty() { for (int i = 0; i < smp_get_num_cpus(); i++) { if (fStores[i].loaded) _EmptyMagazine(fStores[i].loaded); if (fStores[i].previous) _EmptyMagazine(fStores[i].previous); fStores[i].loaded = fStores[i].previous = NULL; } while (fFull) _EmptyMagazine(SListPop(fFull)); while (fEmpty) _EmptyMagazine(SListPop(fEmpty)); }
bool BaseDepot::_ExchangeWithFull(Magazine* &magazine) { BenaphoreLocker _(fLock); if (fFull == NULL) return false; fFullCount--; fEmptyCount++; SListPush(fEmpty, magazine); magazine = SListPop(fFull); return true; }
BaseCache::ObjectLink *BaseCache::AllocateObject() { Slab *slab = fPartialSlabs.Head(); printf("BaseCache::AllocateObject() from %p, %lu remaining\n", slab, slab->count); ObjectLink *link = SListPop(slab->free); slab->count--; if (slab->count == 0) { // move the partial slab to the full list fPartialSlabs.Remove(slab); fFullSlabs.Add(slab); } return link; }
bool BaseDepot::_ExchangeWithEmpty(Magazine* &magazine) { BenaphoreLocker _(fLock); if (fEmpty == NULL) { fEmpty = _AllocMagazine(); if (fEmpty == NULL) return false; } else { fEmptyCount--; } if (magazine) { SListPush(fFull, magazine); fFullCount++; } magazine = SListPop(fEmpty); return true; }
static int write_relation(SDatasource *ds, const SRelation *rel, int num_tiers, float end_time, s_erc *error) { const char *relname; const SItem *head = NULL; const char *tier_header = "\titem [%d]:\n\t\tclass = \"IntervalTier\"\n\t\tname = \"%s\"\n"; const char *tier_start_end = "\t\txmin = 0\n\t\txmax = %f\n"; const char *tier_intervals = "\t\tintervals: size = %d\n"; const char *tier_item = " \t\tintervals [%d]:\n\t\t\txmin = %f\n\t\t\txmax = %f\n\t\t\ttext = \"%s\"\n"; char *buff; size_t str_size; float prev_end = 0.0; const SItem *itr; float item_start = 0.0; float item_end = 0.0; const char *item_name = NULL; SList *info; size_t l_size; int counter; SIterator *litr; S_CLR_ERR(error); if (rel == NULL) return num_tiers; num_tiers += 1; relname = SRelationName(rel, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SRelationName\" failed")) return 0; head = SRelationHead(rel, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SRelationHead\" failed")) return 0; /* tier header */ s_asprintf(&buff, error, tier_header, num_tiers, relname); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_asprintf\" failed")) return 0; str_size = s_strsize(buff, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_strsize\" failed")) { S_FREE(buff); return 0; } SDatasourceWrite(ds, buff, sizeof(char), str_size, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SDatasourceWrite\" failed")) { S_FREE(buff); return 0; } S_FREE(buff); /* start time and end time (always 0 and utt end) */ s_asprintf(&buff, error, tier_start_end, end_time); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_asprintf\" failed")) return 0; str_size = s_strsize(buff, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_strsize\" failed")) { S_FREE(buff); return 0; } SDatasourceWrite(ds, buff, sizeof(char), str_size, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SDatasourceWrite\" failed")) { S_FREE(buff); return 0; } S_FREE(buff); info = S_LIST(S_NEW(SListList, error)); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Failed to create new list for info cache")) return 0; prev_end = 0.0; itr = head; while (itr != NULL) { item_start = get_start(itr, relname, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"get_start\" failed")) { S_DELETE(info, "write_relation", error); return 0; } item_end = get_end(itr, relname, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"get_end\" failed")) { S_DELETE(info, "write_relation", error); return 0; } if (!s_float_equal(item_start, prev_end)) { /* prepend extra "SIL" */ add_info(info, prev_end, item_start, "SIL", error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"add_info\" failed")) { S_DELETE(info, "write_relation", error); return 0; } } item_name = SItemGetName(itr, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SItemGetName\" failed")) { S_DELETE(info, "write_relation", error); return 0; } add_info(info, item_start, item_end, item_name, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"add_info\" failed")) { S_DELETE(info, "write_relation", error); return 0; } prev_end = item_end; itr = SItemNext(itr, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SItemNext\" failed")) { S_DELETE(info, "write_relation", error); return 0; } } if (!s_float_equal(item_end, end_time)) { add_info(info, item_end, end_time, "SIL", error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"add_info\" failed")) { S_DELETE(info, "write_relation", error); return 0; } } l_size = SListSize(info, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SListSize\" failed")) { S_DELETE(info, "write_relation", error); return 0; } /* tier intervals */ s_asprintf(&buff, error, tier_intervals, l_size); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_asprintf\" failed")) { S_DELETE(info, "write_relation", error); return 0; } str_size = s_strsize(buff, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_strsize\" failed")) { S_FREE(buff); S_DELETE(info, "write_relation", error); return 0; } SDatasourceWrite(ds, buff, sizeof(char), str_size, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SDatasourceWrite\" failed")) { S_FREE(buff); S_DELETE(info, "write_relation", error); return 0; } S_FREE(buff); litr = S_ITERATOR_GET(info, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"S_ITERATOR_GET\" failed")) { S_DELETE(info, "write_relation", error); return 0; } for (counter = 1; litr != NULL; litr = SIteratorNext(litr), counter++) { SList *itemList; SObject *tmp; char *name; itemList = S_LIST(SIteratorObject(litr, error)); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SIteratorObject\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); return 0; } tmp = SListPop(itemList, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SIteratorObject\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); return 0; } item_name = SObjectGetString(tmp, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SObjectGetString\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_DELETE(tmp, "write_relation", error); return 0; } name = s_strdup(item_name, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_strdup\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_DELETE(tmp, "write_relation", error); return 0; } S_DELETE(tmp, "write_relation", error); tmp = SListPop(itemList, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SIteratorObject\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_FREE(name); return 0; } item_end = SObjectGetFloat(tmp, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SObjectGetFloat\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_DELETE(tmp, "write_relation", error); S_FREE(name); return 0; } S_DELETE(tmp, "write_relation", error); tmp = SListPop(itemList, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SIteratorObject\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_FREE(name); return 0; } item_start = SObjectGetFloat(tmp, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SObjectGetFloat\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_DELETE(tmp, "write_relation", error); S_FREE(name); return 0; } S_DELETE(tmp, "write_relation", error); /* tier item */ s_asprintf(&buff, error, tier_item, counter, item_start, item_end, name); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_asprintf\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_FREE(name); return 0; } str_size = s_strsize(buff, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_strsize\" failed")) { S_FREE(buff); S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_FREE(name); return 0; } SDatasourceWrite(ds, buff, sizeof(char), str_size, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SDatasourceWrite\" failed")) { S_FREE(buff); S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_FREE(name); return 0; } S_FREE(buff); S_FREE(name); } S_DELETE(info, "write_relation", error); return num_tiers; }