int yr_re_finalize_thread(void) { RE_FIBER* fiber; RE_FIBER* next_fiber; RE_THREAD_STORAGE* storage; if (thread_storage_key != 0) storage = (RE_THREAD_STORAGE*) yr_thread_storage_get_value( &thread_storage_key); else return ERROR_SUCCESS; if (storage != NULL) { fiber = storage->fiber_pool.fibers.head; while (fiber != NULL) { next_fiber = fiber->next; yr_free(fiber); fiber = next_fiber; } yr_free(storage); } return yr_thread_storage_set_value(&thread_storage_key, NULL); }
int _yr_re_alloc_storage( RE_THREAD_STORAGE** storage) { *storage = (RE_THREAD_STORAGE*) yr_thread_storage_get_value( &thread_storage_key); if (*storage == NULL) { *storage = (RE_THREAD_STORAGE*) yr_malloc(sizeof(RE_THREAD_STORAGE)); if (*storage == NULL) return ERROR_INSUFICIENT_MEMORY; (*storage)->fiber_pool.fiber_count = 0; (*storage)->fiber_pool.fibers.head = NULL; (*storage)->fiber_pool.fibers.tail = NULL; FAIL_ON_ERROR( yr_thread_storage_set_value(&thread_storage_key, *storage)); } return ERROR_SUCCESS; }
YR_API int yr_get_tidx(void) { return (int) (size_t) yr_thread_storage_get_value(&tidx_key) - 1; }