void scheduler::add_task(task_ptr& tsk, task_queue* q) { auto ts = task_ext::get_inited(tsk.get()); ts->queue = q; auto delay = (uint64_t)tsk->delay_milliseconds() * 1000000; tsk->set_delay(0); _wheel.add_event(now_ns() + delay, tsk); }
int run() { timer_srv.reset(new boost::asio::io_service()); the_net.reset(new net_server<koko_socket>(2)); boost::system::error_code ec; the_config.load_from_file(); db_.reset(new utf8_data_base(the_config.accdb_host_, the_config.accdb_user_,the_config.accdb_pwd_, the_config.accdb_name_)); if(!db_->grabdb()){ glb_log.write_log("database start failed!!!!"); return -1; } db_delay_helper_[0].set_db_ptr(db_); if (start_network() != 0){ goto _EXIT; } { boost::shared_ptr<boost::thread> td(new boost::thread(boost::bind(db_thread_func, db_delay_helper_))); cache_persistent_threads.push_back(td); } int idle_count = 0; task_on_5sec* ptask = new task_on_5sec(*timer_srv); task.reset(ptask); ptask->schedule(1000); ptask->routine(); while(!glb_exit) { bool busy = false; timer_srv->reset(); timer_srv->poll(); the_net->ios_.reset(); the_net->ios_.poll(); handle_pending_logins(); pickup_player_msgs(busy); handle_player_msgs(); update_players(); smsg_ptr pmsg; broadcast_msg_.pop_front(pmsg); if(pmsg.get()) broadcast_msg(pmsg); boost::posix_time::milliseconds ms(20); boost::this_thread::sleep(ms); } _EXIT: return 0; }
static void __err_cb_bind_and_enqueue( task_ptr lock_task, error_code err, int delay_milliseconds = 0 ) { auto t = dynamic_cast<safe_late_task<meta_state_service::err_callback>*>(lock_task.get()); t->bind_and_enqueue( [&](meta_state_service::err_callback& cb) { return bind(cb, err); }, delay_milliseconds ); }
void clean() { task.reset(); for (unsigned int i = 0 ; i < cache_persistent_threads.size(); i++) { cache_persistent_threads[i]->join(); } //继续执行没保存完的sql语句 db_delay_helper_[0].pop_and_execute(); timer_srv->stop(); timer_srv.reset(); the_net->stop(); the_net.reset(); glb_log.stop_log(); }
void sim_task_queue::enqueue(task_ptr& task) { if (0 == task->delay_milliseconds()) { if (_tasks.size() > 0) { do { int random_pos = ::dsn::service::env::random32(0, 1000000); auto pr = _tasks.insert(std::map<uint32_t, task_ptr>::value_type(random_pos, task)); if (pr.second) break; } while (true); } else { int random_pos = ::dsn::service::env::random32(0, 1000000); _tasks.insert(std::map<uint32_t, task_ptr>::value_type(random_pos, task)); } } else { scheduler::instance().add_task(task, this); } }