Пример #1
0
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);
    }
}
Пример #2
0
 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;
  }
Пример #4
0
typename VISITOR::return_type invoke(VISITOR visitoz, algebraic_datatype<T1, Ts...> ad)
{
    invoke_worker(visitoz, ad.active_type, ad.packed_uny);
}
Пример #5
0
  /*!
   * @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, &param) == -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;
  }