Changeset 1477:01b1ddada8ad


Ignore:
Timestamp:
08/29/10 04:37:13 (18 months ago)
Author:
niam
Branch:
default
Message:

[pc::sync] use -timed versions of interlock API for acquirning lock for a given timeout

Location:
sources/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • sources/src/pcSyncProcess.cc

    r1464 r1477  
    225225 
    226226#ifdef XSI_IPC 
     227    lock->operations[0].sem_op = -1; 
     228 
    227229    if (microseconds == 0) { 
    228         lock->operations[0].sem_op = -1; 
    229  
    230230        if (semop(lock->keeper, lock->operations, 1) != 0) 
    231231            dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 
    232232    } else { 
    233         bool locked = true; 
    234         unsigned long slept = 0; 
    235  
    236         lock->operations[0].sem_op = -1; 
    237         lock->operations[0].sem_flg = IPC_NOWAIT; 
    238  
    239         while (locked) { 
    240             if (semop(lock->keeper, lock->operations, 1) != 0) { 
    241                 if (errno != EAGAIN) { 
    242                     lock->operations[0].sem_flg = 0; 
    243  
    244                     dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 
    245                 } 
    246  
    247                 if (usleep(1) == -1) { 
    248                     lock->operations[0].sem_flg = 0; 
    249  
    250                     dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 
    251                 } 
    252  
    253                 slept += 1; 
    254  
    255                 if (slept > microseconds) { 
    256                     lock->operations[0].sem_flg = 0; 
    257  
    258                     dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_LIBDODO, PROCESSEX_CANNOTLOCK, PCSYNCPROCESSEX_CANNOTLOCK_STR, __LINE__, __FILE__); 
    259                 } 
    260             } else { 
    261                 locked = false; 
    262             } 
     233        timespec ts = {microseconds/1000000, (microseconds%1000000)*1000}; 
     234 
     235        if (semtimedop(lock->keeper, lock->operations, 1, &ts) != 0) { 
     236            if (errno == EAGAIN) 
     237                dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_LIBDODO, PROCESSEX_CANNOTLOCK, PCSYNCPROCESSEX_CANNOTLOCK_STR, __LINE__, __FILE__); 
     238            else 
     239                dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 
    263240        } 
    264241    } 
     
    268245            dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 
    269246    } else { 
    270         bool locked = true; 
    271         unsigned long slept = 0; 
    272  
    273         while (locked) { 
    274             if (sem_trywait(lock->keeper) != 0) { 
    275                 if (errno != EAGAIN) 
    276                     dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 
    277  
    278                 if (usleep(1) == -1) 
    279                     dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 
    280  
    281                 slept += 1; 
    282  
    283                 if (slept > microseconds) 
    284                     dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_LIBDODO, PROCESSEX_CANNOTLOCK, PCSYNCPROCESSEX_CANNOTLOCK_STR, __LINE__, __FILE__); 
    285             } else { 
    286                 locked = false; 
    287             } 
     247        timespec ts = {microseconds/1000000, (microseconds%1000000)*1000}; 
     248        timespec now; 
     249 
     250        clock_gettime(CLOCK_REALTIME, &now); 
     251        ts.tv_sec += now.tv_sec; 
     252        ts.tv_nsec += now.tv_nsec; 
     253        if (ts.tv_nsec > 999999999) { 
     254            ts.tv_sec += 1; 
     255            ts.tv_nsec -= 999999999; 
     256        } 
     257 
     258        if (sem_timedwait(lock->keeper, &ts) != 0) { 
     259            if (errno == ETIMEDOUT) 
     260                dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_LIBDODO, PROCESSEX_CANNOTLOCK, PCSYNCPROCESSEX_CANNOTLOCK_STR, __LINE__, __FILE__); 
     261            else 
     262                dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 
    288263        } 
    289264    } 
  • sources/src/pcSyncThread.cc

    r1464 r1477  
    128128            dodo_throw exception::basic(exception::MODULE_PCSYNCTHREAD, THREADEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 
    129129    } else { 
    130         bool locked = true; 
    131         unsigned long slept = 0; 
     130        timespec ts = {microseconds/1000000, (microseconds%1000000)*1000}; 
     131        timespec now; 
    132132 
    133         while (locked) { 
    134             errno = pthread_mutex_trylock(&lock->keeper); 
    135             if (errno != 0) { 
    136                 if (errno != EBUSY) 
    137                     dodo_throw exception::basic(exception::MODULE_PCSYNCTHREAD, THREADEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 
     133        clock_gettime(CLOCK_REALTIME, &now); 
     134        ts.tv_sec += now.tv_sec; 
     135        ts.tv_nsec += now.tv_nsec; 
     136        if (ts.tv_nsec > 999999999) { 
     137            ts.tv_sec += 1; 
     138            ts.tv_nsec -= 999999999; 
     139        } 
    138140 
    139                 if (usleep(1) == -1) 
    140                     dodo_throw exception::basic(exception::MODULE_PCSYNCTHREAD, THREADEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 
    141  
    142                 slept += 1; 
    143  
    144                 if (slept > microseconds) 
    145                     dodo_throw exception::basic(exception::MODULE_PCSYNCTHREAD, THREADEX_ACQUIRE, exception::ERRNO_ERRNO, THREADEX_CANNOTLOCK, PCSYNCTHREADEX_CANNOTLOCK_STR, __LINE__, __FILE__); 
    146             } else { 
    147                 locked = false; 
    148             } 
     141        errno = pthread_mutex_timedlock(&lock->keeper, &ts); 
     142        if (errno != 0) { 
     143            if (errno == ETIMEDOUT) 
     144                dodo_throw exception::basic(exception::MODULE_PCSYNCTHREAD, THREADEX_ACQUIRE, exception::ERRNO_ERRNO, THREADEX_CANNOTLOCK, PCSYNCTHREADEX_CANNOTLOCK_STR, __LINE__, __FILE__); 
     145            else 
     146                dodo_throw exception::basic(exception::MODULE_PCSYNCTHREAD, THREADEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 
    149147        } 
    150148    } 
Note: See TracChangeset for help on using the changeset viewer.