Ilya Zakharevich on Sat, 11 May 2002 00:18:15 -0400 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: DYNAMIC_PLOTTING with gnuplot made easy |
On Mon, May 06, 2002 at 08:00:46PM -0400, Ilya Zakharevich wrote: > On Sat, May 04, 2002 at 02:11:08PM -0400, Ilya Zakharevich wrote: > > On Sat, May 04, 2002 at 05:21:09AM -0400, Ilya Zakharevich wrote: > > > This patch improves support of DYNAMIC_PLOTTING with gnuplot: now it > > Testing this on Solaris, I get > > *** Can't load Gnuplot drawing engine from '/home/ilya/.cpan/build/Term-Gnuplot-0.5703/blib/arch/auto/Term/Gnuplot/Gnuplot.so': ld.so.1: ./gp-sta: fatal: relocation error: file /home/ilya/.cpan/build/Term-Gnuplot-0.5703/blib/arch/auto/Term/Gnuplot/Gnuplot.so: symbol PL_markstack_ptr: referenced symbol not found. The reasons are multiple: a) On Solaris, RTDL_LAZY is not applicable to data, only to functions; b) gp-dyn is statically linked (?!), so the symbols from it are not visible from the loaded DLLs. The following patch contains a workaround for this, as well as a chunk improving the stability when the builtin-X11 plotting is used in the same process as the gnuplot plotting. Due to some interaction (bugs in the PARI signal handling?) when one uses builtin-X11 plotting together with gnuplot plotting, in some situation one ends with a process emitting endless "Bug in PARI, please report" messages. So do not do it until things clear out. Ilya diff -pru pari/src/graph/plotgnuplot.c pari-gnuplot-x/src/graph/plotgnuplot.c --- pari/src/graph/plotgnuplot.c Fri May 10 23:41:17 2002 +++ pari-gnuplot-x/src/graph/plotgnuplot.c Fri May 10 17:14:06 2002 @@ -255,18 +255,27 @@ term_set(char *s) #ifdef BOTH_GNUPLOT_AND_X11 if (is_builtin) { - if (!strcmp(s,"builtin")) - return X11_term_set(s); + if (!strcmp(s,"builtin")) { + if (!getenv("DISPLAY")) + goto complain; + return X11_term_set(s); + } is_builtin = 0; - PARI_get_plot(1); + /* The following line may switch on Gnuplot's X11 term first: */ + /* PARI_get_plot(1); */ } else if (!strcmp(s,"builtin")) { - is_builtin = 1; - if (!X11_init) { - if (!getenv("DISPLAY")) +/* if (!X11_init) {*/ + if (!getenv("DISPLAY")) { + complain: croak("The builtin-X11 plotting requires DISPLAY environment variable set"); + } + /* Restore the safe state by switching to a do-little terminal */ + if (pari_plot.init && strcmp(pari_plot.name, "dumb")) + term_set("dumb"); + is_builtin = 1; X11_PARI_get_plot(1); X11_init = 1; - } +/* }*/ return X11_term_set(s); } #endif /* defined BOTH_GNUPLOT_AND_X11 */ diff -pru pari/src/language/init.c pari-gnuplot-x/src/language/init.c --- pari/src/language/init.c Thu May 2 14:30:46 2002 +++ pari-gnuplot-x/src/language/init.c Fri May 10 17:13:51 2002 @@ -65,6 +65,14 @@ pariout_t DFLT_OUTPUT = { 'g', 0, -1, 1, extern void initout(int initerr); extern int term_width(void); +#ifdef BOTH_GNUPLOT_AND_X11 +/* Satisfy DLL dependencies: dummy only */ +#define EXTERM_DLL_DPES *PL_markstack_ptr, PL_stack_max, *PL_Sv, *PL_stack_sp, \ + *PL_tmps_floor, *PL_tmps_ix, *PL_markstack_max, *PL_stack_base, PL_na, *PL_sv_yes, *PL_sv_no +extern int EXTERM_DLL_DPES; +int EXTERM_DLL_DPES; +#endif /* defined BOTH_GNUPLOT_AND_X11 */ + typedef struct cell { void *env; void *data;