Core client: finite-state machine (FSM) structure

The core client can perform many activities (file transfers, computations, RPCs to scheduling servers) in parallel. To manage this parallelism, the core client is structures as a number of finite-state machines (FSM). For example, an HTTP transaction is represented by an FSM whose states might include:

FSMs of a particular type are managed by an FSM container. Each FSM container manages a set of FSMs, and provides a poll() function for detecting and performing state transitions. These functions are nonblocking; at the lowest level, they must use non-blocking network sockets, accessed using select().

The core client uses the following FSM types:

An FSM may be implemented using other FSMs; for example, FILE_XFER is implemented using HTTP_OP, which in turn is implemented using NET_XFER.