On 07/26/2012 11:37 PM, Michael Haubenwallner wrote:
> On 07/26/12 20:29, Chet Ramey wrote:
>> OK, we have some data, we have a hypothesis, and we have a way to test it.
>> Let's test it.
>>
>> Michael, please apply the attached patch, disable RECYCLES_PIDS, and run
>> your tests again. This makes the check for previously-saved exit statuses
>> unconditional.
>>
>> Let's see if this is the one change of significance.
>
> Nope, doesn't fix the problem, even if it might be necessary though
> to not mix up stored exitstates.
For mixing up stored exitstates: This patch isn't enough to get below testcase
working reliably - it also is necessary to drop the pid_wrap detection, as pids
aren't guaranteed to be (re)used in any particular order. However, this highly
depends on the machine's load.
With attached patch I haven't been able to break the testcase below so far
on that AIX 6.1 box here.
But still, the other one using the $()-childs still fails.
---
for job in {128..511} {0..127}
do
if [[ ${job} -lt 128 ]]; then
( exit 17 ) &
else
( exit 1 ) &
fi
eval "pidof_${job}=\$!"
done
for job in {127..0}; do
pid=pidof_${job}
pid=${!pid}
wait ${pid}
ret=$?
if [ ${ret} -ne 17 ]; then
echo "job ${job} failed with ret ${ret}"
fi
done
---
Thank you!
/haubi/ (away for next 3 weeks)
*** jobs.c.orig 2012-07-27 15:29:54.283862562 +0200
--- jobs.c 2012-07-27 15:29:51.960238374 +0200
***************
*** 1897,1903 ****
--- 1897,1906 ----
#endif
+ #if 0
if (pid_wrap > 0)
+ #endif
delete_old_job (pid);
+ #if 0
#if !defined (RECYCLES_PIDS)
/* Only check for saved status if we've saved more than CHILD_MAX
***************
*** 1905,1908 ****
--- 1908,1912 ----
if ((js.c_reaped + bgpids.npid) >= js.c_childmax)
#endif
+ #endif
bgp_delete (pid); /* new process, discard any saved status */