Jan Kiszka wrote:
> [email protected] 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
[email protected]
https://mail.gna.org/listinfo/xenomai-core