示例#1
0
    void
    Periodic::onMain(void)
    {
      double now = Time::Clock::get();
      double delay = (1 / m_frequency);
      double next_inv = now + delay;
      m_run_time = now;

      while (!stopping())
      {
        delay = (1.0 / m_frequency);

        if (next_inv > now)
          Time::Delay::wait(next_inv - now);

        next_inv += delay;
        now = Time::Clock::get();
        m_run_time = now;

        // Perform job.
        consumeMessages();
        if (!stopping())
        {
          task();
          ++m_run_count;
        }

        now = Time::Clock::get();
      }
    }
示例#2
0
static void *send_thread(void *data)
{
	struct rtmp_stream *stream = data;

	os_set_thread_name("rtmp-stream: send_thread");

	while (os_sem_wait(stream->send_sem) == 0) {
		struct encoder_packet packet;

		if (stopping(stream) && stream->stop_ts == 0) {
			break;
		}

		if (!get_next_packet(stream, &packet))
			continue;

		if (stopping(stream)) {
			if (can_shutdown_stream(stream, &packet)) {
				obs_free_encoder_packet(&packet);
				break;
			}
		}

		if (!stream->sent_headers) {
			if (!send_headers(stream)) {
				os_atomic_set_bool(&stream->disconnected, true);
				break;
			}
		}

		if (send_packet(stream, &packet, false, packet.track_idx) < 0) {
			os_atomic_set_bool(&stream->disconnected, true);
			break;
		}
	}

	if (disconnected(stream)) {
		info("Disconnected from %s", stream->path.array);
	} else {
		info("User stopped the stream");
	}

	RTMP_Close(&stream->rtmp);

	if (!stopping(stream)) {
		pthread_detach(stream->send_thread);
		obs_output_signal_stop(stream->output, OBS_OUTPUT_DISCONNECTED);
	} else {
		obs_output_end_data_capture(stream->output);
	}

	free_packets(stream);
	os_event_reset(stream->stop_event);
	os_atomic_set_bool(&stream->active, false);
	stream->sent_headers = false;
	return NULL;
}
int ThreadedAudioDevice::doStop()
{
	if (!stopping()) {
		PRINT1("\tThreadedAudioDevice::doStop\n");
		stopping(true);		// signals play thread
		paused(false);
		waitForThread();
		starting(false);
	}
	return 0;
}
 void AdmittanceController::setMode(unsigned int mode) {
     if (mode_ != mode) {
         stopping();
         mode_ = mode;
         starting();
     }
 }
