task_ptr rpc::create_rpc_response_task(dsn_message_t request, clientlet* svc, empty_callback_t, int reply_hash) { task_ptr tsk = new safe_task_handle; //do not add_ref here auto t = dsn_rpc_create_response_task( request, nullptr, nullptr, reply_hash, svc ? svc->tracker() : nullptr ); tsk->set_task_info(t); return tsk; }
task_ptr call( const dsn_address_t& server, dsn_message_t request, servicelet* owner, rpc_reply_handler callback, int reply_hash ) { task_ptr tsk = new safe_task<rpc_reply_handler >(callback); if (callback != nullptr) tsk->add_ref(); // released in exec_rpc_response auto t = dsn_rpc_create_response_task( request, callback != nullptr ? safe_task<rpc_reply_handler >::exec_rpc_response : nullptr, (void*)tsk, reply_hash ); tsk->set_task_info(t); dsn_rpc_call(server, t, owner ? owner->tracker() : nullptr); return tsk; }
DSN_PY_API dsn_task_t dsn_rpc_create_response_task_helper(dsn_message_t msg, uint64_t param, int reply_hash, dsn_task_tracker_t tracker) { return dsn_rpc_create_response_task(msg, rpc_response_handler, (void *)param, reply_hash, nullptr); // set tracker null }