[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>&nbsp;</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&nbsp;there is a way to get the ORB's =
reference=20
count, so</FONT><FONT size=3D2>&nbsp;I have added new code to =
"corbaOrb.cc" for=20
prevent this bug.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT size=3D2>I send&nbsp;my new source file, where you can =
see&nbsp;the new=20
code&nbsp;closed in&nbsp; "### MODIF" marks. </FONT></DIV>
<DIV><FONT size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT size=3D2>I hope that it is useful for you.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT size=3D2></FONT>&nbsp;</DIV>
<DIV>&nbsp;</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>&nbsp;</DIV>
<DIV><FONT=20
size=3D2>////////////////////////////////////////////////////////////////=
//////////////////////////////////////////</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</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 -&gt; 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>-&gt; 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--