int ThreadedAudioDevice::waitForDevice(unsigned int wTime) {
	int ret;
	unsigned waitSecs = int(wTime / 1000.0);
	unsigned waitUsecs = 1000 * (wTime - unsigned(waitSecs * 1000));
	// Wait wTime msecs for select to return, then bail.
	if (!stopping()) {
		int nfds = _device + 1;
		struct timeval tv;
		tv.tv_sec = waitSecs;
		tv.tv_usec = waitUsecs;
		// If wTime == 0, wait forever by passing NULL as the final arg.
//		if (!isPlaying())
//			printf("select(%d, 0x%x, 0x%x, NULL, 0x%x)...\n", 
//					nfds, &_rfdset, &_wfdset, wTime == 0 ?  NULL : &tv);
		int selret = ::select(nfds, &_rfdset, &_wfdset,
							  NULL, wTime == 0 ?  NULL : &tv);
		if (selret <= 0) {
			if (errno != EINTR)
				fprintf(stderr,
						"ThreadedAudioDevice::waitForDevice: select %s\n",
						(selret == 0) ? "timed out" : "returned error");
			ret = -1;
		}
		else {
			setFDSet();
			ret = 0;
		}
	}
	else {
		PRINT1("ThreadedAudioDevice::waitForDevice: stopping == true\n");
		ret = 1;
	}
	return ret;
}
示例#6
0
void Insteon::run()
{
    setStarted();
    while (!stopping())
    {
        // Make sure every devices are idle before atempting to send another command
        bool devicesIdle = true;
        for (std::map<InsteonID,InsteonDevice*>::iterator it = mModules.begin();it!=mModules.end();it++)
        {
            time_t t;
            time(&t);
            it->second->onTimer(t);
            if (!it->second->isIdle())
            {
                devicesIdle = false;
                break;
            }
        }

        if (mpInsteonModem->process(devicesIdle))
        {
            // dont sleep more than 50ms because Insteon modem expects reponses within 85ms
            usleep(50000);
        }

    }
}
示例#7
0
static void rtmp_stream_destroy(void *data)
{
	struct rtmp_stream *stream = data;

	if (stopping(stream) && !connecting(stream)) {
		pthread_join(stream->send_thread, NULL);

	} else if (connecting(stream) || active(stream)) {
		if (stream->connecting)
			pthread_join(stream->connect_thread, NULL);

		os_event_signal(stream->stop_event);

		if (active(stream)) {
			os_sem_post(stream->send_sem);
			obs_output_end_data_capture(stream->output);
			pthread_join(stream->send_thread, NULL);
		}
	}

	if (stream) {
		free_packets(stream);
		dstr_free(&stream->path);
		dstr_free(&stream->key);
		dstr_free(&stream->username);
		dstr_free(&stream->password);
		dstr_free(&stream->encoder_name);
		os_event_destroy(stream->stop_event);
		os_sem_destroy(stream->send_sem);
		pthread_mutex_destroy(&stream->packets_mutex);
		circlebuf_free(&stream->packets);
		bfree(stream);
	}
}
示例#8
0
static bool init_connect(struct rtmp_stream *stream)
{
	obs_service_t *service;
	obs_data_t *settings;

	if (stopping(stream))
		pthread_join(stream->send_thread, NULL);

	free_packets(stream);

	service = obs_output_get_service(stream->output);
	if (!service)
		return false;

	os_atomic_set_bool(&stream->disconnected, false);
	stream->total_bytes_sent = 0;
	stream->dropped_frames   = 0;
	stream->min_drop_dts_usec= 0;
	stream->min_priority     = 0;

	settings = obs_output_get_settings(stream->output);
	dstr_copy(&stream->path,     obs_service_get_url(service));
	dstr_copy(&stream->key,      obs_service_get_key(service));
	dstr_copy(&stream->username, obs_service_get_username(service));
	dstr_copy(&stream->password, obs_service_get_password(service));
	stream->drop_threshold_usec =
		(int64_t)obs_data_get_int(settings, OPT_DROP_THRESHOLD) * 1000;
	stream->max_shutdown_time_sec =
		(int)obs_data_get_int(settings, OPT_MAX_SHUTDOWN_TIME_SEC);
	obs_data_release(settings);
	return true;
}
示例#9
0
文件: Task.cpp 项目: FreddyFox/dune
      //! Main loop.
      void
      onMain(void)
      {
        Counter<double> m_mon_timer(1.0);

        while (!stopping())
        {
          waitForMessages(1.0);

          if (m_wdog.overflow())
          {
            setEntityState(IMC::EntityState::ESTA_ERROR, Status::CODE_COM_ERROR);
            throw RestartNeeded(Status::getString(Status::CODE_COM_ERROR), c_restart_delay);
          }
          else
          {
            setEntityState(IMC::EntityState::ESTA_NORMAL, Status::CODE_ACTIVE);
          }

          if (m_mon_timer.overflow())
          {
            m_mon_timer.reset();
            getMonitors();
          }
        }
      }
示例#10
0
文件: Task.cpp 项目: tausteen/dune
      void
      onMain(void)
      {
        char bfr[32];

        while (!stopping())
        {
          consumeMessages();

          if (m_wdog.overflow())
          {
            setEntityState(IMC::EntityState::ESTA_ERROR, Status::CODE_COM_ERROR);
            throw RestartNeeded(DTR(Status::getString(CODE_COM_ERROR)), 5);
          }

          if (!Poll::poll(*m_uart, 1.0))
            continue;

          size_t rv = m_uart->readString(bfr, sizeof(bfr));

          if (rv == 0)
            throw RestartNeeded(DTR("I/O error"), 5);

          if (std::sscanf(bfr, "%f", &m_sspeed.value) != 1)
            continue;

          if ((m_sspeed.value < c_min_speed) || (m_sspeed.value > c_max_speed))
            m_sspeed.value = -1;

          m_wdog.reset();
          dispatch(m_sspeed);
        }
      }
