From: Lui F. <fun...@gm...> - 2007-12-19 03:44:55
|
On 12/17/07, Sam Steingold <sd...@gn...> wrote: > > > I quickly browse through the various modules that comes with clisp, > > for instance, the queens example show you how to export a c function > > for lisp to call. But is it possible to call lisp from c within the > > module? > > sure, just use funcall(). > see, e.g., modules/syscalls/calls.c and search for funcall. Thanks for the pointers. I did get a bit further now but hit another wall. I have the following in my module set static int dummy_function(int x, int y) { pushSTACK(fixnum(x)); pushSTACK(fixnum(y)); funcall(`USER::LISP-CALLBACK`,2); return 0; } and this lisp function in the user package: (defun LISP-CALLBACK (x y) (loop repeat 20 do (format *standard-output* "~A ~A ~%" x y)) (force-output *standard-output*)) When I tried the callback from C->Lisp, the lisp code seems to execute fine but then after it's done I get a seg fault. 1 2 1 2 1 2 ... *** - handle_fault error2 ! address = 0xc0000020 not in [0x67f473c0,0x68096000) ! SIGSEGV cannot be cured. Fault address = 0xc0000020. Permanently allocated: 92512 bytes. Currently in use: 19097536 bytes. Free space: 1547816 bytes. Segmentation fault 8.768u 11.436s 0:55.39 36.4% 0+0k 0+0io 0pf+0w 1 2 1 2 1 2 ... *** - handle_fault error8 ! protection = 3 SIGSEGV cannot be cured. Fault address = 0x20866d90. Permanently allocated: 92512 bytes. Currently in use: 18617992 bytes. Free space: 2028752 bytes. Segmentation fault Going back to the clisp manual it mentions that if your C code tries to manupulate lisp code, you need to be aware of GC. But in this case, it's the other way around and I'm passing x,y by values. I may have overlooked something very basic but reading calls.c I don't see much special treatment in the C code that calls lisp (using funcall). Any ideas? TIA fungsin |
From: Sam S. <sd...@gn...> - 2007-12-19 04:01:17
|
> * Lui Fungsin <shatfva.yhv@tznvy.pbz> [2007-12-18 19:44:53 -0800]: > > On 12/17/07, Sam Steingold <sd...@gn...> wrote: >> >> > I quickly browse through the various modules that comes with clisp, >> > for instance, the queens example show you how to export a c function >> > for lisp to call. But is it possible to call lisp from c within the >> > module? >> >> sure, just use funcall(). >> see, e.g., modules/syscalls/calls.c and search for funcall. > > Thanks for the pointers. I did get a bit further now but hit another wall. > > I have the following in my module set > > static int dummy_function(int x, int y) > { > pushSTACK(fixnum(x)); > pushSTACK(fixnum(y)); > funcall(`USER::LISP-CALLBACK`,2); > return 0; > } > > and this lisp function in the user package: > > (defun LISP-CALLBACK (x y) > (loop repeat 20 do > (format *standard-output* "~A ~A ~%" x y)) > (force-output *standard-output*)) > > When I tried the callback from C->Lisp, the lisp code seems to execute > fine but then after it's done I get a seg fault. this is obviously not _all_ your code. how do you call dummy_function? are you trying to embed CLISP in a C program? this does not work yes, see http://sourceforge.net/tracker/index.php?func=detail&aid=423264&group_id=1355&atid=351355 and links therefrom. -- Sam Steingold (http://sds.podval.org/) on Fedora release 8 (Werewolf) http://jihadwatch.org http://palestinefacts.org http://dhimmi.com http://honestreporting.com http://pmw.org.il http://openvotingconsortium.org The difference between genius and stupidity is that genius has its limits. |
From: Lui F. <fun...@gm...> - 2007-12-19 07:08:31
|
On 12/18/07, Sam Steingold <sd...@gn...> wrote: > this is obviously not _all_ your code. > how do you call dummy_function? > are you trying to embed CLISP in a C program? > this does not work yes, see > http://sourceforge.net/tracker/index.php?func=detail&aid=423264&group_id=1355&atid=351355 > and links therefrom. Sorry, I should have prepared a complete demo. Basically I'm trying to run the fileman example that comes with gnu readline, but using clisp as callbacks. I built clisp-2.43 on linux i386 without readline (to avoid calling readline multiple times) % ./configure --without-readline % (cd src; make; make install) % clisp modprep.fas fileman.c # create fileman.m.c % clisp-link create-module-set fileman-module fileman.m.c % clisp-link add-module-set fileman-module /usr/local/lib/clisp-2.43/base base+fileman % ./base+fileman/lisp.run -M base+fileman/lispinit.mem [1]> (RL-INITIALIZE) [2]> (RL-READLINE "fileman >") fileman >sho(press <tab>) buf sho point 4 end 4 *** - Lisp stack overflow. RESET *** - handle_fault error2 ! address = 0x58f618b not in [0x20891004,0x209f056c) ! SIGSEGV cannot be cured. Fault address = 0x58f618b. Permanently allocated: 92224 bytes. Currently in use: 2467080 bytes. Free space: 304840 bytes. Segmentation fault I suppose this is not considered embedding clisp within a c program, right? TIA, --fungsin /* fileman.c */ #include <fcntl.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <strings.h> #include <stdlib.h> #include <readline/readline.h> #include <readline/history.h> #include "clisp.h" DEFMODULE(fileman,"USER") static int dummy_function(int point, int ch) { printf("\nbuf %s point %d end %d\n", rl_line_buffer, rl_point, rl_end); pushSTACK(fixnum(point)); pushSTACK(fixnum(ch)); funcall(`USER::LISPCALLBACK`,2); return 0; } DEFUN(USER::RL-INITIALIZE,) { begin_call(); rl_initialize(); rl_bind_key('\t', dummy_function); /* tab to trigger c callback which then call lisp */ rl_bind_key('?', dummy_function); /* ? */ end_call(); VALUES0; } DEFUN(USER::RL-READLINE, prompt) { char *line = 0; STACK_0 = check_string(STACK_0); with_string_0(STACK_0,GLO(misc_encoding),prompt, { begin_system_call(); line = readline(prompt); end_system_call(); }); if (line) { VALUES1(asciz_to_string(line,GLO(misc_encoding))); add_history (line); free(line); } else { VALUES1(NIL); } skipSTACK(1); } DEFUN(USER::RL-LINE-BUFFER,) { VALUES1(asciz_to_string(rl_line_buffer,GLO(misc_encoding))); } DEFUN(USER::RL-POINT,) { VALUES1(uint_to_I(rl_point)); } DEFUN(USER::RL-END,) { VALUES1(uint_to_I(rl_end)); } ;; fileman-test.lisp ;; (in-package :USER) (defun LISPCALLBACK (point ch) (format *standard-output* "Current line <~A> point <~A> end <~A>" (RL-LINE-BUFFER) (RL-POINT) (RL-END))) # link.sh # file_list='' mod_list='' if test -r fileman.m.c; then file_list="$file_list"' fileman.m.o' mod_list="$mod_list"' fileman' fi make clisp-module CC="${CC}" CPPFLAGS="${CPPFLAGS}" CFLAGS="${CFLAGS}" INCLUDES="$absolute_linkkitdir" NEW_FILES="$file_list" NEW_LIBS="$file_list -lreadline" NEW_MODULES="$mod_list" TO_LOAD='fileman-test.fas' |
From: Sam S. <sd...@gn...> - 2007-12-19 15:16:44
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Lui Fungsin wrote: > On 12/18/07, Sam Steingold <sd...@gn...> wrote: >> this is obviously not _all_ your code. >> how do you call dummy_function? >> are you trying to embed CLISP in a C program? >> this does not work yes, see >> http://sourceforge.net/tracker/index.php?func=detail&aid=423264&group_id=1355&atid=351355 >> and links therefrom. > > Sorry, I should have prepared a complete demo. Basically I'm trying to > run the fileman example that comes with gnu readline, but using clisp > as callbacks. > > I built clisp-2.43 on linux i386 without readline (to avoid calling > readline multiple times) > > % ./configure --without-readline > % (cd src; make; make install) > % clisp modprep.fas fileman.c # create fileman.m.c > % clisp-link create-module-set fileman-module fileman.m.c > % clisp-link add-module-set fileman-module > /usr/local/lib/clisp-2.43/base base+fileman > % ./base+fileman/lisp.run -M base+fileman/lispinit.mem > > [1]> (RL-INITIALIZE) > > [2]> (RL-READLINE "fileman >") > fileman >sho(press <tab>) > buf sho point 4 end 4 > > *** - Lisp stack overflow. RESET > > *** - handle_fault error2 ! address = 0x58f618b not in [0x20891004,0x209f056c) ! > SIGSEGV cannot be cured. Fault address = 0x58f618b. > Permanently allocated: 92224 bytes. > Currently in use: 2467080 bytes. > Free space: 304840 bytes. > Segmentation fault > > > I suppose this is not considered embedding clisp within a c program, right? no. I don't see anything wrong with your code right away. could you please put the whole module (including the Makefile) on the web for me to try out? thanks -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFHaTXUPp1Qsf2qnMcRAsaHAKCvHbmKQc+ST5NWiiQZWXgcxAD41ACfXBls /coTTRfcvN2aWCTvEzxlvow= =z5oF -----END PGP SIGNATURE----- |
From: Lui F. <fun...@gm...> - 2007-12-19 19:11:56
|
Hi Sam, On 12/19/07, Sam Steingold <sd...@gn...> wrote: > I don't see anything wrong with your code right away. > could you please put the whole module (including the Makefile) on the > web for me to try out? http://fungsin.lui.googlepages.com/filemandemo.tar.gz Notice that I have no problem with rl_bind_key() if I use dynamic FFI callback (on i386). But since for the moment I can't get ffcall built on mipsn32/64, I need to use custom linkset. Thanks for your help. I really appreciate your taking the time to diagnose the problem. -- fungsin |
From: Sam S. <sd...@gn...> - 2007-12-19 21:50:15
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi Lui, Lui Fungsin wrote: > > On 12/19/07, Sam Steingold <sd...@gn...> wrote: >> I don't see anything wrong with your code right away. >> could you please put the whole module (including the Makefile) on the >> web for me to try out? > > http://fungsin.lui.googlepages.com/filemandemo.tar.gz > > Notice that I have no problem with rl_bind_key() if I use dynamic FFI > callback (on i386). But since for the moment I can't get ffcall built > on mipsn32/64, I need to use custom linkset. I do not observe the problem with a CLISP build which includes readline. I suspect that either your readline startup code is wrong, or your readline installation is broken. > Thanks for your help. I really appreciate your taking the time to > diagnose the problem. welcome... -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFHaZILPp1Qsf2qnMcRAjqzAJsGrYplOsPYRDShJEeY6fnUIbIy0wCgqpTg b0XIJYtWGMCrEVon6OHOyEA= =qi7v -----END PGP SIGNATURE----- |
From: Lui F. <fun...@gm...> - 2007-12-19 22:58:08
|
Hi Sam, On 12/19/07, Sam Steingold <sd...@gn...> wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Sam Steingold wrote: > > I do not observe the problem with a CLISP build which includes readline. > > I suspect that either your readline startup code is wrong, or your > > readline installation is broken. > > no problems without built-in readline either: You're right. After I download readline 5.2 and build it from source, I don't see that problem either. I did try it on two different machines yesterday, one is running fedora 4 and another running fedora 6. I just use the readline (5.0) that comes with fedora. It crashed on both machines (clisp 2.43 built from source in both cases) [4]> (rl-readline "abc>") abc> asf buf asf point 4 end 4 Current line < asf> point <4> end <4> *** - handle_fault error2 ! address = 0x0 not in [0x20254004,0x203b3564) ! SIGSEGV cannot be cured. Fault address = 0x0. Permanently allocated: 92224 bytes. Currently in use: 2726152 bytes. Free space: 50136 bytes. Segmentation fault I tried to run clisp under gdb as I believe the readline 5 that comes with fedora should be ok because there are so many packages that depend on it and they are running fine. I'm not sure if this is the right way to start clisp under gdb but it crashes on startup before I can try out the readline code. % gdb ./base+fileman/lisp.run GNU gdb Red Hat Linux (6.3.0.0-1.84rh) Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1". (gdb) run -M base+fileman/lispinit.mem Starting program: base+fileman/lisp.run -M base+fileman/lispinit.mem Reading symbols from shared object read from target memory...done. Loaded system supplied DSO at 0xffffe000 Program received signal SIGSEGV, Segmentation fault. 0x0809d532 in closed_buffered (stream=0x203b241e) at stream.d:7984 7984 BufferedStream_channel(stream) = NIL; # Handle becomes invalid (gdb) quit The program is running. Exit anyway? (y or n) y Anyway, at least now I can run clisp + readline 5.2 without problem (and I verified it on the mipsn32 platform), this should get me going. I hope I won't hit another obstacle soon. Regards, fungsin PS: I have made some headways with the avcall port to mipsn32/64. The minitest on integers are passing on mipsn32 now, but structs are still not probably passed / returned in all cases. I had been reading a lot of MIPS literature the past few days and kind of understand what the problem is. It's just that learning and modifying the ffcall code base is not that straightward for me. I have a lot of repects for all the clisp hackers. Thanks! |
From: Sam S. <sd...@gn...> - 2007-12-19 23:02:02
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Lui Fungsin wrote: > > Program received signal SIGSEGV, Segmentation fault. > 0x0809d532 in closed_buffered (stream=0x203b241e) at stream.d:7984 > 7984 BufferedStream_channel(stream) = NIL; # Handle becomes invalid search for #ifdef GENERATIONAL_GC in src/.gdbinit > PS: I have made some headways with the avcall port to mipsn32/64. The > minitest on integers are passing on mipsn32 now, but structs are still > not probably passed / returned in all cases. cool! -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFHaaLdPp1Qsf2qnMcRApMaAKCXKz8Mxdo0F3oz8CX0s0It341quQCfTp70 TIVOwygxnARNBecZqtXoOoA= =MSrb -----END PGP SIGNATURE----- |
From: Sam S. <sd...@gn...> - 2007-12-19 22:18:20
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Sam Steingold wrote: > Lui Fungsin wrote: >> On 12/19/07, Sam Steingold <sd...@gn...> wrote: >>> I don't see anything wrong with your code right away. >>> could you please put the whole module (including the Makefile) on the >>> web for me to try out? >> http://fungsin.lui.googlepages.com/filemandemo.tar.gz > >> Notice that I have no problem with rl_bind_key() if I use dynamic FFI >> callback (on i386). But since for the moment I can't get ffcall built >> on mipsn32/64, I need to use custom linkset. > > I do not observe the problem with a CLISP build which includes readline. > I suspect that either your readline startup code is wrong, or your > readline installation is broken. no problems without built-in readline either: $ ./clisp -q -norc -K full [1]> (start-fileman) fileman >sfg buf sfg point 3 end 3 Current line <sfg> ch [63] point <3>[1] end <3>weee fileman >erth fileman >erth buf erth point 4 end 4 Current line <erth> ch [9] point <4>[1] end <4> buf erth point 4 end 4 Current line <erth> ch [9] point <4>[1] end <4>wer buf erthwer point 7 end 7 Current line <erthwer> ch [9] point <7>[1] end <7>wtg buf erthwerwtg point 10 end 10 Current line <erthwerwtg> ch [9] point <10>[1] end <10>etr buf erthwerwtgetr point 13 end 13 Current line <erthwerwtgetr> ch [9] point <13>[1] end <13>5t2 fileman > buf point 0 end 0 Current line <> ch [9] point <0>[1] end <0> buf point 0 end 0 Current line <> ch [9] point <0>[1] end <0> buf point 0 end 0 Current line <> ch [9] point <0>[1] end <0> buf point 0 end 0 Current line <> ch [9] point <0>[1] end <0> buf point 0 end 0 Current line <> ch [9] point <0>[1] end <0> buf point 0 end 0 Current line <> ch [9] point <0>[1] end <0> buf point 0 end 0 Current line <> ch [9] point <0>[1] end <0> please build with debug and see what happens under gdb -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFHaZiePp1Qsf2qnMcRAvCkAJ9cGt6/V0135vPghqhNiFz8/a5+UwCfde30 8eaS6ndKxP/jHKs0F4HVJR0= =1pz4 -----END PGP SIGNATURE----- |