[gambit-list] __cleanup() problem (OS X 10.6.6 / Gambit-C 4.6.0)

David Dreisigmeyer dwdreisigmeyer at gmail.com
Wed Jan 12 08:17:48 EST 2011


It could be the call to ___release_foreign (in c_intf.c) that's
causing the trouble.  The calling sequence is:

___cleanup (setup.c) =>
___cleanup_mem (mem.c) =>
free_still_objs (mem.c) =>
___release_foreign (c_intf.c)


With this (modified) snippet from free_still_objs:

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


  if (release_fn != 0)
    {
    	printf ("  >>> ___release_foreign 3a\n");
		fflush (stdout);
		
      ptr = ___CAST(void*,___FIELD(obj,___FOREIGN_PTR));
      ___FIELD(obj,___FOREIGN_RELEASE_FN) =
        ___CAST(___SCMOBJ,___CAST(___SCMOBJ (*) ___P((void *ptr),()),0));

        printf ("  >>> ___release_foreign 3b\n");
		fflush (stdout);
			
      ___FIELD(obj,___FOREIGN_PTR) =
        ___CAST(___SCMOBJ,___CAST(void*,0));

        printf ("  >>> ___release_foreign 3c\n");
		fflush (stdout);
		printf ("  >>> ___FIX(___NO_ERR) = %i\n" , ___FIX(___NO_ERR));
		fflush (stdout);
		e = release_fn (ptr);
		printf ("  >>> e = release_fn (ptr) : %i\n" , e);
		fflush (stdout);
		printf ("  >>> ((e = release_fn (ptr)) != ___FIX(___NO_ERR)) = %i\n" ,
			(e != ___FIX(___NO_ERR)));
		fflush (stdout);
		
      if (e != ___FIX(___NO_ERR))
      {
      		printf ("  >>> ___release_foreign 3d\n");
      		printf ("  >>> e = %d\n" , e);
			fflush (stdout);
			
        return e;
       }
    }
----------------------------------------------------------------------

I'll get, e.g.,  the following output to the terminal:

$ ./client
......
>   >>> ___release_foreign 3a
>   >>> ___release_foreign 3b
>   >>> ___release_foreign 3c
>   >>> ___FIX(___NO_ERR) = 0
>   >>> e = release_fn (ptr) : 0
>   >>> ((e = release_fn (ptr)) != ___FIX(___NO_ERR)) = 0
.....
>   >>> ___release_foreign 3a
>   >>> ___release_foreign 3b
>   >>> ___release_foreign 3c
>   >>> ___FIX(___NO_ERR) = 0
$

So maybe release_fn is the problem?


Commenting out the call to ___cleanup_mem in ___cleanup, the code
still fails on ___cleanup_os.  Here it seems to have something to do
with ___device_group_cleanup in os_io.c.  Now the call sequence is:

___cleanup (setup.c) =>
___cleanup_os (os.c) =>
___cleanup_io_module (os_io,c) =>
io_module_cleanup (os_io,c) =>
___device_group_cleanup (os_io.c)

Here it seems to be a problem with the line:

if (___device_cleanup (dgroup->list) != ___FIX(___NO_ERR))

Here I'll get

> ___device_group_cleanup 2
> ___device_group_cleanup 2d
>   >>> (___device_cleanup (dgroup->list) : 0
> ___FIX(___NO_ERR) : 0
> ___device_group_cleanup 2c
>   >>> (___device_cleanup (dgroup->list) != ___FIX(___NO_ERR)) = 0
> ___device_group_cleanup 2b
> ___device_group_cleanup 2

with this modified snippet in ___device_group_cleanup (os_io.c):

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

{
    printf ("___device_group_cleanup 2\n");
    fflush (stdout);

	aa = ___device_cleanup (dgroup->list);
        printf ("___device_group_cleanup 2d\n");
        fflush (stdout);
	bb = ___FIX(___NO_ERR);

	printf ("  >>> (___device_cleanup (dgroup->list) : %i\n" , aa);
	fflush(stdout);
	printf("___FIX(___NO_ERR) : %i\n",bb);
	fflush(stdout);
	printf ("___device_group_cleanup 2c\n");
    fflush (stdout);
	printf ("  >>> (___device_cleanup (dgroup->list) !=
___FIX(___NO_ERR)) = %d\n" , (aa != bb));
	fflush (stdout);
	
    if (aa != bb)
    {
      printf ("___device_group_cleanup 2a\n");
  	  fflush (stdout);
      break;
    }
    printf ("___device_group_cleanup 2b\n");
	fflush (stdout);
  }

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

So maybe  ___device_cleanup is causing a problem also?




Thanks again!

-Dave



More information about the Gambit-list mailing list