Channel with Termination Detection Service

It is often the case in a distributed computation that we want a particular component system of the computation to determine when and if the computation has terminated, for example, whether a routing update has reached all the routers in a network. Stating this independently of the specific distributed computation leads to the “distributed termination detection” problem [1]: given a generic distributed computation, say X, to obtain another distributed computation, say Y, that executes alongside X on the same platform, does not disturb X, and informs a particular system, which we call the “sink” system, when and if X has terminated. More precisely, each system in X is either “active” or “inactive”. An active system can do local computation, send and receive messages, and become inactive. An inactive system does nothing except become active upon receiving a message. The computation X is said to have terminated if all its systems are inactive and none of its messages are in transit. There are many elegant solutions to this problem, e.g., [1–4].