pike.git / src / module.c

version» Context lines:

pike.git/src/module.c:1:   /*   || This file is part of Pike. For copyright information see COPYRIGHT.   || Pike is distributed under GPL, LGPL and MPL. See the file COPYING   || for more information. - || $Id: module.c,v 1.33 2004/12/29 14:52:25 grubba Exp $ + || $Id: module.c,v 1.34 2005/01/01 13:41:54 grubba Exp $   */      #include "global.h"   #include "module.h"   #include "pike_macros.h"   #include "pike_error.h"   #include "builtin_functions.h"   #include "main.h"   #include "svalue.h"   #include "interpret.h"
pike.git/src/module.c:321:    }    UNSETJMP(recovery);    }    if (p) free_program(end_program());    push_text("_static_modules");    push_object(low_clone(p=end_program()));    f_add_constant(2);    free_program(p);    free_string(lex.current_file);    lex = save_lex; -  -  init_main(); +    }      void exit_modules(void)   {    JMP_BUF recovery;    volatile int e;    -  exit_main(); + #ifdef DO_PIKE_CLEANUP +  size_t count;    -  +  if (exit_with_cleanup) { +  /* Destruct all remaining objects while we have a proper execution +  * environment. The downside is that the leak report below will +  * always report destructed objects. We use the gc in a special mode +  * for this to get a reasonably sane destruct order. */ +  gc_destruct_everything = 1; +  count = do_gc (NULL, 1); +  while (count) { +  size_t new_count = do_gc (NULL, 1); +  if (new_count >= count) { +  fprintf (stderr, "Some destroy function is creating new objects " +  "during final cleanup - can't exit cleanly.\n"); +  break; +  } +  count = new_count; +  } +  gc_destruct_everything = 0; +  } +  +  /* Unload dynamic modules before static ones. */ +  exit_dynamic_load(); + #endif +     for(e=NELEM(module_list)-1;e>=0;e--)    {    if(SETJMP(recovery))    call_handle_error();    else {    TRACE((stderr, "Exiting static module #%d: \"%s\"...\n",    e, module_list[e].name));    module_list[e].exit();    }    UNSETJMP(recovery);    }   }