Jan Kiszka wrote:
> xenomai-git-requ...@gna.org wrote:
>> diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
>> index 6c3ec3a..2a97a2d 100644
>> --- a/ksrc/skins/posix/syscall.c
>> +++ b/ksrc/skins/posix/syscall.c
>> @@ -1520,7 +1520,7 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
>> *regs)
>>      union __xeno_mutex mx, *umx;
>>      unsigned timed, count;
>>      struct timespec ts;
>> -    int err;
>> +    int err, perr = 0;
>>  
>>      ucnd = (union __xeno_cond *)__xn_reg_arg1(regs);
>>      umx = (union __xeno_mutex *)__xn_reg_arg2(regs);
>> @@ -1560,7 +1560,10 @@ static int __pthread_cond_wait_prologue(struct 
>> pt_regs *regs)
>>                                                  &mx.shadow_mutex,
>>                                                  &count, timed, XN_INFINITE);
>>  
>> -    if (err == 0 || err == ETIMEDOUT) {
>> +    switch(err) {
>> +    case 0:
>> +    case ETIMEDOUT:
>> +            perr = errno = err;
>>              err = -pse51_cond_timedwait_epilogue(cur, &cnd.shadow_cond,
>>                                                  &mx.shadow_mutex, count);
>>              if (err == 0 &&
>> @@ -1569,14 +1572,20 @@ static int __pthread_cond_wait_prologue(struct 
>> pt_regs *regs)
>>                                         &mx.shadow_mutex.lockcnt,
>>                                         sizeof(umx->shadow_mutex.lockcnt)))
>>                      return -EFAULT;
>> +            break;
>> +
>> +    case EINTR:
>> +            perr = err;
> 
> Minor cleanup: This is not needed as err != 0, so perr will not be
> evaluated anymore. Same for native.

No, err may be 0, if the epilogue returns 0.

The following table should explains how I came to this solution:

perr            err             wanted          err == 0 ? perr : err
0               0               0               0
0               EINTR           EINTR           EINTR
0               *               *               *
ETIMEDOUT       0               ETIMEDOUT       ETIMEDOUNT
ETIMEDOUT       EINTR           EINTR           EINTR
                          (epi ETIMEDOUT)
ETIMEDOUT       *               *               *
EINTR           -(perr)         EINTR           EINTR
*               -(perr)         *               *


-- 
                                            Gilles.

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to