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; }
uint64_t get_cpu_freq() { uint64_t t1, t2; t1 = rdtsc(); nano_sleep(1,0); t2 = rdtsc(); return ((t2-t1)/1000000)*1000000; }
//限速功能 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(); }
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; } }
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(); }
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; }