NORETURN cilk_fiber_sysdep::jump_to_resume_other_sysdep(cilk_fiber_sysdep* other) { #if SUPPORT_GET_CURRENT_FIBER cilkos_set_tls_cilk_fiber(other); #endif CILK_ASSERT(!this->is_resumable()); // Jump to the other fiber. But we are never coming back because // this fiber is being reset. resume_other_sysdep(other); // We should never come back here... __cilkrts_bug("Should not get here"); }
void cilk_fiber_sysdep::suspend_self_and_resume_other_sysdep(cilk_fiber_sysdep* other) { #if SUPPORT_GET_CURRENT_FIBER cilkos_set_tls_cilk_fiber(other); #endif CILK_ASSERT(this->is_resumable()); // Jump to the other fiber. We expect to come back. if (! CILK_SETJMP(m_resume_jmpbuf)) { resume_other_sysdep(other); } // Return here when another fiber resumes me. // If the fiber that switched to me wants to be deallocated, do it now. do_post_switch_actions(); }
cilk_fiber* cilk_fiber::allocate_from_thread() { void* retmem = __cilkrts_malloc(sizeof(cilk_fiber_sysdep)); CILK_ASSERT(retmem); cilk_fiber_sysdep* ret = ::new(retmem) cilk_fiber_sysdep(from_thread); // A fiber allocated from a thread begins with a reference count // of 2. The first is for being created, and the second is for // being running. // // Suspending this fiber will decrement the count down to 1. ret->init_ref_count(2); #if SUPPORT_GET_CURRENT_FIBER // We're creating the main fiber for this thread. Set this fiber as the // current fiber. cilkos_set_tls_cilk_fiber(ret); #endif return ret; }
int cilk_fiber::deallocate_from_thread() { CILK_ASSERT(this->is_allocated_from_thread()); #if SUPPORT_GET_CURRENT_FIBER CILK_ASSERT(this == cilkos_get_tls_cilk_fiber()); // Reverse of "allocate_from_thread". cilkos_set_tls_cilk_fiber(NULL); #endif this->assert_ref_count_at_least(2); // Suspending the fiber should conceptually decrement the ref // count by 1. cilk_fiber_sysdep* self = this->sysdep(); self->convert_fiber_back_to_thread(); // Then, freeing the fiber itself decrements the ref count again. int ref_count = this->sub_from_ref_count(2); if (ref_count == 0) { self->~cilk_fiber_sysdep(); __cilkrts_free(self); } return ref_count; }