Bug #1932: Fix race condition in converse pingpong examples 76/4276/2
authorNitin Bhat <nbhat4@illinois.edu>
Mon, 18 Jun 2018 21:54:55 +0000 (16:54 -0500)
committerNitin Bhat <nbhat4@illinois.edu>
Wed, 20 Jun 2018 13:42:50 +0000 (08:42 -0500)
commita064a4eb4395ead374f818dc4abf205a397e6490
tree7d3174c2ea9a16cc52d1134b146d728fbab5c990
parentc34c02df044a1c2a3e0b2b198d30c788c3970033
Bug #1932: Fix race condition in converse pingpong examples

The bug was caused by a race condition between the two PEs.
Because of a call to CmiInitCPUTopology, the scheduler is polled
for messages inside the slower PE. (CsdSchedulePoll() called inside
CmiInitCPUTopolgy in cputopology.c) and this causes the slower PE
to receive a message from the faster PE before it registers its
message handlers (which happens in the pingpong code after the
topology initialization). This is caused by the faster PE being ahead in
execution and sending a message with node1Handler before the slower PE even
registers the node1Handler. This race condition causes the bug, leading
to throwing an invalid handler error where the handler index of the
received message is greater than the maximum registered handler index.

The fix is to call CmiCPUTopologyInit after the initialization of the
handlers in order to avoid receiving messages with unregistered message
handlers.

Change-Id: I6770b8d246b6dee5a035946b2625bd15a5acfbbd
examples/converse/pingpong/pingpong.C
examples/converse/pingpong_multi/pingpong.C