ORBit2 Segfault - was Re: [PATCH] bad ...
- From: Greg Edwards <greg nas-inet com>
- To: Michael Meeks <michael ximian com>
- Cc: orbit-list gnome org
- Subject: ORBit2 Segfault - was Re: [PATCH] bad ...
- Date: Fri, 04 Apr 2003 10:33:32 -0600
Michael Meeks wrote:
>>With ORBit2 I must be missing something. When I build a test
>>client/server (echo clone) pair with ORBit everything is fine. I then
>>make changes to the compile/link process to get it to build with ORBit2.
>> When I run it seg faults and dies, both client and server sides. It's
>>somewhere inside of CORBA_ORB_init().
>
>
> That sounds horrendous; can you post your code, and a stack trace I
> imagine something daft is being done - given that all of Gnome 2.2 is
> using ORBit2-2.4.1 :-)
>
> There are some changes to the CORBA spec from ORBit-0.5 to ORBit2,
> which may be affecting you but ... let's see the code.
>
> Regards,
>
> Michael.
>
Attached are the makefile, server, client, and idl source files. The
orbtrace file is from an "strace -o orbtrace orb_echo_server" run, the
client segfaults at the same trace point.
Manual operations to switch versions.
In the makefile, uncomment/comment macros near top.
In the .c files, change include <orb/...> to <orbit/...> depending on build.
After running "make newskel", add the line "g_message("[server] %s",
input);" to impl_Echo_echoString() in orb_echo-skelimpl.c.
There's an I'm here scaffold in the server source blocked by "DEBUG"
comments.
TIA,
--
Greg Edwards
New Age Software, Inc. - http://www.nas-inet.com
======================================================
Galactic Outlaw - http://goutlaw.nas-inet.com
The ultimate cyberspace adventure!
makefile
interface Echo
{
void echoString(in string input);
};
/*
* MyFirstOrbit program. Client. Hacked by Ewan Birney
* birney@sanger.ac.uk from echo test suite.
*
*/
#include <stdio.h>
#include <orbit/orbit.h>
/*
* This header file was generated from the idl
*/
#include "orb_echo.h"
/*
* This is our Echo Object
*/
Echo echo_client;
int
main (int argc, char *argv[])
{
CORBA_Environment ev;
CORBA_ORB orb;
FILE * ifp;
char * ior;
char filebuffer[1024];
/*
* Standard initalisation of the orb. Notice that
* ORB_init 'eats' stuff off the command line
*/
CORBA_exception_init(&ev);
orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);
/*
* Get the IOR (object reference). It should be written out
* by the echo-server into the file echo.ior. So - if you
* are running the server in the same place as the client,
* this should be fine!
*/
ifp = fopen("echo.ior","r");
if( ifp == NULL ) {
g_error("No echo.ior file!");
exit(-1);
}
fgets(filebuffer,1023,ifp);
ior = g_strdup(filebuffer);
fclose(ifp);
/*
* Actually get the object. So easy!
*/
echo_client = CORBA_ORB_string_to_object(orb, ior, &ev);
if (!echo_client) {
printf("Cannot bind to %s\n", ior);
return 1;
}
/*
* Ok. Now we use the echo object...
*/
printf("Type messages to the server\n. as the only thing on the line stops\n");
while( fgets(filebuffer,1024,stdin) ) {
if( filebuffer[0] == '.' && filebuffer[1] == '\n' )
break;
/* chop the newline off */
filebuffer[strlen(filebuffer)-1] = '\0';
/* using the echoString method in the Echo object */
/* this is defined in the echo.h header, compiled from echo.idl */
Echo_echoString(echo_client,filebuffer,&ev);
/* catch any exceptions (eg, network is down) */
if(ev._major != CORBA_NO_EXCEPTION) {
printf("we got exception %d from echoString!\n", ev._major);
return 1;
}
}
/* Clean up */
CORBA_Object_release(echo_client, &ev);
CORBA_Object_release((CORBA_Object)orb, &ev);
return 0;
}
/*
* MyFirstOrbit program - server. Hacked
* from Echo test suite by birney@sanger.ac.uk
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <orbit/orbit.h>
#include "orb_echo.h"
#include "orb_echo-skelimpl.c"
/* This is so we can get out a valid IOR later... */
Echo echo_client = CORBA_OBJECT_NIL;
/*
* extern void impl_Echo_echoString(PortableServer_Servant *,CORBA_char *,CORBA_Environment *);
*/
/*
static void
do_echoString(PortableServer_Servant servant,
CORBA_char *astring,
CORBA_Environment *ev);
*/
/*
* I have **no** idea what this bit does
*/
PortableServer_ServantBase__epv base_epv = {
NULL,
NULL,
NULL
};
/* POA_Echo__epv echo_epv = { NULL, (void *)&do_echoString }; */
POA_Echo__epv echo_epv = { NULL, (void *)&impl_Echo_echoString };
POA_Echo__vepv poa_echo_vepv = { &base_epv, &echo_epv };
POA_Echo poa_echo_servant = { NULL, &poa_echo_vepv };
int
main (int argc, char *argv[])
{
PortableServer_ObjectId objid = {0, sizeof("myEchoString"), "myEchoString"};
PortableServer_POA poa;
CORBA_Environment ev;
char *retval;
CORBA_ORB orb;
FILE * ofp;
signal(SIGINT, exit);
signal(SIGTERM, exit);
/* DEBUG */
printf("this prints\n");
/* DEBUG */
CORBA_exception_init(&ev);
/* DEBUG */
printf("this prints\n");
/* DEBUG */
orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);
/* DEBUG */
printf("this does not\n");
/* DEBUG */
POA_Echo__init(&poa_echo_servant, &ev);
poa = (PortableServer_POA)CORBA_ORB_resolve_initial_references(orb, "RootPOA", &ev);
PortableServer_POAManager_activate(PortableServer_POA__get_the_POAManager(poa, &ev), &ev);
PortableServer_POA_activate_object_with_id(poa,
&objid, &poa_echo_servant, &ev);
echo_client = PortableServer_POA_servant_to_reference(poa,
&poa_echo_servant,
&ev);
if (!echo_client) {
printf("Cannot get objref\n");
return 1;
}
retval = CORBA_ORB_object_to_string(orb, echo_client, &ev);
ofp = fopen("echo.ior","w");
fprintf(ofp,"%s", retval);
fclose(ofp);
CORBA_free(retval);
fprintf(stdout,"Written the file echo.ior with the IOR of this server.\n Now waiting for requests...\n");
fflush(stdout);
CORBA_ORB_run(orb, &ev);
return 0;
}
/*
static void
do_echoString(PortableServer_Servant servant,
CORBA_char *astring,
CORBA_Environment *ev)
{
g_message("[server] %s", astring);
return;
}
*/
orbtrace
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]