示例#11
0
static void *connect_thread(void *data)
{
	struct rtmp_stream *stream = data;
	int ret;

	os_set_thread_name("rtmp-stream: connect_thread");

	if (!init_connect(stream)) {
		obs_output_signal_stop(stream->output, OBS_OUTPUT_BAD_PATH);
		return NULL;
	}

	ret = try_connect(stream);

	if (ret != OBS_OUTPUT_SUCCESS) {
		obs_output_signal_stop(stream->output, ret);
		info("Connection to %s failed: %d", stream->path.array, ret);
	}

	if (!stopping(stream))
		pthread_detach(stream->connect_thread);

	os_atomic_set_bool(&stream->connecting, false);
	return NULL;
}
示例#12
0
void
EndSequence::stop()
{
  if (!isrunning) return;
  isrunning = false;
  isdone = true;
  stopping();
}
示例#13
0
 void
 BasicUAVAutopilot::onMain(void)
 {
   while (!stopping())
   {
     waitForMessages(1.0);
   }
 }
示例#14
0
文件: Task.cpp 项目: Aero348/dune
 void
 onMain(void)
 {
   while (!stopping())
   {
     waitForMessages(1.0);
   }
 }
示例#15
0
void
EventLoop::idle()
{
    while (!stopping()) {
        MORDOR_LOG_DEBUG(g_log) << m_messageWindow << " Starting new message pump";
        schedule(boost::bind(&EventLoop::messagePump, this));
        Fiber::yield();
    }
}
示例#16
0
bool MeasureThreadCounter::runnable()
{
	int seconds(m_nSeconds), wait;

	if(m_bClientAction)
	{
		tout << "server wait for some action from any client" << endl;
		tout << "and count after that ";
	}else
		tout << "server count now ";
	tout << "between " << getTimeString(seconds, &wait) << "for running folder threads." << endl;
	TERMINALEND;
	if(m_bClientAction)
	{
		LOCK(m_CLIENTACTIONMUTEX);
		m_bCounting= false;
		while(!m_bClientActionDone)
		{
			CONDITION(m_CLIENTACTIONCOND, m_CLIENTACTIONMUTEX);
			if(stopping())
			{
				m_bCounting= true;
				UNLOCK(m_CLIENTACTIONMUTEX);
				return false;
			}
		}
		beginCount();
		AROUSEALL(m_CLIENTACTIONCOND);
		m_bCounting= true;
		tout << "wait now for " << getTimeString(seconds, &wait) << endl;
		if(m_bClientAction)
		{
			tout << "  activated from " << m_tClient.who << endl;
			tout << "    to inform " << m_tClient.folder << ":" << m_tClient.subroutine
							<< " set with value " << m_tClient.value << endl;
		}
		UNLOCK(m_CLIENTACTIONMUTEX);
		TERMINALEND;
	}else
		beginCount();
	do{
		//cout << "sleep for " << wait << " seconds" << endl;
		if(SLEEP(wait) != ETIMEDOUT)
		{
			outputCounting(m_nSeconds - seconds);
			return false;
		}
		seconds-= wait;
		if(seconds > 0)
		{
			tout << "wait for " << getTimeString(seconds, &wait) << endl;
			TERMINALEND;
		}
	}while(seconds > 0);
	outputCounting(m_nSeconds);
	return false;
}
示例#17
0
文件: Task.cpp 项目: tsalidis/dune
      void
      onMain(void)
      {
        setInitialState();

        while (!stopping())
        {
          if (m_report_timer.overflow())
          {
            if (m_args.progress)
              reportProgress();

            dispatch(m_pcs);

            m_report_timer.reset();
          }

          double now = Clock::get();

          if ((getEntityState() == IMC::EntityState::ESTA_NORMAL) &&
              (now - m_last_vstate >= c_vs_timeout))
          {
            changeMode(IMC::PlanControlState::PCS_BLOCKED, DTR("vehicle state timeout"));
            m_last_vstate = now;
          }

          // got requests to process
          if (!pendingReply() && m_requests.size())
          {
            processRequest(&m_requests.front());
            m_requests.pop();
          }

          double delta = m_vc_reply_deadline < 0 ? 1 : m_vc_reply_deadline - now;

          if (delta > 0)
          {
            waitForMessages(std::min(1.0, delta));
            continue;
          }

          // handle reply timeout
          m_vc_reply_deadline = -1;

          changeMode(IMC::PlanControlState::PCS_READY, DTR("vehicle reply timeout"));

          // Popping all requests
          while (m_requests.size())
            m_requests.pop();

          // Increment local request id to prevent old replies from being processed
          ++m_vreq_ctr;

          err(DTR("cleared all requests"));
        }
      }
