home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / ctlmod / cm_cleanup.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-01-23  |  1.3 KB  |  73 lines

  1. # include    "ctlmod.h"
  2. # include    <signal.h>
  3. # include    <sccs.h>
  4.  
  5. SCCSID(@(#)cm_cleanup.c    8.1    12/31/84)
  6.  
  7. /*
  8. **  CM_CLEANUP -- cleanup after interrupt or error.
  9. **
  10. **    This routine does things like call the interrupt cleanup
  11. **    function, reset the input, etc.
  12. **
  13. **    Parameters:
  14. **        typ -- the type of cleanup:
  15. **            1 -- fatal error (from error [error.c]).
  16. **            2 -- keyboard interrupt.
  17. **
  18. **    Returns:
  19. **        never (uses non-local jump to ctlmod/main.c).
  20. **
  21. **    Side Effects:
  22. **        Proc_name & Cm.cm_input are reset.
  23. **
  24. **    Trace Flags:
  25. **        0
  26. */
  27.  
  28. cm_cleanup(typ)
  29. int    typ;
  30. {
  31.     register int        i;
  32.     register struct fn_def    *f;
  33.     extern char        *Proc_name;
  34.     extern jmp_buf        CmReset;
  35.     extern            rubcatch();
  36.     register ctx_t        *ctx;
  37.  
  38. # ifdef xCTR2
  39.     if (tTf(0, 13))
  40.         printf("cm_cleanup: %d\n", typ);
  41. # endif
  42.  
  43.     /*
  44.     **  Call all interrupt cleanup functions for active
  45.     **    modules.
  46.     */
  47.  
  48.     for (i = 0; i < NumFunc; i++)
  49.     {
  50.         f = FuncVect[i];
  51.         if (f->fn_active > 0)
  52.         {
  53.             Ctx.ctx_name = Proc_name = f->fn_name;
  54.             (*f->fn_cleanup)(typ);
  55.         }
  56.     }
  57.  
  58.     /* clean up memory */
  59.     for (ctx = &Ctx; ctx != NULL; ctx = ctx->ctx_link)
  60.     {
  61.         if (ctx->ctx_qt != NULL)
  62.             free(ctx->ctx_qt);
  63.         if (ctx->ctx_glob != NULL)
  64.         {
  65.             bmove(ctx->ctx_glob, ctx->ctx_fn->fn_gptr, ctx->ctx_fn->fn_gsize);
  66.             free(ctx->ctx_glob);
  67.         }
  68.     }
  69.  
  70.     /* return to top of loop */
  71.     longjmp(CmReset, typ);
  72. }
  73.