Jan Kiszka wrote:
> 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.

Yes, Ok. Maybe a (failed) attempt to get gcc to stop whining about perr
being used non-initialized, which remained in the way. Which I finally
solved by initializing the local variable with 0.

-- 
                                            Gilles.

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

Reply via email to