nidas
v1.2-1520
|
Interface of an output stream of samples. More...
#include <SampleOutputRequestThread.h>
Classes | |
class | ConnectRequest |
Public Types | |
enum | runStatus { RUN_CANCELED = -1, RUN_OK = 0, NOT_RUNNING = 1, RUN_EXCEPTION = 2 } |
Values that can be returned by run method. More... | |
enum | SchedPolicy { NU_THREAD_OTHER =SCHED_OTHER, NU_THREAD_FIFO =SCHED_FIFO, NU_THREAD_RR =SCHED_RR } |
Public Member Functions | |
int | run () throw (nidas::util::Exception) |
The method which will run in its own thread. More... | |
void | interrupt () |
Interrupt the thread. More... | |
void | clear () |
Clear all current requests. More... | |
void | addConnectRequest (SampleOutput *, SampleConnectionRequester *, int delaySecs) |
Add an connect request of a SampleOutput. More... | |
void | addDeleteRequest (SampleOutput *) |
Request that SampleOutputRequestThread delete the output when it can. More... | |
virtual void | start () throw (Exception) |
Start the thread running, meaning execute the run method in a separate thread. More... | |
virtual int | join () throw (Exception) |
The calling thread joins this thread, waiting until the thread finishes, which means either that the run() method returned, the thread called pthread_exit() or the thread was cancelled. More... | |
virtual void | kill (int sig) throw (Exception) |
Send a signal to this thread. More... | |
virtual void | cancel () throw (Exception) |
Cancel this thread. More... | |
virtual bool | isInterrupted () const |
Return true when this thread has been interrupted. More... | |
virtual bool | isRunning () const |
Is this thread running? More... | |
virtual bool | isJoined () const |
Has this thread been joined? More... | |
virtual bool | isDetached () const |
Is this a detached thread. More... | |
bool | isCancelEnabled () const |
Return true if the cancel state of this thread is PTHREAD_CANCEL_ENABLE. More... | |
bool | isCancelDeferred () const |
Return true if the cancel type of this thread is PTHREAD_CANCEL_DEFERRED. More... | |
const std::string & | getName () const throw () |
Return the name of this thread. More... | |
const std::string & | getFullName () throw () |
Return a name with a bunch of descriptive fields, specifying whether it is detached, the real-time priority, etc. More... | |
bool | setRealTimeRoundRobinPriority (int val) throw (Exception) |
bool | setRealTimeFIFOPriority (int val) throw (Exception) |
bool | setNonRealTimePriority () throw (Exception) |
void | setThreadScheduler (enum SchedPolicy policy, int priority) throw (Exception) |
void | blockSignal (int) |
Block a signal in this thread. More... | |
void | unblockSignal (int) |
Install a signal handler and unblock the signal. More... | |
Static Public Member Functions | |
static SampleOutputRequestThread * | getInstance () |
Return pointer to instance of singleton, creating instance if necessary. More... | |
static void | destroyInstance () |
Singleton destructor. More... | |
static Thread * | currentThread () |
Return the thread object for the current thread. More... | |
static pthread_t | currentThreadId () |
static Thread * | lookupThread (pthread_t id) |
static const std::string & | currentName () |
Convenience routine to return the name for the current thread, or a string indicating that the name of the thread is unknown. More... | |
static std::string | getPolicyString (int policy) |
Convenience function to return a string for the given scheduler policy: "Non-RT", "RT:FIFO", "RT:RR" or "RT:Unknown". More... | |
static int | test (int argc, char **argv) |
a test method. More... | |
Protected Member Functions | |
void | setCancelEnabled (bool val) |
Set the cancel state for this thread - false means cancel requests are ignored. More... | |
void | setCancelDeferred (bool val) |
Set the cancel type for this thread. More... | |
pthread_t | getId () const |
void | testCancel () const |
Check if we have been cancelled. More... | |
virtual bool | amInterrupted () const |
Call testCancel, and return true when this thread has been interrupted. More... | |
Private Member Functions | |
SampleOutputRequestThread () | |
~SampleOutputRequestThread () | |
Private Attributes | |
std::list< ConnectRequest > | _connectRequests |
std::list< SampleOutput * > | _disconnectRequests |
nidas::util::Cond | _requestCond |
Static Private Attributes | |
static SampleOutputRequestThread * | _instance = 0 |
static nidas::util::Mutex | _instanceLock |
Interface of an output stream of samples.
|
inherited |
Values that can be returned by run method.
User can define other values greater than RUN_EXCEPTION. These values are then returned by int join()
. Note that PTHREAD_CANCELLED is -1
Enumerator | |
---|---|
RUN_CANCELED | |
RUN_OK | |
NOT_RUNNING | |
RUN_EXCEPTION |
|
inherited |
|
private |
|
inlineprivate |
void SampleOutputRequestThread::addConnectRequest | ( | SampleOutput * | output, |
SampleConnectionRequester * | requester, | ||
int | delaySecs | ||
) |
Add an connect request of a SampleOutput.
References _connectRequests, _requestCond, nidas::core::SampleOutput::getName(), nidas::util::Cond::lock(), nidas::util::Cond::signal(), and nidas::util::Cond::unlock().
Referenced by nidas::core::DSMEngine::connectOutputs(), nidas::dynld::SampleProcessor::connectSource(), nidas::dynld::raf::SyncRecordGenerator::connectSource(), nidas::dynld::raf::CVIProcessor::connectSource(), nidas::dynld::StatisticsProcessor::connectSource(), nidas::core::SampleArchiver::connectSource(), nidas::dynld::SampleProcessor::disconnect(), nidas::dynld::raf::SyncRecordGenerator::disconnect(), nidas::dynld::raf::CVIProcessor::disconnect(), nidas::core::SampleArchiver::disconnect(), nidas::dynld::StatisticsProcessor::disconnect(), nidas::core::DSMEngine::disconnect(), and run().
void SampleOutputRequestThread::addDeleteRequest | ( | SampleOutput * | output | ) |
Request that SampleOutputRequestThread delete the output when it can.
SampleOutputRequestThread owns the pointer after this call.
References _disconnectRequests, _requestCond, nidas::util::Cond::lock(), nidas::util::Cond::signal(), and nidas::util::Cond::unlock().
Referenced by nidas::dynld::SampleProcessor::disconnect(), nidas::dynld::raf::SyncRecordGenerator::disconnect(), nidas::dynld::raf::CVIProcessor::disconnect(), nidas::core::SampleArchiver::disconnect(), nidas::dynld::StatisticsProcessor::disconnect(), and nidas::core::DSMEngine::disconnect().
|
protectedvirtualinherited |
Call testCancel, and return true when this thread has been interrupted.
This is protected because it should only called within the run method of the thread.
Referenced by run(), nidas::core::Looper::run(), nidas::dynld::isff::GOESOutput::run(), nidas::core::DSMServerStat::run(), and nidas::util::Thread::test().
|
inherited |
Block a signal in this thread.
This method is usually called before this Thread has started. If this Thread is currently running, then this method is only effective if called from this Thread, i.e. from its own run() method.
Because SIGINT, SIGTERM and SIGHUP are typically caught in the main thread, they are blocked by default in a Thread. Call unblockSignal(sig) if you want to catch them in a Thread.
References nidas::util::Thread::_blockedSignals, nidas::util::Thread::_unblockedSignals, nidas::util::Thread::currentThread(), nidas::util::Thread::isRunning(), and nidas::util::Thread::thr_add_sig().
Referenced by nidas::dynld::UDPSampleOutput::ConnectionMonitor::ConnectionMonitor(), nidas::core::ServerSocket::ConnectionThread::ConnectionThread(), nidas::core::DerivedDataReader::DerivedDataReader(), nidas::util::McSocketListener::McSocketListener(), nidas::util::McSocketMulticaster< SocketTT >::McSocketMulticaster(), nidas::core::SensorHandler::SensorHandler(), nidas::core::SensorOpener::SensorOpener(), nidas::util::Thread::test(), nidas::dynld::RawSampleService::Worker::Worker(), nidas::core::XmlRpcThread::XmlRpcThread(), and nidas::dynld::UDPSampleOutput::XMLSocketListener::XMLSocketListener().
|
virtualinherited |
Cancel this thread.
References nidas::util::Thread::_id, nidas::util::Thread::_mutex, nidas::util::Exception::errnoToString(), and nidas::util::Thread::getName().
Referenced by nidas::core::DSMService::cancel(), nidas::dynld::isff::GOESOutput::cancelThread(), nidas::core::DerivedDataReader::deleteInstance(), and nidas::core::DSMEngine::joinDataThreads().
void SampleOutputRequestThread::clear | ( | ) |
Clear all current requests.
References _connectRequests, _disconnectRequests, _requestCond, nidas::util::Cond::lock(), and nidas::util::Cond::unlock().
Referenced by nidas::core::DSMEngine::closeOutputs(), interrupt(), and nidas::core::DSMServer::interruptServices().
|
inlinestaticinherited |
Convenience routine to return the name for the current thread, or a string indicating that the name of the thread is unknown.
References nidas::util::Thread::currentThread(), nidas::util::Thread::getName(), and nidas::util::Thread::unknownName.
Referenced by nidas::util::Logger::msg_locked().
|
staticinherited |
Return the thread object for the current thread.
Returns null if not found.
Referenced by nidas::util::Thread::blockSignal(), nidas::util::Thread::currentName(), and nidas::util::Thread::unblockSignal().
|
staticinherited |
Referenced by nidas::core::Looper::removeClient().
|
static |
Singleton destructor.
References DLOG, nidas::util::Exception::what(), and WLOG.
Referenced by nidas::dynld::raf::SyncServer::stop(), nidas::core::DSMEngine::~DSMEngine(), and nidas::core::DSMServerApp::~DSMServerApp().
|
inherited |
Return a name with a bunch of descriptive fields, specifying whether it is detached, the real-time priority, etc.
References nidas::util::Thread::_fullname.
Referenced by nidas::util::Thread::pRun(), nidas::util::Thread::test(), nidas::util::Thread::thr_cleanup(), and nidas::util::Thread::thr_cleanup_delete().
|
inlineprotectedinherited |
References nidas::util::Thread::_id, and nidas::util::Thread::_mutex.
Referenced by nidas::util::Thread::isJoined(), nidas::util::Thread::join(), nidas::util::Thread::pRun(), and nidas::core::Looper::removeClient().
|
static |
Return pointer to instance of singleton, creating instance if necessary.
Referenced by nidas::core::DSMEngine::closeOutputs(), nidas::core::DSMEngine::connectOutputs(), nidas::dynld::SampleProcessor::connectSource(), nidas::dynld::raf::SyncRecordGenerator::connectSource(), nidas::dynld::raf::CVIProcessor::connectSource(), nidas::dynld::StatisticsProcessor::connectSource(), nidas::core::SampleArchiver::connectSource(), nidas::dynld::SampleProcessor::disconnect(), nidas::dynld::raf::SyncRecordGenerator::disconnect(), nidas::dynld::raf::CVIProcessor::disconnect(), nidas::core::SampleArchiver::disconnect(), nidas::dynld::StatisticsProcessor::disconnect(), nidas::core::DSMEngine::disconnect(), nidas::core::DSMServer::interruptServices(), nidas::core::DSMServerApp::run(), and nidas::core::DSMEngine::run().
|
inherited |
Return the name of this thread.
References nidas::util::Thread::_name.
Referenced by nidas::core::DSMService::cancel(), nidas::util::Thread::cancel(), nidas::core::DSMService::checkSubThreads(), nidas::core::SensorHandler::PolledDSMSensor::checkTimeout(), nidas::util::Thread::currentName(), nidas::core::SensorHandler::PolledDSMSensor::handlePollEvents(), nidas::core::SampleSorter::heapDecrement(), nidas::core::DSMService::interrupt(), nidas::core::DSMService::join(), nidas::util::Thread::join(), nidas::core::SamplePipeline::join(), nidas::core::FsMountWorkerThread::run(), nidas::core::SampleSorter::run(), nidas::util::ThreadJoiner::run(), nidas::util::Thread::sigAction(), nidas::util::Thread::start(), nidas::util::Thread::test(), nidas::util::LogContext::threadName(), nidas::core::SampleSorter::~SampleSorter(), and nidas::util::Thread::~Thread().
|
staticinherited |
Convenience function to return a string for the given scheduler policy: "Non-RT", "RT:FIFO", "RT:RR" or "RT:Unknown".
References nidas::util::Thread::NU_THREAD_FIFO, nidas::util::Thread::NU_THREAD_OTHER, and nidas::util::Thread::NU_THREAD_RR.
Referenced by nidas::core::DSMSensor::getLooper(), and nidas::util::Thread::makeFullName().
|
virtual |
Interrupt the thread.
It will delete itself.
Reimplemented from nidas::util::Thread.
References _requestCond, clear(), nidas::util::Thread::interrupt(), and nidas::util::Cond::signal().
|
inherited |
Return true if the cancel type of this thread is PTHREAD_CANCEL_DEFERRED.
References nidas::util::Thread::_cancel_deferred.
|
inherited |
Return true if the cancel state of this thread is PTHREAD_CANCEL_ENABLE.
References nidas::util::Thread::_cancel_enabled.
|
inlinevirtualinherited |
Is this a detached thread.
References nidas::util::Thread::_detached.
|
inlinevirtualinherited |
Return true when this thread has been interrupted.
Implements nidas::util::Runnable.
References nidas::util::Thread::_interrupted, and nidas::util::Thread::_mutex.
Referenced by nidas::core::SampleSorter::flush(), run(), nidas::core::StatusListener::run(), nidas::core::DerivedDataReader::run(), nidas::core::SensorOpener::run(), Sender::run(), nidas::core::DSMEngineStat::run(), nidas::core::SensorHandler::run(), nidas::core::FsMountWorkerThread::run(), ModemLineSetter::run(), ModemLineMonitor::run(), nidas::core::SampleBuffer::run(), nidas::core::SampleSorter::run(), ServerThread::run(), nidas::util::McSocketListener::run(), and nidas::dynld::raf::SyncServer::stop().
|
inlinevirtualinherited |
Has this thread been joined?
References nidas::util::Thread::getId().
Referenced by nidas::core::FsMount::cancel(), nidas::core::DerivedDataReader::deleteInstance(), nidas::core::SensorHandler::join(), nidas::dynld::isff::GOESOutput::joinThread(), nidas::util::Thread::test(), nidas::core::SampleBuffer::~SampleBuffer(), nidas::core::SampleSorter::~SampleSorter(), and nidas::util::Thread::~Thread().
|
inlinevirtualinherited |
Is this thread running?
References nidas::util::Thread::_mutex, and nidas::util::Thread::_running.
Referenced by nidas::util::Thread::blockSignal(), nidas::core::DSMService::cancel(), nidas::core::FsMount::cancel(), nidas::dynld::isff::GOESOutput::cancelThread(), nidas::core::DSMService::checkSubThreads(), nidas::dynld::UDPSampleOutput::XMLSocketListener::checkWorkers(), nidas::dynld::UDPSampleOutput::close(), nidas::util::McSocket< SocketT >::close(), nidas::core::DerivedDataReader::deleteInstance(), nidas::core::DSMService::interrupt(), nidas::core::SamplePipeline::join(), nidas::dynld::isff::GOESOutput::joinThread(), nidas::core::DSMServerApp::killStatusThread(), nidas::dynld::isff::GOESOutput::killThread(), nidas::core::Looper::removeClient(), nidas::core::SensorHandler::run(), nidas::core::Looper::setupClientMaps(), nidas::util::Thread::test(), nidas::util::Thread::unblockSignal(), nidas::core::SampleBuffer::~SampleBuffer(), nidas::core::SampleSorter::~SampleSorter(), nidas::util::Thread::~Thread(), and nidas::dynld::UDPSampleOutput::~UDPSampleOutput().
|
virtualinherited |
The calling thread joins this thread, waiting until the thread finishes, which means either that the run() method returned, the thread called pthread_exit() or the thread was cancelled.
The return value is the int return value of the run method, or PTHREAD_CANCELED (-1). If the run method threw an Exception, it will be caught and then re-thrown by join.
Reimplemented in nidas::core::SensorHandler.
References nidas::util::Thread::_exception, nidas::util::Thread::_id, nidas::util::Thread::_mutex, nidas::util::Exception::errnoToString(), nidas::util::Thread::getId(), nidas::util::Thread::getName(), nidas::util::Thread::RUN_EXCEPTION, and nidas::util::Thread::RUN_OK.
Referenced by nidas::core::DSMService::checkSubThreads(), nidas::dynld::UDPSampleOutput::XMLSocketListener::checkWorkers(), nidas::dynld::UDPSampleOutput::close(), nidas::util::McSocketListener::close(), nidas::core::DerivedDataReader::deleteInstance(), nidas::dynld::UDPSampleOutput::XMLSocketListener::fireWorkers(), nidas::core::DSMService::join(), nidas::core::SensorHandler::join(), nidas::core::SamplePipeline::join(), nidas::core::DSMEngine::joinDataThreads(), nidas::dynld::isff::GOESOutput::joinThread(), nidas::core::DSMServerApp::killStatusThread(), nidas::core::DSMServerApp::killXmlRpcThread(), nidas::core::DSMEngine::killXmlRpcThread(), main(), nidas::core::Looper::removeClient(), nidas::util::ThreadJoiner::run(), nidas::core::SampleBuffer::~SampleBuffer(), nidas::core::SampleSorter::~SampleSorter(), nidas::core::ServerSocket::~ServerSocket(), and nidas::dynld::UDPSampleOutput::~UDPSampleOutput().
|
virtualinherited |
Send a signal to this thread.
References nidas::util::Exception::errnoToString().
Referenced by nidas::core::FsMount::cancel(), nidas::core::XmlRpcThread::interrupt(), nidas::core::SensorOpener::interrupt(), nidas::core::DerivedDataReader::interrupt(), nidas::core::SensorHandler::interrupt(), nidas::util::McSocketListener::interrupt(), nidas::core::DSMServerApp::killStatusThread(), nidas::dynld::isff::GOESOutput::killThread(), main(), nidas::core::SensorHandler::scheduleAdd(), nidas::core::SensorHandler::scheduleClose(), nidas::core::SensorHandler::scheduleReopen(), and nidas::core::SensorHandler::sensorIsOpen().
|
staticinherited |
Referenced by nidas::util::LogContext::threadName().
|
virtual |
The method which will run in its own thread.
This method must be supplied by the Runnable or Thread subclass.
Implements nidas::util::Runnable.
References _connectRequests, _disconnectRequests, nidas::core::SampleOutputRequestThread::ConnectRequest::_output, _requestCond, nidas::core::SampleOutputRequestThread::ConnectRequest::_requester, nidas::core::SampleOutputRequestThread::ConnectRequest::_when, addConnectRequest(), nidas::util::Runnable::amInterrupted(), nidas::core::SampleOutput::getName(), nidas::core::SampleOutput::getReconnectDelaySecs(), nidas::util::Thread::isInterrupted(), nidas::util::Cond::lock(), PLOG, nidas::core::SampleOutput::requestConnection(), nidas::util::Thread::RUN_OK, nidas::util::Cond::unlock(), nidas::util::Cond::wait(), and nidas::util::Exception::what().
|
protectedinherited |
Set the cancel type for this thread.
true means cancel requests are deferred until the next cancellation point. false means they occur instantly. This is protected, it should be called only from a thread's own run method. See the pthreads(7) man page for a list of the cancellation points.
Note: non-deferred canceling is difficult to get right. It has not been tested with this class, and is not recommended.
References nidas::util::Thread::_cancel_deferred.
|
protectedinherited |
Set the cancel state for this thread - false means cancel requests are ignored.
See pthread_setcancelstate. This is protected, it should be called only from a thread's own run method.
References nidas::util::Thread::_cancel_enabled.
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
virtualinherited |
Start the thread running, meaning execute the run method in a separate thread.
References nidas::util::Thread::_id, nidas::util::Thread::_interrupted, nidas::util::Thread::_mutex, nidas::util::Thread::_running, nidas::util::Thread::_thread_attr, nidas::util::Exception::errnoToString(), nidas::util::Thread::getName(), nidas::util::Thread::makeFullName(), nidas::util::Thread::NU_THREAD_FIFO, nidas::util::Thread::NU_THREAD_OTHER, nidas::util::Thread::NU_THREAD_RR, nidas::util::Thread::registerThread(), nidas::util::Thread::setThreadSchedulerNolock(), nidas::util::Thread::thr_run(), nidas::util::Thread::thr_run_detached(), and WLOG.
Referenced by nidas::util::McSocketListener::accept(), nidas::dynld::RawSampleService::connect(), nidas::core::DerivedDataReader::createInstance(), nidas::util::McSocket< SocketT >::joinMulticaster(), main(), nidas::core::DSMEngine::openSensors(), nidas::core::SamplePipeline::procinit(), nidas::core::SamplePipeline::rawinit(), nidas::util::McSocket< SocketT >::request(), nidas::core::DSMServerApp::run(), nidas::core::DSMEngine::run(), PSI::run(), nidas::core::SensorHandler::run(), nidas::core::FsMountWorkerThread::run(), nidas::dynld::UDPSampleOutput::XMLSocketListener::run(), nidas::core::Socket::ConnectionThread::run(), ServerThread::run(), nidas::core::Looper::setupClientMaps(), nidas::core::DSMServerApp::startXmlRpcThread(), and nidas::core::DSMEngine::startXmlRpcThread().
|
staticinherited |
a test method.
References nidas::util::Runnable::amInterrupted(), nidas::util::Thread::blockSignal(), nidas::util::Thread::getFullName(), nidas::util::Thread::getName(), nidas::util::Thread::isJoined(), nidas::util::Thread::isRunning(), nidas::util::Runnable::run(), nidas::util::Thread::Thread(), and nidas::util::Exception::what().
|
inlineprotectedinherited |
Check if we have been cancelled.
Calls pthread_testcancel. This is protected since it only checks the current thread - i.e. it must be called within the run method. Since it just calls pthread_testcancel, it is a cancellation point.
|
inherited |
Install a signal handler and unblock the signal.
The signal handler will log a message about the receipt of the signal at severity LOG_INFO using the nidas::util::Logger. Then, if the signal handler is being invoked from a registered Thread, the virtual method signalHandler() for that Thread will be called.
The signal handler is installed with the sigaction() system call, and will be the action for the given signal in all threads, including the main() thread. If other threads do not wish to take action on a given signal, they should call blockSignal(sig). Or they can define their own signalHandler() method.
After installing the signal handler, the signal is added to those that are unblocked for the thread, or if the Thread is not yet running, the signal will be unblocked in the thread once it runs.
As with blockSignal(), this method is typically called on this Thread before it has started. If this Thread has started, then the signal will only be unblocked if the method is called from this Thread, i.e. from its own run() method.
To install a signal handler, and then block the signal so that it is held as pending until it is later unblocked, typically with pselect(), or sigwaitinfo(), do:
References nidas::util::Thread::_blockedSignals, nidas::util::Thread::_unblockedSignals, nidas::util::Thread::currentThread(), nidas::util::Thread::isRunning(), and nidas::util::Thread::thr_add_sig().
Referenced by nidas::core::DerivedDataReader::DerivedDataReader(), nidas::core::FsMountWorkerThread::FsMountWorkerThread(), nidas::core::StatusListener::StatusListener(), nidas::core::StatusThread::StatusThread(), nidas::dynld::XMLConfigService::Worker::Worker(), nidas::core::XmlRpcThread::XmlRpcThread(), and nidas::dynld::UDPSampleOutput::XMLSocketListener::XMLSocketListener().
|
private |
Referenced by addConnectRequest(), clear(), and run().
|
private |
Referenced by addDeleteRequest(), clear(), and run().
|
staticprivate |
|
staticprivate |
|
private |
Referenced by addConnectRequest(), addDeleteRequest(), clear(), interrupt(), and run().