示例#18
0
void eStreamThread::stop() {
	if(!stopping())
	{
		m_stop = true;
		::ioctl(m_destfd, 0);
		kill();
	}
	else
		eDebug("eStreamThread::stop: thread already stopping, ignoring kill request!");
}
示例#19
0
void obs_output_force_stop(obs_output_t *output)
{
	if (!obs_output_valid(output, "obs_output_force_stop"))
		return;

	if (!stopping(output)) {
		output->stop_code = 0;
		do_output_signal(output, "stopping");
		obs_output_actual_stop(output, true, 0);
	}
}
示例#20
0
文件: Task.cpp 项目: retlaw84/dune
 void
 onMain(void)
 {
   while (!stopping())
   {
     waitForMessages(1.0);
     // Check if we receive valid GPS data.
     if (m_time_without_gps.overflow())
       setEntityState(IMC::EntityState::ESTA_ERROR, Status::CODE_WAIT_GPS_FIX);
   }
 }
示例#21
0
	Window::~Window() {
		stopping();
		
		SDL_HideWindow(_window);
		
		SDL_GL_DeleteContext(_context);
		
		SDL_DestroyWindow(_window);
		
		SDL_QuitSubSystem(SDL_INIT_VIDEO);
	}
示例#22
0
void
ServerImpl::stop (bool wait)
{
    if (! stopping())
    {
        m_work = boost::none;
        update();
    }

    if (wait)
        m_stopped.wait();
}
示例#23
0
static bool init_connect(struct rtmp_stream *stream)
{
	obs_service_t *service;
	obs_data_t *settings;
	const char *bind_ip;
	int64_t drop_p;
	int64_t drop_b;

	if (stopping(stream)) {
		pthread_join(stream->send_thread, NULL);
	}

	free_packets(stream);

	service = obs_output_get_service(stream->output);
	if (!service)
		return false;

	os_atomic_set_bool(&stream->disconnected, false);
	stream->total_bytes_sent = 0;
	stream->dropped_frames   = 0;
	stream->min_priority     = 0;

	settings = obs_output_get_settings(stream->output);
	dstr_copy(&stream->path,     obs_service_get_url(service));
	dstr_copy(&stream->key,      obs_service_get_key(service));
	dstr_copy(&stream->username, obs_service_get_username(service));
	dstr_copy(&stream->password, obs_service_get_password(service));
	dstr_depad(&stream->path);
	dstr_depad(&stream->key);
	drop_b = (int64_t)obs_data_get_int(settings, OPT_DROP_THRESHOLD);
	drop_p = (int64_t)obs_data_get_int(settings, OPT_PFRAME_DROP_THRESHOLD);
	stream->max_shutdown_time_sec =
		(int)obs_data_get_int(settings, OPT_MAX_SHUTDOWN_TIME_SEC);

	if (drop_p < (drop_b + 200))
		drop_p = drop_b + 200;

	stream->drop_threshold_usec = 1000 * drop_b;
	stream->pframe_drop_threshold_usec = 1000 * drop_p;

	bind_ip = obs_data_get_string(settings, OPT_BIND_IP);
	dstr_copy(&stream->bind_ip, bind_ip);

	stream->new_socket_loop = obs_data_get_bool(settings,
			OPT_NEWSOCKETLOOP_ENABLED);
	stream->low_latency_mode = obs_data_get_bool(settings,
			OPT_LOWLATENCY_ENABLED);

	obs_data_release(settings);
	return true;
}
示例#24
0
文件: Maneuver.cpp 项目: Aero348/dune
    void
    Maneuver::onMain(void)
    {
      dispatch(m_rm);

      while (!stopping())
      {
        if (isActive())
          onStateReport();

        waitForMessages(1.0);
      }
    }
示例#25
0
  void
  Daemon::onMain(void)
  {
    while (!stopping())
    {
      waitForMessages(1.0);

      if (m_periodic_counter.overflow())
      {
        m_periodic_counter.reset();
        dispatchPeriodic();
      }
    }
  }
