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); } } }
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); }