Changeset 993

Show
Ignore:
Timestamp:
04/09/08 10:04:46 (13 years ago)
Author:
ppalmers
Message:

fix deadlock (hackish but working)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/src/libieee1394/IsoHandlerManager.cpp

    r978 r993  
    209209            if(!m_SyncIsoHandler->waitForClient()) { 
    210210                debugError("Failed to wait for client\n"); 
    211                 return false; 
     211                // This can be due to error or due to timeout 
     212                 
     213                // sleep for a while 
     214                usleep(m_poll_timeout * 1000); // FIXME 
     215                // exit this iteration loop 
     216                return true; 
    212217            } 
    213218 
  • trunk/libffado/src/libstreaming/generic/StreamProcessor.cpp

    r967 r993  
    11461146    } else if (m_state == ePS_Running) { 
    11471147        return scheduleStateTransition(ePS_WaitingForStreamDisable, tx); 
     1148    } else if (m_state == ePS_DryRunning) { 
     1149        debugOutput(DEBUG_LEVEL_VERBOSE, " %p already in DryRunning state\n", this); 
     1150        return true; 
     1151    } else if (m_state == ePS_WaitingForStreamDisable) { 
     1152        debugOutput(DEBUG_LEVEL_VERBOSE, " %p already waiting to switch to DryRunning state\n", this); 
     1153        return true; 
    11481154    } else { 
    11491155        debugError("Cannot switch to ePS_DryRunning from %s\n", ePSToString(m_state)); 
     
    17051711    struct timespec ts; 
    17061712    int result; 
     1713    int max_runs = 1000; 
    17071714 
    17081715    if (clock_gettime(CLOCK_REALTIME, &ts) == -1) { 
     
    17111718    } 
    17121719 
    1713     // FIXME: hardcoded timeout of 0.1 sec 
    1714     ts.tv_nsec += 100 * 1000000LL; 
    1715     if (ts.tv_nsec > 1000000000LL) { 
    1716         ts.tv_sec += 1; 
    1717         ts.tv_nsec -= 1000000000LL; 
    1718     } 
    1719  
     1720    // FIXME: hardcoded timeout of 10 sec 
     1721//     ts.tv_nsec += 1000 * 1000000LL; 
     1722//     while (ts.tv_nsec > 1000000000LL) { 
     1723//         ts.tv_sec += 1; 
     1724//         ts.tv_nsec -= 1000000000LL; 
     1725//     } 
     1726    ts.tv_sec += 2; 
     1727     
    17201728    pthread_mutex_lock(&m_activity_cond_lock); 
    1721     while(!canProduce(nframes)) { 
     1729    while(!canProduce(nframes) && max_runs) { 
    17221730        result = pthread_cond_timedwait(&m_activity_cond, &m_activity_cond_lock, &ts); 
    17231731     
    1724         if (result == -1) { 
    1725             if (errno == ETIMEDOUT) { 
     1732        if(result != 0) { 
     1733            if (result == ETIMEDOUT) { 
    17261734                debugOutput(DEBUG_LEVEL_VERBOSE, 
    1727                             "(%p, %s) pthread_cond_timedwait() timed out\n", 
    1728                             this, getTypeString()); 
     1735                            "(%p, %s) pthread_cond_timedwait() timed out (result=%d)\n", 
     1736                            this, getTypeString(), result); 
     1737                pthread_mutex_unlock(&m_activity_cond_lock); 
     1738                return false; 
     1739            } else if (result == EINTR) { 
     1740                debugOutput(DEBUG_LEVEL_VERBOSE, 
     1741                            "(%p, %s) pthread_cond_timedwait() interrupted by signal (result=%d)\n", 
     1742                            this, getTypeString(), result); 
    17291743                pthread_mutex_unlock(&m_activity_cond_lock); 
    17301744                return false; 
    17311745            } else { 
    1732                 debugError("(%p, %s) pthread_cond_timedwait error\n",  
    1733                            this, getTypeString()); 
     1746                debugError("(%p, %s) pthread_cond_timedwait error (result=%d)\n",  
     1747                            this, getTypeString(), result); 
    17341748                pthread_mutex_unlock(&m_activity_cond_lock); 
    17351749                return false; 
     
    17381752    } 
    17391753    pthread_mutex_unlock(&m_activity_cond_lock); 
     1754    if(max_runs == 0) { 
     1755        debugWarning("(%p) runaway loop\n"); 
     1756    } 
    17401757    return true; 
    17411758} 
     
    17571774    int result; 
    17581775 
     1776    int max_runs = 1000; 
     1777 
    17591778    if (clock_gettime(CLOCK_REALTIME, &ts) == -1) { 
    17601779        debugError("clock_gettime failed\n"); 
     
    17621781    } 
    17631782 
    1764     // FIXME: hardcoded timeout of 0.1 sec 
    1765     ts.tv_nsec += 100 * 1000000LL; 
    1766     if (ts.tv_nsec > 1000000000LL) { 
    1767         ts.tv_sec += 1; 
    1768         ts.tv_nsec -= 1000000000LL; 
    1769     } 
     1783    // FIXME: hardcoded timeout of 10 sec 
     1784//     ts.tv_nsec += 1000 * 1000000LL; 
     1785//     while (ts.tv_nsec > 1000000000LL) { 
     1786//         ts.tv_sec += 1; 
     1787//         ts.tv_nsec -= 1000000000LL; 
     1788//     } 
     1789    ts.tv_sec += 2; 
    17701790 
    17711791    pthread_mutex_lock(&m_activity_cond_lock); 
    1772     while(!canConsume(nframes)) { 
     1792    while(!canConsume(nframes) && max_runs) { 
    17731793        result = pthread_cond_timedwait(&m_activity_cond, &m_activity_cond_lock, &ts); 
    1774         if (result == -1) { 
    1775             if (errno == ETIMEDOUT) { 
    1776                 debugOutput(DEBUG_LEVEL_VERBOSE, "(%p, %s) pthread_cond_timedwait() timed out\n", this, getTypeString()); 
     1794        if(result != 0) { 
     1795            if (result == ETIMEDOUT) { 
     1796                debugOutput(DEBUG_LEVEL_VERBOSE, 
     1797                            "(%p, %s) pthread_cond_timedwait() timed out (result=%d)\n", 
     1798                            this, getTypeString(), result); 
     1799                pthread_mutex_unlock(&m_activity_cond_lock); 
     1800                return false; 
     1801            } else if (result == EINTR) { 
     1802                debugOutput(DEBUG_LEVEL_VERBOSE, 
     1803                            "(%p, %s) pthread_cond_timedwait() interrupted by signal (result=%d)\n", 
     1804                            this, getTypeString(), result); 
    17771805                pthread_mutex_unlock(&m_activity_cond_lock); 
    17781806                return false; 
    17791807            } else { 
    1780                 debugError("(%p, %s) pthread_cond_timedwait error\n", this, getTypeString()); 
     1808                debugError("(%p, %s) pthread_cond_timedwait error (result=%d)\n",  
     1809                            this, getTypeString(), result); 
    17811810                pthread_mutex_unlock(&m_activity_cond_lock); 
    17821811                return false; 
    17831812            } 
    17841813        } 
     1814        max_runs--; 
    17851815    } 
    17861816    pthread_mutex_unlock(&m_activity_cond_lock); 
     1817     
     1818    if(max_runs == 0) { 
     1819        debugWarning("(%p) runaway loop\n"); 
     1820    } 
     1821     
    17871822    debugOutputExtreme(DEBUG_LEVEL_VERY_VERBOSE, 
    17881823                       "(%p, %s) leave ...\n",