Changeset 868
- Timestamp:
- 01/20/08 05:05:57 (13 years ago)
- Files:
-
- trunk/libffado/config.h.in (modified) (2 diffs)
- trunk/libffado/src/libieee1394/IsoHandler.cpp (modified) (7 diffs)
- trunk/libffado/src/libieee1394/IsoHandler.h (modified) (2 diffs)
- trunk/libffado/src/libieee1394/IsoHandlerManager.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libffado/config.h.in
r866 r868 46 46 #define DEBUG_EXTREME_ENABLE 0 47 47 48 #define IEEE1394SERVICE_USE_CYCLETIMER_DLL 148 #define IEEE1394SERVICE_USE_CYCLETIMER_DLL 0 49 49 #define IEEE1394SERVICE_CYCLETIMER_DLL_UPDATE_INTERVAL_USEC 50000 50 50 #define IEEE1394SERVICE_MAX_FIREWIRE_PORTS 16 … … 62 62 #define ISOHANDLER_USE_POLL 0 63 63 #define ISOHANDLER_FLUSH_BEFORE_ITERATE 0 64 65 #define ISOHANDLER_DEATH_DETECT_TIMEOUT_USECS 1000000LL 64 66 65 67 #define ISOHANDLERMANAGER_MAX_ISO_HANDLERS_PER_PORT 16 trunk/libffado/src/libieee1394/IsoHandler.cpp
r866 r868 83 83 , m_max_packet_size( 1024 ) 84 84 , m_irq_interval( -1 ) 85 , m_last_wakeup( -1 ) 85 86 , m_Client( 0 ) 86 87 , m_poll_timeout( 100 ) … … 102 103 , m_max_packet_size( max_packet_size ) 103 104 , m_irq_interval( irq ) 105 , m_last_wakeup( -1 ) 104 106 , m_Client( 0 ) 105 107 , m_poll_timeout( 100 ) … … 122 124 , m_max_packet_size( max_packet_size ) 123 125 , m_irq_interval( irq ) 126 , m_last_wakeup( -1 ) 124 127 , m_Client( 0 ) 125 128 , m_poll_timeout( 100 ) … … 163 166 } 164 167 return true; 168 } 169 170 bool 171 IsoHandler::isDead() 172 { 173 if(m_last_wakeup < 0) return false; // startup artifacts 174 if(m_State != E_Running) return false; // not running can't be dead 175 int64_t now = m_manager.get1394Service().getCurrentTimeAsUsecs(); 176 int64_t last_call = m_last_wakeup + ISOHANDLER_DEATH_DETECT_TIMEOUT_USECS; 177 if(now > last_call) { 178 debugOutput(DEBUG_LEVEL_VERBOSE, 179 "(%p, %s) Handler timed out: %lld usecs since last wakeup\n", 180 this, getTypeString(), now-m_last_wakeup); 181 return true; 182 } else { 183 return false; 184 } 165 185 } 166 186 … … 473 493 "received packet: length=%d, channel=%d, cycle=%d\n", 474 494 length, channel, cycle); 495 #ifdef DEBUG 496 m_last_wakeup = m_manager.get1394Service().getCurrentTimeAsUsecs(); 497 #endif 475 498 if(m_Client) { 476 499 return m_Client->putPacket(data, length, channel, tag, sy, cycle, dropped); … … 489 512 "sending packet: length=%d, cycle=%d\n", 490 513 *length, cycle); 514 #ifdef DEBUG 515 m_last_wakeup = m_manager.get1394Service().getCurrentTimeAsUsecs(); 516 #endif 491 517 if(m_Client) { 492 518 return m_Client->getPacket(data, length, tag, sy, cycle, dropped, m_max_packet_size); … … 511 537 // raw1394_iso_shutdown(m_handle); 512 538 m_State = E_Prepared; 539 m_last_wakeup = -1; 513 540 514 541 debugOutput( DEBUG_LEVEL_VERBOSE, "Preparing iso handler (%p, client=%p)\n", this, m_Client); trunk/libffado/src/libieee1394/IsoHandler.h
r866 r868 98 98 bool disable(); 99 99 100 bool isDead(); 101 100 102 void flush(); 101 103 enum EHandlerType getType() {return m_type;}; … … 135 137 int m_irq_interval; 136 138 139 int64_t m_last_wakeup; 140 137 141 Streaming::StreamProcessor *m_Client; 138 142 trunk/libffado/src/libieee1394/IsoHandlerManager.cpp
r866 r868 106 106 // receive handlers are always poll'ed 107 107 // transmit handlers only when the client is ready 108 if (h-> getType() == IsoHandler::eHT_Receive || h->tryWaitForClient()) {108 if (h->tryWaitForClient()) { 109 109 m_IsoHandler_map_shadow[cnt] = h; 110 110 m_poll_fds_shadow[cnt].fd = h->getFileDescriptor(); … … 171 171 for (i = 0; i < m_poll_nfds_shadow; i++) { 172 172 if(m_poll_fds_shadow[i].revents) { 173 debugOutputExtreme(DEBUG_LEVEL_VERY_VERBOSE, "received events: %08X for (%p)\n", 174 m_poll_fds_shadow[i].revents, m_IsoHandler_map_shadow[i]); 173 debugOutput(DEBUG_LEVEL_VERBOSE, 174 "received events: %08X for (%d/%d, %p, %s)\n", 175 m_poll_fds_shadow[i].revents, 176 i, m_poll_nfds_shadow, 177 m_IsoHandler_map_shadow[i], 178 m_IsoHandler_map_shadow[i]->getTypeString()); 175 179 } 176 180 if (m_poll_fds_shadow[i].revents & POLLERR) { … … 194 198 } 195 199 } 200 201 #ifdef DEBUG 202 // check if the handler is still alive 203 if(m_IsoHandler_map_shadow[i]->isDead()) { 204 debugError("Iso handler %p (%s) is dead!\n", 205 m_IsoHandler_map_shadow[i], 206 m_IsoHandler_map_shadow[i]->getTypeString()); 207 return false; // shutdown the system 208 } 209 #endif 210 196 211 } 197 212 DEBUG_EXTREME( uint64_t iter_exit = m_service.getCurrentTimeAsUsecs() );