[omniORB] prevent multiple threads from shutting down ORB
Álvaro Huarte Sanz
ahuarte@tracasa.es
Wed, 15 Mar 2000 16:38:12 +0100
This is a multi-part message in MIME format.
------=_NextPart_000_009F_01BF8E9C.DA903730
Content-Type: multipart/alternative;
boundary="----=_NextPart_001_00A0_01BF8E9C.DA903730"
------=_NextPart_001_00A0_01BF8E9C.DA903730
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Hi Tom,
I have read your message and I have this problem too.
I don't kown if there is a way to get the ORB's reference count, so I =
have added new code to "corbaOrb.cc" for prevent this bug.
I send my new source file, where you can see the new code closed in =
"### MODIF" marks.=20
I hope that it is useful for you.
Alvaro Huarte Sanz
Trabajos Catastrales, S.A.
Carretera del Sadar s/n, Edificio =ABEl Sario=BB
31006 Pamplona (NAVARRA)
Tel: +34-948-24 05 50
Fax: +34-948-24 92 09
E-mail: ahuarte@tracasa.es
/////////////////////////////////////////////////////////////////////////=
/////////////////////////////////
Hi there=20
Is there a way to get the ORB's reference count?=20
I am developping a Win32 dll which uses omniORB to access a remote data=20
container. This dll works as a plugin to a piece of third party server=20
software (not CORBA-wise). It will usually initialize the orb when =
loaded,=20
and call NP_destroy() when being unloaded.=20
But sometimes, another program of mine also using omniORB will make =
calls to=20
the third party software, and will live longer than the time the dll is=20
loaded -> when the dll gets unloaded, it shuts down the process' orb, =
which=20
cuts also the other open connections over the orb.=20
So I guess the problem comes from not having access to the main thread =
of=20
the server, which is not a CORBA application. therefore, I am unable to=20
properly initialize the orb at startup and shut it down when the process =
exits.=20
-> do I have to write a wrapper dll that is never unloaded as long as =
the=20
server process lives, or is there some other way to see if the orb is =
still=20
being used by another thread in the same process?=20
Thanks, Tom=20
------=_NextPart_001_00A0_01BF8E9C.DA903730
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content=3D"text/html; charset=3Dwindows-1252" =
http-equiv=3DContent-Type>
<META content=3D"MSHTML 5.00.2314.1000" name=3DGENERATOR></HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT size=3D2>Hi Tom,</FONT></DIV>
<DIV> </DIV>
<DIV><FONT size=3D2>I have read your message and I have this problem=20
too.</FONT></DIV>
<DIV><FONT size=3D2>I don't kown if there is a way to get the ORB's =
reference=20
count, so</FONT><FONT size=3D2> I have added new code to =
"corbaOrb.cc" for=20
prevent this bug.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT size=3D2>I send my new source file, where you can =
see the new=20
code closed in "### MODIF" marks. </FONT></DIV>
<DIV><FONT size=3D2></FONT> </DIV>
<DIV><FONT size=3D2></FONT> </DIV>
<DIV><FONT size=3D2>I hope that it is useful for you.</FONT></DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV><FONT size=3D2></FONT> </DIV>
<DIV> </DIV>
<DIV><FONT size=3D2>Alvaro Huarte Sanz<BR>Trabajos Catastrales, =
S.A.<BR>Carretera=20
del Sadar s/n, Edificio =ABEl Sario=BB<BR>31006 Pamplona =
(NAVARRA)<BR>Tel:=20
+34-948-24 05 50<BR>Fax: +34-948-24 92 09<BR>E-mail: <A=20
href=3D"mailto:ahuarte@tracasa.es">ahuarte@tracasa.es</A><BR></FONT></DIV=
>
<DIV> </DIV>
<DIV><FONT=20
size=3D2>////////////////////////////////////////////////////////////////=
//////////////////////////////////////////</FONT></DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV><FONT size=3D2>
<P>Hi there <BR>
<P>Is there a way to get the ORB's reference count? <BR>
<P>I am developping a Win32 dll which uses omniORB to access a remote =
data=20
<BR>container. This dll works as a plugin to a piece of third party =
server=20
<BR>software (not CORBA-wise). It will usually initialize the orb when =
loaded,=20
<BR>and call NP_destroy() when being unloaded. <BR>
<P>But sometimes, another program of mine also using omniORB will make =
calls to=20
<BR>the third party software, and will live longer than the time the dll =
is=20
<BR>loaded -> when the dll gets unloaded, it shuts down the process' =
orb,=20
which <BR>cuts also the other open connections over the orb. <BR>
<P>So I guess the problem comes from not having access to the main =
thread of=20
<BR>the server, which is not a CORBA application. therefore, I am unable =
to=20
<BR>properly initialize the orb at startup and shut it down when the =
process=20
<BR>exits. <BR>
<P>-> do I have to write a wrapper dll that is never unloaded as long =
as the=20
<BR>server process lives, or is there some other way to see if the orb =
is still=20
<BR>being used by another thread in the same process? <BR>
<P>Thanks, Tom <BR></P></FONT></DIV></BODY></HTML>
------=_NextPart_001_00A0_01BF8E9C.DA903730--
------=_NextPart_000_009F_01BF8E9C.DA903730
Content-Type: application/octet-stream;
name="corbaOrb.cc"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="corbaOrb.cc"
// Fichero fuente "..\omniORB_280\src\lib\omniORB2\orbcore\corbaOrb.cc"
// =
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=
@@@
// ### MODIF INI - 15/03/2000.=20
/* ATENCI=D3N:=20
Se a=F1ade comprobaci=F3n de puntero a "orb" para en el caso de que =
existan=20
varios hilos de un proceso que se hayan realizado una misma conexi=F3n =
a=20
ORB (Por ejemplo diferentes clientes XDLL), no se intente destruir =
este=20
objeto m=E1s de una vez y s=F3lo cuando no existan objetos conectados =
a ORB.
Mirar correcci=F3n de c=F3digo en '### MODIF'.
=09
COMPILAR herramienta "gnuwin32".
*/
// ### MODIF FIN
// =
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=
@@@
// ...
// Declaraci=F3n de Orb.
static CORBA::ORB_ptr orb =3D 0;
// =
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=
@@@
// ### MODIF INI - 15/03/2000.=20
// Contador de llamadas a conexiones ORB en un mismo Proceso.=20
// #define __OUTPUT__
static int NumORBConnections =3D 0;
CRITICAL_SECTION NumORBConnections_critical_section;
// ### MODIF FIN
// =
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=
@@@
// ...
CORBA::ORB_ptr
CORBA::ORB_init(int &argc,char **argv,const char *orb_identifier)
{
omni_mutex_lock sync(internalLock);
if (!parse_ORB_args(argc,argv,orb_identifier)) {
throw CORBA::INITIALIZE(0,CORBA::COMPLETED_NO);
}
if (orb)
{
// =
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=
@@@
// ### MODIF INI - 15/03/2000.=20
// Inicializar Secci=F3n Cr=EDtica de Contador de llamadas a conexiones =
ORB en un=20
// mismo Proceso.=20
if (NumORBConnections =3D=3D 0)=20
InitializeCriticalSection (&NumORBConnections_critical_section);
// Incrementar el n=FAmero de conexiones ORB cargadas.
EnterCriticalSection (&NumORBConnections_critical_section);
NumORBConnections++;=20
LeaveCriticalSection (&NumORBConnections_critical_section);
#ifdef __OUTPUT__
FILE *p_filIDFile =3D fopen("C:\\Temp\\OmniORB_State.txt", "w+");
fprintf(p_filIDFile, "Conexiones Realizadas %li (REBIND)", =
NumORBConnections);
fflush (p_filIDFile);
fclose (p_filIDFile);
#endif
// ### MODIF FIN
// =
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=
@@@
return CORBA::ORB::_duplicate(orb);
}
if ((char*)omniORB::serverName =3D=3D 0) {
omniORB::serverName =3D CORBA::string_dup("unknown");
}
omniORB::seed.hi =3D omniORB::seed.med =3D 0;
try {
// Call attach method of each initialiser object.
// The order of these calls must take into account of the dependency
// amount the modules.
omni_corbaOrb_initialiser_.attach();
omni_strand_initialiser_.attach();
omni_scavenger_initialiser_.attach();
omni_ropeFactory_initialiser_.attach();
omni_objectRef_initialiser_.attach();
omni_initFile_initialiser_.attach();
omni_bootstrap_i_initialiser_.attach();
if (bootstrapAgentHostname) {
// The command-line option -ORBInitialHost has been specified.
// Override any previous NamesService object reference
// that may have been read from the configuration file.
omniInitialReferences::singleton()->set("NameService",
CORBA::Object::_nil());
omniInitialReferences::singleton()->set("InterfaceRepository",
CORBA::Object::_nil());
omniInitialReferences::singleton()
->initialise_bootstrap_agent(bootstrapAgentHostname,
bootstrapAgentPort);
}
}
catch (const CORBA::INITIALIZE &ex) {
throw;
}
catch (...) {
throw CORBA::INITIALIZE(0,CORBA::COMPLETED_NO);
}
// =
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=
@@@
// ### MODIF INI - 15/03/2000.=20
// Inicializar Secci=F3n Cr=EDtica de Contador de llamadas a conexiones =
ORB en un=20
// mismo Proceso.=20
if (NumORBConnections =3D=3D 0)=20
InitializeCriticalSection (&NumORBConnections_critical_section);
// Incrementar el n=FAmero de conexiones ORB cargadas.
EnterCriticalSection (&NumORBConnections_critical_section);
NumORBConnections++;=20
LeaveCriticalSection (&NumORBConnections_critical_section);
#ifdef __OUTPUT__
FILE *p_filIDFile =3D fopen("C:\\Temp\\OmniORB_State.txt", "w+");
fprintf(p_filIDFile, "Conexiones Realizadas %li", NumORBConnections);
fflush (p_filIDFile);
fclose (p_filIDFile);
#endif
// ### MODIF FIN
// =
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=
@@@
orb =3D new CORBA::ORB;
return orb;
}
// ...
void
CORBA::
ORB::NP_destroy()
{
// =
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=
@@@
// ### MODIF INI - 15/03/2000.=20
=09
// Decrementar el n=FAmero de conexiones ORB cargadas.
EnterCriticalSection (&NumORBConnections_critical_section);
if (NumORBConnections > 0) NumORBConnections--;=20
LeaveCriticalSection (&NumORBConnections_critical_section);
#ifdef __OUTPUT__
FILE *p_filIDFile =3D fopen("C:\\Temp\\OmniORB_State.txt", "w+");
if (orb =3D=3D 0) fprintf(p_filIDFile, "ORB =3D=3D 0\n");
else fprintf(p_filIDFile, "ORB !=3D 0\n");
fprintf(p_filIDFile, "Conexiones Restantes %li", NumORBConnections);
fflush (p_filIDFile);
fclose (p_filIDFile);
#endif
// Comprobaci=F3n de puntero a "orb" y n=FAmero de conexiones ORB =
realizadas para=20
// que se destruya una s=F3la vez la conexi=F3n y cuando no haya otros =
objetos que
// la utilicen.
if (orb =3D=3D 0 || NumORBConnections > 0) return;
// Destruir Secci=F3n Cr=EDtica de Contador de llamadas a conexiones =
ORB en un=20
// mismo Proceso.=20
DeleteCriticalSection (&NumORBConnections_critical_section);
try
{
// assert(this =3D=3D orb);
// ### MODIF FIN
// =
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=
@@@
omni_mutex_lock sync(internalLock);
// Call detach method of the initialisers in reverse order.
omni_bootstrap_i_initialiser_.detach();
omni_initFile_initialiser_.detach();
omni_objectRef_initialiser_.detach();
omni_ropeFactory_initialiser_.detach();
omni_scavenger_initialiser_.detach();
omni_strand_initialiser_.detach();
omni_corbaOrb_initialiser_.detach();
delete orb;
orb =3D 0;
// =
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=
@@@
// ### MODIF INI - 15/03/2000.=20
}
catch(...){}
// ### MODIF FIN
// =
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=
@@@
}
------=_NextPart_000_009F_01BF8E9C.DA903730--