示例#26
0
void BaseADCDebugLogger::stop()
{
    std::lock_guard<std::mutex> lock(_mutex);

    _triggerState = false;
    _preSamplesCount = 0;
    _postSamplesCount = 0;

    if (_workState == SavingState)
        return;

    _workState = NotWorkingState;

    stopping();
}
int ThreadedAudioDevice::startThread()
{
	stopping(false);	// Reset.
	if (isPassive())	// Nothing else to do here if passive mode.
		return 0;
	starting(true);
#ifdef PROFILE
	getitimer(ITIMER_PROF, &globalTimerVal);
#endif
	PRINT1("\tThreadedAudioDevice::startThread: starting thread\n");
	int status = pthread_create(&_thread, NULL, _runProcess, this);
	if (status < 0) {
		error("Failed to create thread");
	}
	return status;
}
示例#28
0
文件: Task.cpp 项目: Aero348/dune
      void
      onMain(void)
      {
        while (!stopping())
        {
          if (!isInitialized() || !isActive())
          {
            waitForMessages(1.0);
            continue;
          }

          if (!m_ping_time.overflow())
          {
            waitForMessages(m_args.ping_delay);
            continue;
          }

          double tstamp = Time::Clock::getSinceEpoch();

          for (m_beacon = m_beacons.begin(); m_beacon < m_beacons.end(); ++m_beacon)
          {
            // Compute error.
            double error = 0;
            if (m_args.bad_range_prob > 0 && m_prng->random() % 100 <= m_args.bad_range_prob)
              error = c_huge_error;
            else if (m_args.sigma > 0)
              error = m_prng->gaussian() * m_args.sigma;

            //! Compute range.
            double xd = m_sstate.x - m_beacon->x;
            double yd = m_sstate.y - m_beacon->y;
            double zd = m_sstate.z - m_beacon->depth;
            IMC::LblRange range;
            range.setTimeStamp(tstamp);
            range.id = m_beacon->id;
            range.range = std::sqrt(xd * xd + yd * yd + zd * zd);
            range.range += error;
            dispatch(range, DF_KEEP_TIME);

            trace("beacon %u, range of %0.2f m, simulated error of %0.2f m",
                  range.id, range.range, error);
          }

          // Setup next ping.
          m_ping_time.reset();
        }
      }
示例#29
0
static void rtmp_stream_destroy(void *data)
{
	struct rtmp_stream *stream = data;

	if (stopping(stream) && !connecting(stream)) {
		pthread_join(stream->send_thread, NULL);

	} else if (connecting(stream) || active(stream)) {
		if (stream->connecting)
			pthread_join(stream->connect_thread, NULL);

		stream->stop_ts = 0;
		os_event_signal(stream->stop_event);

		if (active(stream)) {
			os_sem_post(stream->send_sem);
			obs_output_end_data_capture(stream->output);
			pthread_join(stream->send_thread, NULL);
		}
	}

	free_packets(stream);
	dstr_free(&stream->path);
	dstr_free(&stream->key);
	dstr_free(&stream->username);
	dstr_free(&stream->password);
	dstr_free(&stream->encoder_name);
	dstr_free(&stream->bind_ip);
	os_event_destroy(stream->stop_event);
	os_sem_destroy(stream->send_sem);
	pthread_mutex_destroy(&stream->packets_mutex);
	circlebuf_free(&stream->packets);
#ifdef TEST_FRAMEDROPS
	circlebuf_free(&stream->droptest_info);
#endif

	os_event_destroy(stream->buffer_space_available_event);
	os_event_destroy(stream->buffer_has_data_event);
	os_event_destroy(stream->socket_available_event);
	os_event_destroy(stream->send_thread_signaled_exit);
	pthread_mutex_destroy(&stream->write_buf_mutex);

	if (stream->write_buf)
		bfree(stream->write_buf);
	bfree(stream);
}
示例#30
0
static void rtmp_stream_stop(void *data)
{
	struct rtmp_stream *stream = data;

	if (stopping(stream))
		return;

	if (connecting(stream))
		pthread_join(stream->connect_thread, NULL);

	os_event_signal(stream->stop_event);

	if (active(stream)) {
		os_sem_post(stream->send_sem);
		obs_output_end_data_capture(stream->output);
	}
}