tb_void_t tb_async_transfer_pause(tb_async_transfer_ref_t transfer) { // check tb_async_transfer_impl_t* impl = (tb_async_transfer_impl_t*)transfer; tb_assert_and_check_return(impl); // pause it tb_atomic_pset(&impl->state_pause, TB_STATE_OK, TB_STATE_PAUSING); }
tb_void_t tb_thread_pool_task_kill(tb_thread_pool_ref_t pool, tb_thread_pool_task_ref_t task) { // check tb_thread_pool_job_t* job = (tb_thread_pool_job_t*)task; tb_assert_and_check_return(pool && job); // trace tb_trace_d("task[%p:%s]: kill: state: %s: ..", job->task.done, job->task.name, tb_state_cstr(tb_atomic_get(&job->state))); // kill it if be waiting tb_atomic_pset(&job->state, TB_STATE_WAITING, TB_STATE_KILLING); }
/* ////////////////////////////////////////////////////////////////////////////////////// * jobs implementation */ static tb_bool_t tb_thread_pool_jobs_walk_kill_all(tb_pointer_t item, tb_cpointer_t priv) { // check tb_thread_pool_job_t* job = (tb_thread_pool_job_t*)item; tb_assert_and_check_return_val(job, tb_false); // trace tb_trace_d("task[%p:%s]: kill: ..", job->task.done, job->task.name); // kill it if be waiting tb_atomic_pset(&job->state, TB_STATE_WAITING, TB_STATE_KILLING); // ok return tb_true; }
tb_bool_t tb_async_transfer_resume(tb_async_transfer_ref_t transfer) { // check tb_async_transfer_impl_t* impl = (tb_async_transfer_impl_t*)transfer; tb_assert_and_check_return_val(impl && impl->aicp, tb_false); // done tb_bool_t ok = tb_false; tb_size_t state_pause = TB_STATE_OK; do { // must be opened? tb_check_break(TB_STATE_OPENED == tb_atomic_get(&impl->state)); // resume it tb_size_t state_pause = tb_atomic_fetch_and_set(&impl->state_pause, TB_STATE_OK); // pausing or ok? return ok directly tb_check_return_val(state_pause == TB_STATE_PAUSED, tb_true); // check tb_assert_and_check_break(impl->istream); tb_assert_and_check_break(impl->ostream); // init some rate info impl->done.base_time = tb_aicp_time(impl->aicp); impl->done.base_time1s = impl->done.base_time; impl->done.saved_size1s = 0; impl->done.current_rate = 0; // read it if (!tb_async_stream_read(impl->istream, (tb_size_t)tb_atomic_get(&impl->limited_rate), tb_async_transfer_istream_read_func, impl)) break; // ok ok = tb_true; } while (0); // failed? restore state if (!ok && state_pause != TB_STATE_OK) tb_atomic_pset(&impl->state_pause, TB_STATE_OK, state_pause); // ok? return ok; }