* [Xenomai-core] [Xenomai-git] posix: fix pthread_cond_*wait return value overwriting [not found] <mailman.4536.1268063545.8399.xenomai-git@xenomai.org> @ 2010-03-08 17:28 ` Jan Kiszka 2010-03-08 17:31 ` Jan Kiszka 2010-03-08 17:35 ` Gilles Chanteperdrix 0 siblings, 2 replies; 5+ messages in thread From: Jan Kiszka @ 2010-03-08 17:28 UTC (permalink / raw) To: Gilles Chanteperdrix; +Cc: xenomai-core xenomai-git-request@domain.hid 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. > + errno = 0; /* epilogue should return 0. */ > + break; > } > > - if (err == EINTR > - && __xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs), > - &count, sizeof(count))) > + if (err == EINTR > + &&__xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs), > + &count, sizeof(count))) > return -EFAULT; > - > - return -err; > + > + return err == 0 ? -perr : -err; > } > > /* pthread_cond_wait_epilogue(cond, mutex, count) */ Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Xenomai-core] [Xenomai-git] posix: fix pthread_cond_*wait return value overwriting 2010-03-08 17:28 ` [Xenomai-core] [Xenomai-git] posix: fix pthread_cond_*wait return value overwriting Jan Kiszka @ 2010-03-08 17:31 ` Jan Kiszka 2010-03-08 17:35 ` Gilles Chanteperdrix 1 sibling, 0 replies; 5+ messages in thread From: Jan Kiszka @ 2010-03-08 17:31 UTC (permalink / raw) To: Gilles Chanteperdrix; +Cc: xenomai-core Jan Kiszka wrote: > xenomai-git-request@domain.hid 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. In fact, you could even limit perr = err to "case 0:". Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Xenomai-core] [Xenomai-git] posix: fix pthread_cond_*wait return value overwriting 2010-03-08 17:28 ` [Xenomai-core] [Xenomai-git] posix: fix pthread_cond_*wait return value overwriting Jan Kiszka 2010-03-08 17:31 ` Jan Kiszka @ 2010-03-08 17:35 ` Gilles Chanteperdrix 2010-03-08 17:39 ` Jan Kiszka 1 sibling, 1 reply; 5+ messages in thread From: Gilles Chanteperdrix @ 2010-03-08 17:35 UTC (permalink / raw) To: Jan Kiszka; +Cc: xenomai-core Jan Kiszka wrote: > xenomai-git-request@domain.hid 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. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Xenomai-core] [Xenomai-git] posix: fix pthread_cond_*wait return value overwriting 2010-03-08 17:35 ` Gilles Chanteperdrix @ 2010-03-08 17:39 ` Jan Kiszka 2010-03-08 17:47 ` Gilles Chanteperdrix 0 siblings, 1 reply; 5+ messages in thread From: Jan Kiszka @ 2010-03-08 17:39 UTC (permalink / raw) To: Gilles Chanteperdrix; +Cc: xenomai-core Gilles Chanteperdrix wrote: > Jan Kiszka wrote: >> xenomai-git-request@domain.hid 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 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Xenomai-core] [Xenomai-git] posix: fix pthread_cond_*wait return value overwriting 2010-03-08 17:39 ` Jan Kiszka @ 2010-03-08 17:47 ` Gilles Chanteperdrix 0 siblings, 0 replies; 5+ messages in thread From: Gilles Chanteperdrix @ 2010-03-08 17:47 UTC (permalink / raw) To: Jan Kiszka; +Cc: xenomai-core Jan Kiszka wrote: > Gilles Chanteperdrix wrote: >> Jan Kiszka wrote: >>> xenomai-git-request@domain.hid 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. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2010-03-08 17:47 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <mailman.4536.1268063545.8399.xenomai-git@xenomai.org>
2010-03-08 17:28 ` [Xenomai-core] [Xenomai-git] posix: fix pthread_cond_*wait return value overwriting Jan Kiszka
2010-03-08 17:31 ` Jan Kiszka
2010-03-08 17:35 ` Gilles Chanteperdrix
2010-03-08 17:39 ` Jan Kiszka
2010-03-08 17:47 ` Gilles Chanteperdrix
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.