Exemplo n.º 1
0
void TDThread::run()
{
	// loop wait  
	while (!m_b_is_finish)  
	{  
		std::function< void (void)> curr_task ;  
		bool bHasTasks = false;  
		m_list_tasks_mutex.lock();  
		if (m_list_tasks.empty()==false)  
		{  
			bHasTasks = true;  
			curr_task = *m_list_tasks.begin();  
		}
		m_list_tasks_mutex.unlock();  
		//doing task  
		if (bHasTasks)  
		{  
			curr_task();  
			m_list_tasks_mutex.lock();  
			m_list_tasks.pop_front();  
			m_list_tasks_mutex.unlock();  
		}
		if (!load() && !m_b_is_finish)  
		{
			std::unique_lock<std::mutex> m_cond_locker(m_cond_mutex);
			if(m_cond_incoming_task.wait_for(m_cond_locker, std::chrono::seconds(1)) == std::cv_status::timeout) {
				//LOGD("wait condition timeout");
			}
			//boost::system_time const timeout=boost::get_system_time()+ boost::posix_time::milliseconds(5000);  
			//if (m_cond_locker.mutex())  
			//	m_cond_incoming_task.timed_wait(m_cond_locker,timeout);//m_cond_incoming_task.wait(m_cond_locker);  
		}  
	}  
}
Exemplo n.º 2
0
static void cpufreq_limit_work(struct work_struct *work)
{
	struct cpufreq_limit_data *limit = container_of(work,
						struct cpufreq_limit_data, limit_work);
	struct task_struct *p = NULL, *t = NULL;
	char **s = limit->limit_name;
	char *comm = task_comm;
	int cpu, i = 0, len = limit->limit_num;

	if (!test_bit(STATE_RESUME_DONE, &limit->resume_state))
		goto _exit;

	task_comm[0] = 0;
	for_each_possible_cpu(cpu) {
     	p = curr_task(cpu);
	   	t = find_task_by_vpid(task_tgid_vnr(p));	/* parent */
     	if (t)
     		p = t;

   		if (p->flags & PF_KTHREAD)
			continue;

		if (!likely(p->mm))
			continue;

		cpufreq_cmdline(p, comm);
     	pr_debug("cpu %d  current (%d) %s\n", cpu, p->pid, comm);

		for (i = 0; len > i; i++) {
			/* boost : task is running */
			if (!strncmp(comm, s[i], strlen(s[i]))) {
				limit->time_stamp = 0;
				cpufreq_set_max_frequency(limit, 1);
				pr_debug(": run %s\n", s[i]);
				goto _exit;
			}
		}
	}

	for_each_process(p) {
   		if (p->flags & PF_KTHREAD)
			continue;

		if (!likely(p->mm))
			continue;

		cpufreq_cmdline(p, comm);
		for (i = 0; len > i; i++) {
			if (!strncmp(comm, s[i], strlen(s[i]))) {
				pr_debug("detect %s:%s [%ld.%ld ms]\n",
					s[i], comm, limit->time_stamp, limit->time_stamp%1000);

				limit->current_time_stamp = ktime_to_ms(ktime_get());
				if (0 == limit->time_stamp) {
					limit->time_stamp = limit->current_time_stamp;
				} else {
					/* restore : task is sleep status */
					if ((limit->current_time_stamp - limit->time_stamp) > limit->op_timeout)
						cpufreq_set_max_frequency(limit, 0);
				}
				goto _exit;
			}
		}
	}

	/* restore : not find task */
	cpufreq_set_max_frequency(limit, 0);
	limit->time_stamp = 0;

_exit:
	hrtimer_start(&limit->limit_timer, ms_to_ktime(limit->timer_duration),
		HRTIMER_MODE_REL_PINNED);
}