Changeset 868

Show
Ignore:
Timestamp:
01/20/08 05:05:57 (13 years ago)
Author:
ppalmers
Message:

detect when a handler has died on us

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/config.h.in

    r866 r868  
    4646#define DEBUG_EXTREME_ENABLE        0 
    4747 
    48 #define IEEE1394SERVICE_USE_CYCLETIMER_DLL  1 
     48#define IEEE1394SERVICE_USE_CYCLETIMER_DLL  0 
    4949#define IEEE1394SERVICE_CYCLETIMER_DLL_UPDATE_INTERVAL_USEC 50000 
    5050#define IEEE1394SERVICE_MAX_FIREWIRE_PORTS  16 
     
    6262#define ISOHANDLER_USE_POLL                 0 
    6363#define ISOHANDLER_FLUSH_BEFORE_ITERATE     0 
     64 
     65#define ISOHANDLER_DEATH_DETECT_TIMEOUT_USECS    1000000LL 
    6466 
    6567#define ISOHANDLERMANAGER_MAX_ISO_HANDLERS_PER_PORT         16 
  • trunk/libffado/src/libieee1394/IsoHandler.cpp

    r866 r868  
    8383   , m_max_packet_size( 1024 ) 
    8484   , m_irq_interval( -1 ) 
     85   , m_last_wakeup( -1 ) 
    8586   , m_Client( 0 ) 
    8687   , m_poll_timeout( 100 ) 
     
    102103   , m_max_packet_size( max_packet_size ) 
    103104   , m_irq_interval( irq ) 
     105   , m_last_wakeup( -1 ) 
    104106   , m_Client( 0 ) 
    105107   , m_poll_timeout( 100 ) 
     
    122124   , m_max_packet_size( max_packet_size ) 
    123125   , m_irq_interval( irq ) 
     126   , m_last_wakeup( -1 ) 
    124127   , m_Client( 0 ) 
    125128   , m_poll_timeout( 100 ) 
     
    163166    } 
    164167    return true; 
     168} 
     169 
     170bool 
     171IsoHandler::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    } 
    165185} 
    166186 
     
    473493                       "received packet: length=%d, channel=%d, cycle=%d\n", 
    474494                       length, channel, cycle); 
     495    #ifdef DEBUG 
     496    m_last_wakeup = m_manager.get1394Service().getCurrentTimeAsUsecs(); 
     497    #endif 
    475498    if(m_Client) { 
    476499        return m_Client->putPacket(data, length, channel, tag, sy, cycle, dropped); 
     
    489512                       "sending packet: length=%d, cycle=%d\n", 
    490513                       *length, cycle); 
     514    #ifdef DEBUG 
     515    m_last_wakeup = m_manager.get1394Service().getCurrentTimeAsUsecs(); 
     516    #endif 
    491517    if(m_Client) { 
    492518        return m_Client->getPacket(data, length, tag, sy, cycle, dropped, m_max_packet_size); 
     
    511537    //     raw1394_iso_shutdown(m_handle); 
    512538    m_State = E_Prepared; 
     539    m_last_wakeup = -1; 
    513540 
    514541    debugOutput( DEBUG_LEVEL_VERBOSE, "Preparing iso handler (%p, client=%p)\n", this, m_Client); 
  • trunk/libffado/src/libieee1394/IsoHandler.h

    r866 r868  
    9898    bool disable(); 
    9999 
     100    bool isDead(); 
     101 
    100102    void flush(); 
    101103    enum EHandlerType getType() {return m_type;}; 
     
    135137    int             m_irq_interval; 
    136138 
     139    int64_t         m_last_wakeup; 
     140 
    137141    Streaming::StreamProcessor *m_Client; 
    138142 
  • trunk/libffado/src/libieee1394/IsoHandlerManager.cpp

    r866 r868  
    106106            // receive handlers are always poll'ed 
    107107            // transmit handlers only when the client is ready 
    108             if (h->getType() == IsoHandler::eHT_Receive || h->tryWaitForClient()) { 
     108            if (h->tryWaitForClient()) { 
    109109                m_IsoHandler_map_shadow[cnt] = h; 
    110110                m_poll_fds_shadow[cnt].fd = h->getFileDescriptor(); 
     
    171171    for (i = 0; i < m_poll_nfds_shadow; i++) { 
    172172        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()); 
    175179        } 
    176180        if (m_poll_fds_shadow[i].revents & POLLERR) { 
     
    194198            } 
    195199        } 
     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         
    196211    } 
    197212    DEBUG_EXTREME( uint64_t iter_exit = m_service.getCurrentTimeAsUsecs() );