typename VISITOR::return_type invoke_worker(VISITOR visitoz, std::type_index active_type, packed_union<T, Ts...> packed_uny) { if(std::type_index(typeid(T)) == active_type) { visitoz(packed_uny.uny.car); } else { invoke_worker(visitoz, active_type, packed_uny.uny.cdr); } }
static void process_impl(uv_work_t * work_req) { Worker & worker = *static_cast<Worker *>(work_req->data); worker.error = keyword::undefined; try { // call process w/ stored args invoke_worker(&Worker::process, worker, worker.stored_args); } catch (std::exception const& x) { // store error worker.error = x.what(); } catch (...) { // store unknown error worker.error = "Unknown error."; } }
int ArtExecutionContext::svc(void) { int usec(m_period.sec() * 1000000 + m_period.usec()); if (art_enter(ART_PRIO_MAX-1, ART_TASK_PERIODIC, usec) == -1) { std::cerr << "fatal error: art_enter" << std::endl; } do { std::for_each(m_comps.begin(), m_comps.end(), invoke_worker()); // while (!m_running) {ACE_OS::sleep(tv);} if (art_wait() == -1) { std::cerr << "fatal error: art_wait " << std::endl; } } while (m_running); if (art_exit() == -1) { std::cerr << "fatal error: art_exit" << std::endl; } return 0; }
typename VISITOR::return_type invoke(VISITOR visitoz, algebraic_datatype<T1, Ts...> ad) { invoke_worker(visitoz, ad.active_type, ad.packed_uny); }
/*! * @if jp * @brief ExecutionContext 用のスレッド実行関数 * @else * @brief Thread execution function for ExecutionContext * @endif */ int RTPreemptEC::svc(void) { // schedulaer setting struct sched_param param; param.sched_priority = m_priority; if(sched_setscheduler(0, m_policy, ¶m) == -1) { std::cerr << "sched_setscheduler failed" << std::endl; return -1; } // memory locking if(mlockall(MCL_CURRENT | MCL_FUTURE) == -1) { std::cerr << "mlockall failed" << std::endl; return -1; } // stack preallocation unsigned char dummy[MAX_SAFE_STACK]; memset(&dummy, 0, MAX_SAFE_STACK); struct timespec t0, t1, t; do { clock_gettime(CLOCK_MONOTONIC ,&t0); m_worker.mutex_.lock(); while (!m_worker.running_) { m_worker.cond_.wait(); } if (m_worker.running_) { std::for_each(m_comps.begin(), m_comps.end(), invoke_worker()); } m_worker.mutex_.unlock(); clock_gettime(CLOCK_MONOTONIC ,&t1); if (!m_nowait) { if (t0.tv_nsec > t1.tv_nsec) { t.tv_nsec = m_period.usec() * 1000 - (NSEC_PER_SEC - t0.tv_nsec + t1.tv_nsec) + m_waitoffset; t.tv_sec = m_period.sec() - (t1.tv_sec - 1 - t0.tv_sec); } else { t.tv_nsec = m_period.usec() * 1000 - (t1.tv_nsec - t0.tv_nsec) + m_waitoffset; t.tv_sec = m_period.sec() - (t1.tv_sec - t0.tv_sec); } if (t.tv_nsec < 0 || t.tv_sec < 0) { std::cerr << "faital error: deadline passed. " << std::endl; std::cerr << "Wait time: "; std::cerr << t.tv_sec << "[s], "; std::cerr << t.tv_nsec << "[ns]" << std::endl; std::cerr << "Next wait time force to: 0.0 [s]" << std::endl; continue; } clock_nanosleep(CLOCK_MONOTONIC, !TIMER_ABSTIME, &t, NULL); } } while (m_svc); return 0; }