/* Terminate any kind of dripback landing. */ void SNetTermDripBack(landing_t *land, fifo_t *fifo) { trace(__func__); if (land->type == LAND_dripback1) { landing_dripback1_t *db1 = LAND_SPEC(land, dripback1); if (db1->controldesc) { snet_record_t *rec = SNetRecCreate(REC_terminate); land->worker = SNetThreadGetSelf(); SNetWrite(&db1->controldesc, rec, false); SNetFifoPut(fifo, db1->controldesc); } else { SNetLandingDone(db1->dripback2); } SNetFreeLanding(land); } else if (land->type == LAND_dripback2) { landing_dripback2_t *db2 = LAND_SPEC(land, dripback2); if (db2->instdesc) { fprintf(stderr, "%s: Premature termination of dripback2\n", __func__); SNetFifoPut(fifo, db2->instdesc); db2->instdesc = NULL; } if (db2->outdesc) { SNetFifoPut(fifo, db2->outdesc); db2->outdesc = NULL; } SNetFreeLanding(land); } else { assert(0); } }
/* Terminate any kind of feedback landing. */ void SNetTermFeedback(landing_t *land, fifo_t *fifo) { trace(__func__); if (land->type == LAND_feedback1) { landing_feedback1_t *fb1 = LAND_SPEC(land, feedback1); landing_feedback3_t *fb3 = LAND_SPEC(fb1->feedback3, feedback3); assert(fb3->terminate == FeedbackInitial); if (fb1->outdesc) { SNetFifoPut(fifo, fb1->outdesc); } if (fb1->instdesc) { snet_record_t *recdet = SNetRecCreate(REC_detref, -1L, fb1->feedback3, NULL); land->worker = SNetThreadGetSelf(); SNetWrite(&fb1->instdesc, recdet, false); SNetFifoPut(fifo, fb1->instdesc); } SNetLandingDone(fb1->feedback2); SNetLandingDone(fb1->feedback4); SNetLandingDone(fb1->feedback3); SNetFreeLanding(land); } else if (land->type == LAND_feedback2) { landing_feedback2_t *fb2 = LAND_SPEC(land, feedback2); if (fb2->instdesc) { SNetFifoPut(fifo, fb2->instdesc); } SNetLandingDone(fb2->feedback3); SNetFreeLanding(land); } else if (land->type == LAND_feedback3) { landing_feedback3_t *fb3 = LAND_SPEC(land, feedback3); SNetLandingDone(fb3->feedback4); SNetFreeLanding(land); } else if (land->type == LAND_feedback4) { landing_feedback4_t *fb4 = LAND_SPEC(land, feedback4); if (fb4->outdesc) { SNetFifoPut(fifo, fb4->outdesc); } SNetFreeLanding(land); } else { assert(0); } }
/* Terminate a garbage landing: decrease references to subsequent resources. */ void SNetTermGarbage(landing_t *land, fifo_t *fifo) { snet_stream_desc_t *desc = LAND_SPEC(land, siso)->outdesc; trace(__func__); assert(desc); assert(desc->refs > 0); SNetLandingDone(desc->landing); SNetFifoPut(fifo, desc); SNetFreeLanding(land); }
/* Deallocate input node */ void SNetStopInput(node_t *node, fifo_t *fifo) { input_arg_t *iarg = NODE_SPEC(node, input); trace(__func__); iarg->indesc->landing->refs = 0; SNetFreeLanding(iarg->indesc->landing); SNetDelete(iarg->indesc); SNetStopStream(iarg->output, fifo); SNetDelete(node); }
/* Terminate a star landing. */ void SNetTermStar(landing_t *land, fifo_t *fifo) { landing_star_t *lstar = LAND_SPEC(land, star); trace(__func__); if (lstar->instdesc) { SNetFifoPut(fifo, lstar->instdesc); } if (lstar->colldesc) { SNetFifoPut(fifo, lstar->colldesc); } if (lstar->instland) { SNetLandingDone(lstar->instland); } SNetLandingDone(lstar->collland); SNetFreeLanding(land); }
/* Terminate an identity landing. */ void SNetTermIdentity(landing_t *land, fifo_t *fifo) { trace(__func__); SNetFifoPut(fifo, LAND_SPEC(land, identity)->outdesc); SNetFreeLanding(land); }