From: <tr...@ff...> - 2007-12-26 15:26:36
|
Author: ppalmers Date: 2007-12-26 07:26:00 -0800 (Wed, 26 Dec 2007) New Revision: 776 Modified: trunk/libffado/src/debugmodule/debugmodule.h trunk/libffado/src/libieee1394/IsoHandler.cpp trunk/libffado/src/libieee1394/IsoHandlerManager.cpp trunk/libffado/src/libieee1394/IsoHandlerManager.h trunk/libffado/src/libstreaming/StreamProcessorManager.cpp trunk/libffado/src/libstreaming/amdtp/AmdtpTransmitStreamProcessor.cpp trunk/libffado/src/libstreaming/generic/StreamProcessor.cpp Log: try to fix deadlock / performace issues Modified: trunk/libffado/src/debugmodule/debugmodule.h =================================================================== --- trunk/libffado/src/debugmodule/debugmodule.h 2007-12-24 11:21:13 UTC (rev 775) +++ trunk/libffado/src/debugmodule/debugmodule.h 2007-12-26 15:26:00 UTC (rev 776) @@ -52,12 +52,12 @@ #define MB_BUFFERSIZE DEBUG_MAX_MESSAGE_LENGTH -// #define IMPLEMENT_BACKLOG +#define IMPLEMENT_BACKLOG #ifdef IMPLEMENT_BACKLOG // the backlog is a similar buffer as the message buffer #define BACKLOG_MB_BUFFERS (256) #define BACKLOG_MB_NEXT(index) (((index)+1) & (BACKLOG_MB_BUFFERS-1)) -#define BACKLOG_MIN_LEVEL DEBUG_LEVEL_VERBOSE +#define BACKLOG_MIN_LEVEL DEBUG_LEVEL_VERY_VERBOSE #endif #define debugFatal( format, args... ) \ Modified: trunk/libffado/src/libieee1394/IsoHandler.cpp =================================================================== --- trunk/libffado/src/libieee1394/IsoHandler.cpp 2007-12-24 11:21:13 UTC (rev 775) +++ trunk/libffado/src/libieee1394/IsoHandler.cpp 2007-12-26 15:26:00 UTC (rev 776) @@ -182,6 +182,7 @@ return true; } +#ifdef DO_POLL uint64_t poll_enter = m_manager.get1394Service().getCurrentTimeAsUsecs(); err = poll(&m_poll_fd, 1, m_poll_timeout); uint64_t poll_exit = m_manager.get1394Service().getCurrentTimeAsUsecs(); @@ -214,6 +215,13 @@ debugOutput(DEBUG_LEVEL_VERY_VERBOSE, "(%c %p) poll took %lldus, iterate took %lldus\n", (this->getType()==eHT_Receive?'R':'X'), this, poll_exit-poll_enter, iter_exit-iter_enter); +#else + // iterate itself blocks if nothing is available + // so poll'ing is not really necessary + bool result = iterate(); + usleep(125); + return result; +#endif return true; } Modified: trunk/libffado/src/libieee1394/IsoHandlerManager.cpp =================================================================== --- trunk/libffado/src/libieee1394/IsoHandlerManager.cpp 2007-12-24 11:21:13 UTC (rev 775) +++ trunk/libffado/src/libieee1394/IsoHandlerManager.cpp 2007-12-26 15:26:00 UTC (rev 776) @@ -355,7 +355,7 @@ unsigned int irq_interval = packets_per_period / MINIMUM_INTERRUPTS_PER_PERIOD; if(irq_interval <= 0) irq_interval=1; // FIXME: test - irq_interval=1; +// irq_interval=1; #else // hardware interrupts occur when one DMA block is full, and the size of one DMA @@ -439,7 +439,7 @@ if (max_packet_size < stream->getMaxPacketSize()) { debugError("Max packet size too large! (%d)\n", stream->getMaxPacketSize()); } - irq_interval=2; + // irq_interval=2; #endif // the SP specifies how many packets to buffer int buffers = stream->getNbPacketsIsoXmitBuffer(); Modified: trunk/libffado/src/libieee1394/IsoHandlerManager.h =================================================================== --- trunk/libffado/src/libieee1394/IsoHandlerManager.h 2007-12-24 11:21:13 UTC (rev 775) +++ trunk/libffado/src/libieee1394/IsoHandlerManager.h 2007-12-26 15:26:00 UTC (rev 776) @@ -33,7 +33,7 @@ #include <vector> -// #define THREAD_PER_ISOHANDLER +#define THREAD_PER_ISOHANDLER #define FFADO_MAX_ISO_HANDLERS_PER_PORT 16 Modified: trunk/libffado/src/libstreaming/StreamProcessorManager.cpp =================================================================== --- trunk/libffado/src/libstreaming/StreamProcessorManager.cpp 2007-12-24 11:21:13 UTC (rev 775) +++ trunk/libffado/src/libstreaming/StreamProcessorManager.cpp 2007-12-26 15:26:00 UTC (rev 776) @@ -409,7 +409,7 @@ } // wait for the syncsource to start running. // that will block the waitForPeriod call until everyone has started (theoretically) - int cnt = CYCLES_FOR_STARTUP * 2; // by then it should have started + int cnt = CYCLES_FOR_STARTUP * 20; // by then it should have started while (!m_SyncSource->isRunning() && cnt) { usleep(125); cnt--; @@ -431,8 +431,8 @@ bool StreamProcessorManager::alignReceivedStreams() { - #define NB_PERIODS_FOR_ALIGN_AVERAGE 20 - #define NB_ALIGN_TRIES 20 + #define ALIGN_AVERAGE_TIME_MSEC 200 + #define NB_ALIGN_TRIES 40 debugOutput( DEBUG_LEVEL_VERBOSE, "Aligning received streams...\n"); unsigned int nb_sync_runs; unsigned int nb_rcv_sp = m_ReceiveProcessors.size(); @@ -441,10 +441,15 @@ unsigned int i; + unsigned int periods_per_align_try = (ALIGN_AVERAGE_TIME_MSEC * getNominalRate()); + periods_per_align_try /= 1000; + periods_per_align_try /= getPeriodSize(); + debugOutput( DEBUG_LEVEL_VERBOSE, " averaging over %u periods...\n", periods_per_align_try); + bool aligned = false; int cnt = NB_ALIGN_TRIES; while (!aligned && cnt--) { - nb_sync_runs = NB_PERIODS_FOR_ALIGN_AVERAGE; + nb_sync_runs = periods_per_align_try; while(nb_sync_runs) { debugOutput( DEBUG_LEVEL_VERY_VERBOSE, " check (%d)...\n", nb_sync_runs); waitForPeriod(); @@ -455,7 +460,7 @@ diff = diffTicks(m_SyncSource->getTimeAtPeriod(), s->getTimeAtPeriod()); debugOutput( DEBUG_LEVEL_VERY_VERBOSE, " offset between SyncSP %p and SP %p is %lld ticks...\n", m_SyncSource, s, diff); - if ( nb_sync_runs == NB_PERIODS_FOR_ALIGN_AVERAGE ) { + if ( nb_sync_runs == periods_per_align_try ) { diff_between_streams[i] = diff; } else { diff_between_streams[i] += diff; @@ -474,7 +479,7 @@ for ( i = 0; i < nb_rcv_sp; i++) { StreamProcessor *s = m_ReceiveProcessors.at(i); - diff_between_streams[i] /= NB_PERIODS_FOR_ALIGN_AVERAGE; + diff_between_streams[i] /= periods_per_align_try; diff_between_streams_frames[i] = (int)roundf(diff_between_streams[i] / s->getTicksPerFrame()); debugOutput( DEBUG_LEVEL_VERBOSE, " avg offset between SyncSP %p and SP %p is %lld ticks, %d frames...\n", m_SyncSource, s, diff_between_streams[i], diff_between_streams_frames[i]); Modified: trunk/libffado/src/libstreaming/amdtp/AmdtpTransmitStreamProcessor.cpp =================================================================== --- trunk/libffado/src/libstreaming/amdtp/AmdtpTransmitStreamProcessor.cpp 2007-12-24 11:21:13 UTC (rev 775) +++ trunk/libffado/src/libstreaming/amdtp/AmdtpTransmitStreamProcessor.cpp 2007-12-26 15:26:00 UTC (rev 776) @@ -161,11 +161,14 @@ } else { + unsigned int now_cycle = ( unsigned int ) ( TICKS_TO_CYCLES ( m_1394service.getCycleTimerTicks() ) ); + debugOutput ( DEBUG_LEVEL_VERBOSE, - "Insufficient frames (NP): N=%02d, CY=%04u, TC=%04u, CUT=%04d\n", - fc, cycle, transmit_at_cycle, cycles_until_transmit ); - debugWarning( "Insufficient frames (NP): N=%02d, CY=%04u, TC=%04u, CUT=%04d\n", - fc, cycle, transmit_at_cycle, cycles_until_transmit ); + "Insufficient frames (NP): N=%02d, CY=%04u, TC=%04u, CUT=%04d, NOW=%04d\n", + fc, cycle, transmit_at_cycle, cycles_until_transmit, now_cycle ); + debugWarning("Insufficient frames (NP): N=%02d, CY=%04u, TC=%04u, CUT=%04d, NOW=%04d\n", + fc, cycle, transmit_at_cycle, cycles_until_transmit, now_cycle ); + // there is still time left to send the packet // we want the system to give this packet another go at a later time instant return eCRV_Again; // note that the raw1394 again system doesn't work as expected @@ -212,7 +215,8 @@ cycle, transmit_at_cycle, cycles_until_transmit, presentation_time, (unsigned int)TICKS_TO_CYCLES(presentation_time) ); - + debugShowBackLogLines(200); + flushDebugOutput(); // however, if we can send this sufficiently before the presentation // time, it could be harmless. // NOTE: dangerous since the device has no way of reporting that it didn't get Modified: trunk/libffado/src/libstreaming/generic/StreamProcessor.cpp =================================================================== --- trunk/libffado/src/libstreaming/generic/StreamProcessor.cpp 2007-12-24 11:21:13 UTC (rev 775) +++ trunk/libffado/src/libstreaming/generic/StreamProcessor.cpp 2007-12-26 15:26:00 UTC (rev 776) @@ -113,6 +113,9 @@ // however we have to take into account the fact that there is some sync delay (unknown at this point) packets_to_prebuffer -= 16; //FIXME: magic + // only queue a part (80%) of the theoretical max in order not to have too much 'not ready' cycles + packets_to_prebuffer = (packets_to_prebuffer * 8000) / 10000; + return packets_to_prebuffer; } @@ -614,8 +617,10 @@ return RAW1394_ISO_ERROR; } } - usleep(125); // only when using thread per handler mode! - return RAW1394_ISO_AGAIN; +// return RAW1394_ISO_AGAIN; + generateSilentPacketHeader(data, length, tag, sy, cycle, dropped_cycles, max_length); + generateSilentPacketData(data, length, tag, sy, cycle, dropped_cycles, max_length); + return RAW1394_ISO_DEFER; } else { debugError("Invalid return value: %d\n", result); return RAW1394_ISO_ERROR; |