/* Change an identity landing into a garbage landing. */ void SNetBecomeGarbage(landing_t *land) { /* One static node for all garbage landings. */ static node_t garbage_node = { NODE_garbage, SNetNodeGarbage, SNetStopGarbage, SNetTermGarbage }; landing_identity_t *ident = LAND_SPEC(land, identity); snet_stream_desc_t *desc = ident->outdesc; /* Only identity landings can become a garbage landing. */ assert(land->type == LAND_identity); if (SNetDebug()) { printf("%s: node %s land %s (prev %s)\n", __func__, SNetNodeName(land->node), SNetLandingName(land), SNetLandingTypeName(ident->prev_type)); } /* Init new state to ``garbage'' */ land->type = LAND_garbage; land->node = &garbage_node; /* Guarantee that destination stream persists until termination. */ DESC_INCR(desc); LAND_INCR(desc->landing); assert(desc == LAND_SPEC(land, siso)->outdesc); }
/* Change a landing into an identity landing. */ void SNetBecomeIdentity(landing_t *land, snet_stream_desc_t *out) { /* One static node for all identities. */ static node_t identity_node = { NODE_identity, SNetNodeIdentity, SNetStopIdentity, SNetTermIdentity }; landing_type_t prev_type = land->type; if (SNetDebugGC()) { printf("%s: node %s land %s\n", __func__, SNetNodeName(land->node), SNetLandingName(land)); } /* Destroy old resources */ SNetCleanupLanding(land); /* Init new state */ land->type = LAND_identity; land->node = &identity_node; LAND_SPEC(land, identity)->outdesc = out; LAND_SPEC(land, identity)->prev_type = prev_type; assert(land->refs > 0); }