task_ptr enqueue( dsn_task_code_t evt, servicelet *context, task_handler callback, int hash /*= 0*/, int delay_milliseconds /*= 0*/, int timer_interval_milliseconds /*= 0*/ ) { dsn_task_t t; task_ptr tsk = new safe_task<task_handler>(callback, timer_interval_milliseconds != 0); tsk->add_ref(); // released in exec callback if (timer_interval_milliseconds != 0) { t = dsn_task_create_timer(evt, safe_task<task_handler>::exec, tsk, hash, timer_interval_milliseconds); } else { t = dsn_task_create(evt, safe_task<task_handler>::exec, tsk, hash); } tsk->set_task_info(t); dsn_task_call(t, context ? context->tracker() : nullptr, delay_milliseconds); return tsk; }
void rpc_session::start_read_next(int read_next) { // server only if (!is_client()) { int delay_ms = 0; { utils::auto_lock<utils::ex_lock_nr> l(_lock); delay_ms = _delay_server_receive_ms; _delay_server_receive_ms = 0; } // delayed read if (delay_ms > 0) { auto delay_task = dsn_task_create( LPC_DELAY_RPC_REQUEST_RATE, __delayed_rpc_session_read_next__, this ); this->add_ref(); // released in __delayed_rpc_session_read_next__ dsn_task_call(delay_task, delay_ms); } else { do_read(read_next); } } else { do_read(read_next); } }
TEST(core, lpc) { std::string result; auto t = dsn_task_create(LPC_TEST_HASH, on_lpc_test, (void*)&result, 1); dsn_task_add_ref(t); dsn_task_call(t, 0); dsn_task_wait(t); dsn_task_release_ref(t); EXPECT_TRUE(result.substr(0, result.length() - 2) == "client.THREAD_POOL_TEST_SERVER"); }
DSN_PY_API void dsn_task_call_helper(dsn_task_t task, int delay_milliseconds) { return dsn_task_call(task, delay_milliseconds); }