Re: Callback from C to Eiffel

Berend de Boer <[email protected]>
Newsgroups gmane.comp.lang.eiffel.gobo.devel
Message-ID <[email protected]>
>>>>> "Emmanuel" == Emmanuel Stapf [ES] <[email protected]> writes:

    Emmanuel> The easiest way for doing this kind of callback is to
    Emmanuel> store the eiffel routine address by doing:

Hi Emmanuel,

I finally had the time to test this, but I get a segment violation. I
used Eric's example which I included below. Here's my result:

 # ./project 

 project: system execution failed.
 Following is the set of recorded exceptions:

 -------------------------------------------------------------------------------
 Class / Object      Routine                Nature of exception           Effect
 -------------------------------------------------------------------------------
 FOO                 foo_c                  Segmentation fault:          
 <00000000B79BC03C>                         Operating system signal.      Fail
 -------------------------------------------------------------------------------
 FOO                 foo_c                                               
 <00000000B79BC03C>                         Routine failure.              Fail
 -------------------------------------------------------------------------------
 FOO                 make @3                                             
 <00000000B79BC03C>                         Routine failure.              Fail
 -------------------------------------------------------------------------------
 FOO                 root's creation                                     
 <00000000B79BC03C>                         Routine failure.              Exit
 -------------------------------------------------------------------------------


When I add debug statements it appears the $Current simply is not
correct when going back from C to Eiffel. Inside Eiffel when doing
things like:

			print ("Current: " + ($Current).out + "%N")

It is different from what it should be. I can print that when in
finalized mode as the executable doesn't dump then (but doesn't have the
correct Current of course). The output of print(i) is correct though. On
more complex examples where I need Current to be valid it simply doesn't
work.

Here is the output for a finalized system:

 Current: 0xB79D403C
 Current: 0xB7222298
 1FOO [0xB79D403C]
   me: STRING_8 [0xB79D423C]


Could you please have a look?

You obviously need to change the path in the .ecf file. Here's how I
compiled the object file:

  cc -c -I/usr/local/Eiffel61/studio/spec/linux-x86/include -o foo_c.o foo_c.c

Finally my estudio version is 6.1.7.1477.


Haven't tried this code with gec yet, first need Eiffel Studio to work
as I need a real gc for a big project.


=========================foo.e=========================
class FOO

create

	make

feature

	make is
		do
			c_set_address ($f)
			c_set_object ($Current)
			print ("Current: " + ($Current).out + "%N")
			me := "hello world"
			foo_c
		end

	c_set_address (p: POINTER) is
		external
			"C inline use <foo_c.h>"
		alias
			"signal_callback = $p;"
		end

	c_set_object (a: POINTER) is
		external
			"C inline use <foo_c.h>"
		alias
			"signal_object = eif_protect($a);"
		end

	f (i: INTEGER) is
		do
			print ("Current: " + ($Current).out + "%N")
			print (i)
			print (me)
		end

	me: STRING

	foo_c is
		external
			"C"
		end

end
==================================================


=========================foo_c.h=========================
//#include "ge_eiffel.h"
//#include "ge_gc.h"
#include <eif_portable.h>
#include <eif_hector.h>
#include <eif_macros.h>

extern EIF_REFERENCE signal_object;
extern void (*signal_callback)(EIF_REFERENCE, EIF_INTEGER_32);
extern void foo_c(Void);
==================================================


=========================foo_c.c=========================
#include "foo_c.h"

EIF_REFERENCE signal_object;
void (*signal_callback)(EIF_REFERENCE, EIF_INTEGER_32);

void foo_c()
{
	(signal_callback) (eif_adopt(signal_object), 1);
}
==================================================


=========================project.ecf=========================
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-3-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-3-0 http://www.eiffel.com/developers/xml/configuration-1-3-0.xsd" name="project" uuid="D9168F8A-7E13-4E12-92A4-EC3FDCE24B6E">
	<target name="project">
		<root class="FOO" feature="make"/>
		<option warning="true">
			<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
		</option>
		<external_include location="/home/berend/src/test/eiffel_signal_callback/"/>
		<external_object location="/home/berend/src/test/eiffel_signal_callback/foo_c.o"/>
		<precompile name="base_pre" location="$ISE_PRECOMP\base.ecf"/>
		<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
		<cluster name="project" location=".\" recursive="true">
			<file_rule>
				<exclude>/EIFGENs$</exclude>
				<exclude>/.svn$</exclude>
				<exclude>/CVS$</exclude>
			</file_rule>
		</cluster>
	</target>
	<target name="project_dotnet" extends="project">
		<setting name="msil_generation" value="true"/>
	</target>
</system>
==================================================


-- 
Live long and prosper,

Berend de Boer

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

_______________________________________________
gobo-eiffel-develop mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gobo-eiffel-develop
smime.p7s (application/x-pkcs7-signature, 1.1 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.