Lines Matching defs:depot

103 alloc_magazine(object_depot* depot, uint32 flags)
106 sizeof(DepotMagazine) + depot->magazine_capacity * sizeof(void*),
111 magazine->round_count = depot->magazine_capacity;
126 empty_magazine(object_depot* depot, DepotMagazine* magazine, uint32 flags)
129 depot->return_object(depot, depot->cookie, magazine->rounds[i], flags);
135 exchange_with_full(object_depot* depot, DepotMagazine*& magazine)
139 SpinLocker _(depot->inner_lock);
141 if (depot->full == NULL)
144 depot->full_count--;
145 depot->empty_count++;
147 _push(depot->empty, magazine);
148 magazine = _pop(depot->full);
154 exchange_with_empty(object_depot* depot, DepotMagazine*& magazine,
159 SpinLocker _(depot->inner_lock);
161 if (depot->empty == NULL)
164 depot->empty_count--;
167 if (depot->full_count < depot->max_count) {
168 _push(depot->full, magazine);
169 depot->full_count++;
175 magazine = _pop(depot->empty);
181 push_empty_magazine(object_depot* depot, DepotMagazine* magazine)
183 SpinLocker _(depot->inner_lock);
185 _push(depot->empty, magazine);
186 depot->empty_count++;
191 object_depot_cpu(object_depot* depot)
193 return &depot->stores[smp_get_current_cpu()];
201 object_depot_init(object_depot* depot, size_t capacity, size_t maxCount,
202 uint32 flags, void* cookie, void (*return_object)(object_depot* depot,
205 depot->full = NULL;
206 depot->empty = NULL;
207 depot->full_count = depot->empty_count = 0;
208 depot->max_count = maxCount;
209 depot->magazine_capacity = capacity;
211 rw_lock_init(&depot->outer_lock, "object depot");
212 B_INITIALIZE_SPINLOCK(&depot->inner_lock);
215 depot->stores = (depot_cpu_store*)slab_internal_alloc(
217 if (depot->stores == NULL) {
218 rw_lock_destroy(&depot->outer_lock);
223 depot->stores[i].loaded = NULL;
224 depot->stores[i].previous = NULL;
227 depot->cookie = cookie;
228 depot->return_object = return_object;
235 object_depot_destroy(object_depot* depot, uint32 flags)
237 object_depot_make_empty(depot, flags);
239 slab_internal_free(depot->stores, flags);
241 rw_lock_destroy(&depot->outer_lock);
246 object_depot_obtain(object_depot* depot)
248 ReadLocker readLocker(depot->outer_lock);
251 depot_cpu_store* store = object_depot_cpu(depot);
258 // and finally from the Slab if the magazine depot has no full magazines.
269 || exchange_with_full(depot, store->previous))) {
278 object_depot_store(object_depot* depot, void* object, uint32 flags)
280 ReadLocker readLocker(depot->outer_lock);
283 depot_cpu_store* store = object_depot_cpu(depot);
287 // the magazine depot doesn't provide us with a new empty magazine
296 || exchange_with_empty(depot, store->previous, freeMagazine)) {
304 empty_magazine(depot, freeMagazine, flags);
309 store = object_depot_cpu(depot);
316 DepotMagazine* magazine = alloc_magazine(depot, flags);
318 depot->return_object(depot, depot->cookie, object, flags);
325 push_empty_magazine(depot, magazine);
326 store = object_depot_cpu(depot);
333 object_depot_make_empty(object_depot* depot, uint32 flags)
335 WriteLocker writeLocker(depot->outer_lock);
343 depot_cpu_store& store = depot->stores[i];
356 // detach the depot's full and empty magazines
358 DepotMagazine* fullMagazines = depot->full;
359 depot->full = NULL;
361 DepotMagazine* emptyMagazines = depot->empty;
362 depot->empty = NULL;
369 empty_magazine(depot, _pop(storeMagazines), flags);
372 empty_magazine(depot, _pop(fullMagazines), flags);
382 object_depot_contains_object(object_depot* depot, void* object)
384 WriteLocker writeLocker(depot->outer_lock);
388 depot_cpu_store& store = depot->stores[i];
401 for (DepotMagazine* magazine = depot->full; magazine != NULL;
417 dump_object_depot(object_depot* depot)
419 kprintf(" full: %p, count %lu\n", depot->full, depot->full_count);
420 kprintf(" empty: %p, count %lu\n", depot->empty, depot->empty_count);
421 kprintf(" max full: %lu\n", depot->max_count);
422 kprintf(" capacity: %lu\n", depot->magazine_capacity);
428 kprintf(" [%d] loaded: %p\n", i, depot->stores[i].loaded);
429 kprintf(" previous: %p\n", depot->stores[i].previous);