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 void yr_set_tidx(int tidx) { yr_thread_storage_set_value(&tidx_key, (void*) (size_t) (tidx + 1)); }