Gilles Chanteperdrix wrote:
> 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)         *               *
> 

Right for my second suggestion. But err = [-]EINTR from the prologue
will remain != 0.

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux

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

Reply via email to