Ilya Zakharevich on Thu, 24 Nov 2005 23:30:52 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: pari_init, RE-INIT, and programs using libpari. |
On Thu, Nov 24, 2005 at 10:11:53AM +0100, Bill Allombert wrote: > > This is what Math::Pari is using for many years now: > > > > INIT_JMP_off; > > INIT_SIG_off; > > So if we were to provide pari_init_fancy(), would you use it ? This depends. Note that Math::Pari must support older versions of GP/PARI too. BTW, I attach my attempt to make GP/PARI 2.1.7 restartable (this is a part of Math::Pari now; grep for reset_on_reload in Pari.xs); I still get segfaults at some moment if I try to reset... Hope this helps, Ilya --- ./src/language/anal.c~ Fri Sep 16 09:50:48 2005 +++ ./src/language/anal.c Sat Oct 29 08:37:28 2005 @@ -1998,6 +1998,8 @@ manage_var(long n, entree *ep) if (n) /* special behaviour */ { + int leave_vars = 1; /* x undestructible */ + switch(n) { case 2: return nvar=0; @@ -2010,10 +2012,12 @@ manage_var(long n, entree *ep) setlg(polvar, nvar); return --nvar; } + case 100: + leave_vars = 0; } /* user wants to delete one of his/her/its variables */ - if (max_avail == MAXVARN-1) return 0; /* nothing to delete */ + if (max_avail == MAXVARN-leave_vars) return 0; /* nothing to delete */ free(polx[++max_avail]); /* frees both polun and polx */ return max_avail+1; } --- ./src/language/init.c~ Fri Oct 28 17:45:22 2005 +++ ./src/language/init.c Sat Oct 29 08:55:22 2005 @@ -394,6 +394,7 @@ reset_traps(int warn) for (i=0; i <= noer; i++) err_catch_array[i] = 0; } +static need_force_init_defaults = 0; /* initialise les donnees de la bibliotheque PARI. Peut être précédée d'un * appel à pari_addfunctions si on ajoute d'autres fonctions au pool de base. */ @@ -407,7 +408,9 @@ pari_init(long parisize, long maxprime) #ifdef STACK_CHECK pari_init_stackcheck(&i); #endif - init_defaults(0); + init_defaults(need_force_init_defaults); + need_force_init_defaults = 0; + if (INIT_JMP && setjmp(environnement)) { fprintferr(" *** Error in the PARI system. End of program.\n"); @@ -503,7 +506,7 @@ freeall(void) long i; entree *ep,*ep1; - while (delete_var()) /* empty */; + while (delete_var()); /* empty all but x */; for (i = 0; i < functions_tblsz; i++) { for (ep = functions_hash[i]; ep; ep = ep1) @@ -518,17 +521,28 @@ freeall(void) members_hash[i] = NULL; } free((void*)varentries); free((void*)ordvar); free((void*)polvar); - free((void*)polx[MAXVARN]); free((void*)polx); free((void*)polun); - free((void*)primetab); - free((void*)universal_constants); + varentries = NULL; ordvar = NULL; polvar = NULL; +#if 1 + manage_var(100, (entree *)0); /* now empty x too */ +#else + free((void*)polx[MAXVARN]); + polx[MAXVARN] = NULL; +#endif + free((void*)polx); free((void*)polun); + polx = NULL; polun = NULL; + free((void*)primetab); primetab = NULL; + free((void*)universal_constants); universal_constants = NULL; /* set first cell to 0 to inhibit recursion in all cases */ while (cur_bloc) { *cur_bloc=0; killbloc(cur_bloc); } killallfiles(1); free((void *)functions_hash); + functions_hash = NULL; free((void *)bot); free((void *)diffptr); - free(current_logfile); - free(current_psfile); + bot = 0; diffptr = 0; + free(current_logfile); current_logfile = NULL; + free(current_psfile); current_psfile = NULL; + need_force_init_defaults = 1; if (gp_history_fun) gp_history_fun(0,-1,NULL,NULL);