Exemplo n.º 1
0
static void *
listen_dltask_list(void *args)
{
        (void) args;
        int cnt = 0;
        log_info("come into download thread");
        while(1) {
            if (download_param.cached_dltask.task_list.size() != 0) {
                
                pthread_mutex_lock(&download_param.cached_dltask.lock);
                std::string task_str = download_param.cached_dltask.task_list.front();
                pthread_mutex_unlock(&download_param.cached_dltask.lock);

                bool dl_success = download_proc(task_str, download_param.sftp_conf);
                // download task really finished
                if (dl_success) {
                    pthread_mutex_lock(&download_param.cached_dltask.lock);
                    download_param.cached_dltask.task_list.pop_front();
                    pthread_mutex_unlock(&download_param.cached_dltask.lock);
                    ++finished_task;
                } else {
                    log_error("download tsk failed it will retry later");
                    nano_sleep(0,2e8);  // sleep 0.2 seconds
                }
                log_trace("finished tsk = %d, cached download task cnt = %d", 
                           finished_task, download_param.cached_dltask.task_list.size());
            } else {
                nano_sleep(0,2e8);      // sleep 0.2 seconds
            }
        }
        return NULL;
}
Exemplo n.º 2
0
uint64_t get_cpu_freq()
{
    uint64_t t1, t2;
    t1 = rdtsc();
    nano_sleep(1,0);
    t2 = rdtsc();
    return ((t2-t1)/1000000)*1000000;
}
Exemplo n.º 3
0
//限速功能
void limit_curr_rate(session_t *sess, int nbytes, int is_upload)
{
    //获取当前时间
    int curr_time_sec = get_curr_time_sec();
    int curr_time_usec = get_curr_time_usec();

    //求时间差
    double elapsed = 0.0;
    elapsed += (curr_time_sec - sess->start_time_sec);
    elapsed += (curr_time_usec - sess->start_time_usec) / (double)1000000;
    if(elapsed < 0.000001)    //double和0不能用==
        elapsed = 0.001;

    //求速度
    double curr_rate = nbytes / elapsed;

    //求比率
    double rate_radio = 0.0;
    if(is_upload)
    {
        //如果用户配置了限速,并且当前速度已经超过了限定速度
        if(sess->limits_max_upload > 0 && curr_rate > sess->limits_max_upload)
        {
            rate_radio = curr_rate / (sess->limits_max_upload);
        }
        else
        {
            //如果不限速,必须更新时间
            sess->start_time_sec = get_curr_time_sec();
            sess->start_time_usec = get_curr_time_usec();
            return;
        }
    }else
    {
        if(sess->limits_max_download > 0 && curr_rate > sess->limits_max_download)
        {
            rate_radio = curr_rate / (sess->limits_max_download);
        }
        else
        {
            //如果不限速,必须更新时间
            sess->start_time_sec = get_curr_time_sec();
            sess->start_time_usec = get_curr_time_usec();
            return;
        }
    }

    //求出限速时间
    double sleep_time = (rate_radio - 1) * elapsed;

    //限速睡眠
    if(nano_sleep(sleep_time) == -1)
        ERR_EXIT("nano_sleep");

    //注意更新当前时间
    sess->start_time_sec = get_curr_time_sec();
    sess->start_time_usec = get_curr_time_usec();
}
Exemplo n.º 4
0
static void deep_sleep(char *x) {
  time_t t = x_atoi(x);
  time_t deedline = time(0) + t;
  if (t<=0) return;
  if (cfg_verbose>1) msg("Sleeping: ", x);
  while (1) {
    nano_sleep(1,0);
    if (time(0) >= deedline) break;
  }
}
Exemplo n.º 5
0
void limit_rate(session_t* sess, int bytes_transfered, int is_upload)
{
	//transfering the data
	sess->data_process = 1;

	long curr_sec = get_time_sec();
	long curr_usec = get_time_usec();

	double elapsed;
	elapsed = curr_sec - sess->bw_transfer_start_sec;
	elapsed += (double)(curr_usec - sess->bw_transfer_start_usec) / (double)1000000;

	if(elapsed <= 0.0)
		elapsed = 0.01;

	//curr transfer speed
	unsigned int bw_rate = (unsigned int)((double)bytes_transfered / elapsed);
	
	double rate_ratio;
	if(is_upload)
	{
		if(bw_rate <= sess->bw_upload_rate_max)
		{
			sess->bw_transfer_start_sec = get_time_sec();
        		sess->bw_transfer_start_usec = get_time_usec();
			return;
		}
		rate_ratio = bw_rate / sess->bw_upload_rate_max;
	}
	else
	{
		if(bw_rate <= sess->bw_download_rate_max)
		{
			sess->bw_transfer_start_sec = get_time_sec();
        		sess->bw_transfer_start_usec = get_time_usec();
			return;
		}
		rate_ratio = bw_rate / sess->bw_download_rate_max;	
	}

	double pause_time;
	pause_time = (rate_ratio - 1.0)	* elapsed;
	nano_sleep(pause_time);

	sess->bw_transfer_start_sec = get_time_sec();
	sess->bw_transfer_start_usec = get_time_usec();
}
Exemplo n.º 6
0
void term_session()
{
    if (fd_conn==0) return;
    
    restore_ori_io();
    shell_thread_should_exit = 1;

    while (!shell_quit_occurred) nano_sleep(0, 10000000);

    close(fd_conn);
    close(fd_pty_slave);
    close(fd_pty_master);
    fd_conn=0;
    fd_pty_slave=0;
    fd_pty_master=0;
    shell_quit_occurred = 0;
    pty2sock_cache_len = 0;
}