/*------------------------------------------------------------------------------ * The function for each thread. * Read the presented data *----------------------------------------------------------------------------*/ void MultiThreadedConnector :: sinkThread( int ixSink ) { ThreadData * threadData = &threads[ixSink]; Sink * sink = sinks[ixSink].get(); while ( running ) { // wait for some data to become available pthread_mutex_lock( &mutexProduce); while ( running && threadData->isDone ) { pthread_cond_wait( &condProduce, &mutexProduce); } if ( !running ) { pthread_mutex_unlock( &mutexProduce); break; } if ( threadData->accepting ) { if ( sink->canWrite( 0, 0) ) { try { sink->write( dataBuffer, dataSize); } catch ( Exception & e ) { // something wrong. don't accept more data, try to // reopen the sink next time around threadData->accepting = false; } } else { reportEvent( 4, "MultiThreadedConnector :: sinkThread can't write ", ixSink); // don't care if we can't write } } threadData->isDone = true; pthread_cond_broadcast( &condProduce); pthread_mutex_unlock( &mutexProduce); if ( !threadData->accepting ) { if ( reconnect ) { // if we're not accepting, try to reopen the sink try { sink->close(); sink->open(); threadData->accepting = sink->isOpen(); } catch ( Exception & e ) { // don't care, just try and try again } } else { // if !reconnect, just stop the connector running = false; } } } }
bool tryOpen(const string plugin) { if (plugin_handler.load(plugin)) { sink = plugin_handler.openSink(); if (sink) { if (sink->open()) return true; delete sink; sink = 0; } plugin_handler.unload(); } else std::cout << "auto_sink: Could not load " << plugin << std::endl; return false; }