Exemplo n.º 1
0
/* 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);
}
Exemplo n.º 2
0
/* 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);
}