Esempio n. 1
0
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);
}
Esempio n. 2
0
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
                );
        }
Esempio n. 4
0
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();
}
Esempio n. 5
0
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);
    }
}