Changeset 1262

Show
Ignore:
Timestamp:
06/21/08 04:24:17 (13 years ago)
Author:
ppalmers
Message:

fix small bug in calculation of semaphore timeout: ensuring that nsec < 1 sec should be done on the resulting timespec. Made SPM activity timeout dependent on the period size, since we can expect that there is activity at least once every period.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/libffado-2.0/src/libieee1394/IsoHandlerManager.cpp

    r1247 r1262  
    320320    struct timespec ts; 
    321321    int result; 
     322    long long int timeout_nsec = ISOHANDLERMANAGER_ISO_TASK_WAIT_TIMEOUT_USECS * 1000LL; 
    322323 
    323324    if (clock_gettime(CLOCK_REALTIME, &ts) == -1) { 
     
    325326        return eAR_Error; 
    326327    } 
    327     long long int timeout_nsec=0; 
    328     int timeout_sec = 0; 
    329  
    330     timeout_nsec = ISOHANDLERMANAGER_ISO_TASK_WAIT_TIMEOUT_USECS * 1000LL; 
    331     timeout_sec = 0; 
    332     while(timeout_nsec >= 1000000000LL) { 
    333         timeout_sec += 1; 
    334         timeout_nsec -= 1000000000LL; 
    335     } 
     328 
    336329    ts.tv_nsec += timeout_nsec; 
    337     ts.tv_sec += timeout_sec; 
     330    while(ts.tv_nsec >= 1000000000LL) { 
     331        ts.tv_sec += 1; 
     332        ts.tv_nsec -= 1000000000LL; 
     333    } 
    338334 
    339335    result = sem_timedwait(&m_activity_semaphore, &ts); 
     
    350346                        this, result); 
    351347            return eAR_Interrupted; 
     348        } else if (errno == EINVAL) { 
     349            debugError("(%p) sem_timedwait error (result=%d errno=EINVAL)\n",  
     350                        this, result); 
     351            debugError("(%p) timeout_nsec=%lld ts.sec=%d ts.nsec=%lld\n",  
     352                       this, timeout_nsec, ts.tv_sec, ts.tv_nsec); 
     353            return eAR_Error; 
    352354        } else { 
    353355            debugError("(%p) sem_timedwait error (result=%d errno=%d)\n",  
    354356                        this, result, errno); 
    355             debugError("(%p) timeout_sec=%d timeout_nsec=%lld ts.sec=%d ts.nsec=%lld\n",  
    356                        this, timeout_sec, timeout_nsec, ts.tv_sec, ts.tv_nsec); 
     357            debugError("(%p) timeout_nsec=%lld ts.sec=%d ts.nsec=%lld\n",  
     358                       this, timeout_nsec, ts.tv_sec, ts.tv_nsec); 
    357359            return eAR_Error; 
    358360        } 
  • branches/libffado-2.0/src/libstreaming/StreamProcessorManager.cpp

    r1165 r1262  
    123123    int result; 
    124124 
    125     if (clock_gettime(CLOCK_REALTIME, &ts) == -1) { 
    126         debugError("clock_gettime failed\n"); 
    127         return eAR_Error; 
    128     } 
    129125    long long int timeout_nsec=0; 
    130     int timeout_sec = 0; 
    131126    if (m_activity_wait_timeout_usec >= 0) { 
    132127        timeout_nsec = m_activity_wait_timeout_usec * 1000LL; 
    133         timeout_sec = 0; 
    134         while(timeout_nsec >= 1000000000LL) { 
    135             timeout_sec += 1
    136             timeout_nsec -= 1000000000LL
     128 
     129        if (clock_gettime(CLOCK_REALTIME, &ts) == -1) { 
     130            debugError("clock_gettime failed\n")
     131            return eAR_Error
    137132        } 
    138133        ts.tv_nsec += timeout_nsec; 
    139         ts.tv_sec += timeout_sec; 
     134        while(ts.tv_nsec >= 1000000000LL) { 
     135            ts.tv_sec += 1; 
     136            ts.tv_nsec -= 1000000000LL; 
     137        } 
    140138    } 
    141139 
     
    157155                        this, result); 
    158156            return eAR_Interrupted; 
     157        } else if (errno == EINVAL) { 
     158            debugError("(%p) sem_[timed]wait error (result=%d errno=EINVAL)\n",  
     159                        this, result); 
     160            debugError("(%p) timeout_nsec=%lld ts.sec=%d ts.nsec=%lld\n",  
     161                       this, timeout_nsec, ts.tv_sec, ts.tv_nsec); 
     162            return eAR_Error; 
    159163        } else { 
    160164            debugError("(%p) sem_[timed]wait error (result=%d errno=%d)\n",  
    161165                        this, result, errno); 
    162             debugError("(%p) timeout_sec=%d timeout_nsec=%lld ts.sec=%d ts.nsec=%lld\n",  
    163                        this, timeout_sec, timeout_nsec, ts.tv_sec, ts.tv_nsec); 
     166            debugError("(%p) timeout_nsec=%lld ts.sec=%d ts.nsec=%lld\n",  
     167                       this, timeout_nsec, ts.tv_sec, ts.tv_nsec); 
    164168            return eAR_Error; 
    165169        } 
     
    318322        return false; 
    319323    } 
     324 
     325    // set the activity timeout value to two periods worth of usecs. 
     326    // since we can expect activity once every period, but we might have some 
     327    // offset, the safe value is two periods. 
     328    int timeout_usec = 2*1000LL * 1000LL * m_period / m_nominal_framerate; 
     329    debugOutput(DEBUG_LEVEL_VERBOSE, "setting activity timeout to %d\n", timeout_usec); 
     330    setActivityWaitTimeoutUsec(timeout_usec); 
     331 
    320332    return true; 
    321333} 
  • branches/libffado-2.0/src/libstreaming/StreamProcessorManager.h

    r1045 r1262  
    9595    void setNbBuffers(unsigned int nb_buffers) 
    9696            {m_nb_buffers = nb_buffers;}; 
    97     int getNbBuffers()  
     97    unsigned int getNbBuffers()  
    9898            {return m_nb_buffers;}; 
     99 
     100    // this is the amount of usecs we wait before an activity 
     101    // timeout occurs. 
     102    void setActivityWaitTimeoutUsec(int usec) 
     103            {m_activity_wait_timeout_usec = usec;}; 
     104    int getActivityWaitTimeoutUsec()  
     105            {return m_activity_wait_timeout_usec;}; 
    99106 
    100107    int getPortCount(enum Port::E_PortType, enum Port::E_Direction);