Revision: 2886 Author: eliot Date: 2014-03-28 16:11:48 -0700 (Fri, 28 Mar 2014) Log Message: ----------- Use pthread_atfork to reinstall the heartbeat thread post fork.
Modified Paths: -------------- branches/Cog/platforms/unix/vm/sqUnixHeartbeat.c
Property Changed: ---------------- branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h ___________________________________________________________________ Modified: checkindate - Fri Mar 28 12:16:44 PDT 2014 + Fri Mar 28 16:10:05 PDT 2014
Modified: branches/Cog/platforms/unix/vm/sqUnixHeartbeat.c =================================================================== --- branches/Cog/platforms/unix/vm/sqUnixHeartbeat.c 2014-03-28 19:19:16 UTC (rev 2885) +++ branches/Cog/platforms/unix/vm/sqUnixHeartbeat.c 2014-03-28 23:11:48 UTC (rev 2886) @@ -335,7 +335,9 @@
typedef enum { dead, condemned, nascent, quiescent, active } machine_state;
-static int stateMachinePolicy; +#define UNDEFINED 0xBADF00D + +static int stateMachinePolicy = UNDEFINED; static struct sched_param stateMachinePriority;
static volatile machine_state beatState = nascent; @@ -386,19 +388,30 @@ struct timespec halfAMo; pthread_t careLess;
- if ((er = pthread_getschedparam(pthread_self(), - &stateMachinePolicy, - &stateMachinePriority))) { - errno = er; - perror("pthread_getschedparam failed"); - exit(errno); + /* First time through choose a policy and priority for the heartbeat thread, + * and install ioInitHeartbeat via pthread_atfork to be run again in a forked + * child, restarting the heartbeat in a forked child. + */ + if (stateMachinePolicy == UNDEFINED) { + if ((er = pthread_getschedparam(pthread_self(), + &stateMachinePolicy, + &stateMachinePriority))) { + errno = er; + perror("pthread_getschedparam failed"); + exit(errno); + } + assert(stateMachinePolicy != UNDEFINED); + ++stateMachinePriority.sched_priority; + /* If the priority isn't appropriate for the policy (typically + * SCHED_OTHER) then change policy. + */ + if (sched_get_priority_max(stateMachinePolicy) < stateMachinePriority.sched_priority) + stateMachinePolicy = SCHED_FIFO; + pthread_atfork(0, /*prepare*/ 0, /*parent*/ ioInitHeartbeat /*child*/); } - ++stateMachinePriority.sched_priority; - /* If the priority isn't appropriate for the policy (typically SCHED_OTHER) - * then change policy. - */ - if (sched_get_priority_max(stateMachinePolicy) < stateMachinePriority.sched_priority) - stateMachinePolicy = SCHED_FIFO; + else /* subsequently (in the child) init beatState before creating thread */ + beatState = nascent; + halfAMo.tv_sec = 0; halfAMo.tv_nsec = 1000 * 100; if ((er= pthread_create(&careLess,
vm-dev@lists.squeakfoundation.org