[gambit-list] Cython __cleanup() problem

David Dreisigmeyer dwdreisigmeyer at gmail.com
Wed Jan 5 12:14:24 EST 2011


This is on OS X 10.6.5 using Gambit-C 4.6.0 from the git repository.

I'm trying out the client.c example from gambit/test.  The problem is
the call to __cleanup().  If I comment that out everything works.
Here's the commands I'm using:

new-host:python daviddreisigmeyer$ rm *.o *.so server.c server_.c
server_setup.cnew-host:python daviddreisigmeyer$ gsc -link
server.scmnew-host:python daviddreisigmeyer$ gcc
-I/usr/local/Gambit-C/include/
-I/Users/daviddreisigmeyer/Programming/python -Wno-unused -O1
-fno-math-errno -fschedule-insns2 -fno-trapping-math
-fno-strict-aliasing -fwrapv -fomit-frame-pointer -fPIC -fno-common
-mieee-fp -c -o client.o  client.c
new-host:python daviddreisigmeyer$ gcc -I/usr/local/Gambit-C/include/
-I/Users/daviddreisigmeyer/Programming/python -Wno-unused -O1
-fno-math-errno -fschedule-insns2 -fno-trapping-math
-fno-strict-aliasing -fwrapv -fomit-frame-pointer -fPIC -fno-common
-mieee-fp  -c -o server.o  server.c -D___LIBRARY
new-host:python daviddreisigmeyer$ gcc -I/usr/local/Gambit-C/include/
-I/Users/daviddreisigmeyer/Programming/python -Wno-unused -O1
-fno-math-errno -fschedule-insns2 -fno-trapping-math
-fno-strict-aliasing -fwrapv -fomit-frame-pointer -fPIC -fno-common
-mieee-fp  -c -o server_.o  server_.c -D___LIBRARY
new-host:python daviddreisigmeyer$ gcc -shared
-I/usr/local/Gambit-C/include/
-I/Users/daviddreisigmeyer/Programming/python
-L/usr/local/Gambit-C/lib/ -lgambc -Wno-unused -O1 -fno-math-errno
-fschedule-insns2 -fno-trapping-math -fno-strict-aliasing -fwrapv
-fomit-frame-pointer -fno-common -mieee-fp -o libclient.so  client.o
server.o server_.o
new-host:python daviddreisigmeyer$ python server_setup.py build_ext
--inplacerunning build_ext
cythoning server_setup.pyx to server_setup.c
building 'cython_gambit_test' extension
/usr/bin/gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -pipe -O2
-DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
-I/usr/local/Gambit-C/include
-I/Users/daviddreisigmeyer/Programming/python
-I/opt/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
-c server_setup.c -o build/temp.macosx-10.6-x86_64-2.7/server_setup.o
/usr/bin/gcc-4.2 -L/opt/local/lib -bundle -undefined dynamic_lookup
-L/opt/local/lib build/temp.macosx-10.6-x86_64-2.7/server_setup.o
-L/usr/local/Gambit-C/lib
-L/Users/daviddreisigmeyer/Programming/python -lclient -lgambc -o
/Users/daviddreisigmeyer/Programming/python/cython_gambit_test.so


Then in ipython:


Python 2.7.1 (r271:86832, Dec 29 2010, 01:38:09)
Type "copyright", "credits" or "license" for more information.

IPython 0.10.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object'. ?object also works, ?? prints more.

In [2]: import cython_gambit_test

In [3]: cython_gambit_test.cython_gambit_test ()
result = #!void
result = 16
result = #<datum-parsing-exception #2>
result = #<unbound-global-exception #3>

Process Python exited abnormally with code 1



Below is the code I'm using.  Any help would be really appreciated.

Thanks!

-Dave


------------------------------------------------------


/* File: "client.c", Time-stamp: <2007-09-12 00:07:21 feeley> */

#include <stdio.h>
#include <stdlib.h>
#define ___VERSION 406000
#include "gambit.h"
#include "server.h"
#define SCHEME_LIBRARY_LINKER ____20_server__

___BEGIN_C_LINKAGE
extern ___mod_or_lnk SCHEME_LIBRARY_LINKER (___global_state_struct*);
___END_C_LINKAGE

int gambit_test ( void )
{
  char *temp;

  ___setup_params_struct setup_params;
  ___setup_params_reset (&setup_params);
  setup_params.version = ___VERSION;
  setup_params.linker  = SCHEME_LIBRARY_LINKER;
  ___setup (&setup_params);

  temp = eval_string ("(define x 4)");
  if (temp != 0)
    {
      printf ("result = %s\n", temp);
      ___release_string (temp); // don't forget to reclaim string
    }
  temp = eval_string ("(expt 2 x)");
  if (temp != 0)
    {
      printf ("result = %s\n", temp);
      ___release_string (temp);
    }
  temp = eval_string ("(+ 1 2"); // note: missing closing parenthesis
  if (temp != 0)
    {
      printf ("result = %s\n", temp);
      ___release_string (temp);
    }
  temp = eval_string ("(+ x y)"); // note: y is unbound
  if (temp != 0)
    {
      printf ("result = %s\n", temp);
      ___release_string (temp);
    }

  fflush (stdout);

  ___cleanup ();

  return 0;
}

************

/* server.h */

extern char *eval_string (char *);

************

; File: "server.scm"
; Copyright (c) 1996-2007 by Marc Feeley, All Rights Reserved.

; This is a simple server that can evaluate a string of Scheme code.

(define (catch-all-errors thunk)
  (with-exception-catcher
   (lambda (exc)
     (write-to-string exc))
   thunk))

(define (write-to-string obj)
  (with-output-to-string
    '()
    (lambda () (write obj))))

(define (read-from-string str)
  (with-input-from-string str read))

; The following "c-define" form will define the function "eval_string"
; which can be called from C just like an ordinary C function.  The
; single argument is a character string (C type "char*") and the
; result is also a character string.

(c-define (eval-string str) (char-string) char-string "eval_string" "extern"
  (catch-all-errors
    (lambda () (write-to-string (eval (read-from-string str))))))

;------------------------------------------------------------------------------

************

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules=[
    Extension("cython_gambit_test",
              ["server_setup.pyx"],
              include_dirs = ['/usr/local/Gambit-C/include' ,
"/Users/daviddreisigmeyer/Programming/python"],
              libraries = ["client" , "gambc"],
              library_dirs = ['/usr/local/Gambit-C/lib' ,
"/Users/daviddreisigmeyer/Programming/python"])
]

setup(
  name = "SERVER-setup",
  cmdclass = {"build_ext": build_ext},
  ext_modules = ext_modules
)

************

cdef extern from "server.h":
    char * eval_string ( char * )

cdef extern from "client.h":
    int gambit_test ()

def cython_gambit_test ():
    return gambit_test ()

************

/* client.h */

#include <stdio.h>
#include <stdlib.h>
#define ___VERSION 406000
#include "gambit.h"
#include "server.h"

int gambit_test ( void );



------------------------------------------------------



More information about the Gambit-list mailing list