summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorseibel_r <seibel_r@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-06-23 17:44:25 +0000
committerseibel_r <seibel_r@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-06-23 17:44:25 +0000
commit2d1efbf998bc5f43f34b9821a19ea440694395bb (patch)
treef7d7d383738372346a70d107bf4efa105a9f3280
parent6b234b1478ad31c1056c82cf2cb4f3d87904566c (diff)
downloadATCD-2d1efbf998bc5f43f34b9821a19ea440694395bb.tar.gz
Mon Jun 23 12:38:54 2003 Rich Seibel <seibel_r@ociweb.com>
-rw-r--r--TAO/ChangeLog47
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNaming.bor3
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNaming.dsp8
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNaming.mpc18
-rw-r--r--TAO/orbsvcs/orbsvcs/Makefile.CosNaming3
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp363
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.h70
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.cpp89
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Naming_Utils.cpp135
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Naming_Utils.h18
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable.h92
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable.inl81
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.cpp1043
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.h118
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.cpp118
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.h83
-rw-r--r--TAO/orbsvcs/tests/Makefile3
-rw-r--r--TAO/orbsvcs/tests/Makefile.am1
-rw-r--r--TAO/orbsvcs/tests/Makefile.bor1
-rw-r--r--TAO/orbsvcs/tests/Redundant_Naming/Makefile998
-rw-r--r--TAO/orbsvcs/tests/Redundant_Naming/README89
-rw-r--r--TAO/orbsvcs/tests/Redundant_Naming/Redundant_Naming.dsw29
-rw-r--r--TAO/orbsvcs/tests/Redundant_Naming/Redundant_Naming.mpc4
-rw-r--r--TAO/orbsvcs/tests/Redundant_Naming/client.cpp540
-rw-r--r--TAO/orbsvcs/tests/Redundant_Naming/client.dsp238
-rw-r--r--TAO/orbsvcs/tests/Redundant_Naming/makefile.bor38
-rwxr-xr-xTAO/orbsvcs/tests/Redundant_Naming/run_test.pl99
-rw-r--r--TAO/orbsvcs/tests/Redundant_Naming/test_object.idl11
-rwxr-xr-xTAO/orbsvcs/tests/Simple_Naming/run_test.pl21
-rwxr-xr-xTAO/orbsvcs/tests/Simple_Naming/run_test_ffp.pl131
-rw-r--r--TAO/orbsvcs/tests/tests.dsw12
31 files changed, 3634 insertions, 870 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog
index 27a966fd7c4..1a100fb77fc 100644
--- a/TAO/ChangeLog
+++ b/TAO/ChangeLog
@@ -7,6 +7,53 @@ Mon Jun 23 12:37:48 2003 Chad Elliott <elliott_c@ociweb.com>
would also happen if a 'list' command was issued and there were
more than 10 servers registerd with the ImR.
+Mon Jun 23 12:38:54 2003 Rich Seibel <seibel_r@ociweb.com>
+
+ * orbsvcs/orbsvcs/Naming/Hash_Naming_Context.cpp:
+ Buzilla bug #1499 fix applied.
+
+ * orbsvcs/orbsvcs/Makefile.CosNaming:
+ * orbsvcs/orbsvcs/CosNaming.mpc:
+ * orbsvcs/orbsvcs/CosNaming.bor:
+ * orbsvcs/orbsvcs/CosNaming.dsp:
+ * orbsvcs/orbsvcs/CosNaming_Static.dsp:
+ * orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp:
+ * orbsvcs/orbsvcs/Naming/Flat_File_Persistence.h:
+ * orbsvcs/orbsvcs/Naming/Naming_Utils.cpp:
+ * orbsvcs/orbsvcs/Naming/Naming_Utils.h:
+ * orbsvcs/orbsvcs/Naming/Storable.h:
+ * orbsvcs/orbsvcs/Naming/Storable.inl:
+ * orbsvcs/orbsvcs/Naming/Storable_Naming_Context.cpp:
+ * orbsvcs/orbsvcs/Naming/Storable_Naming_Context.h:
+ * orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.cpp:
+ * orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.h:
+ Inserted the redundant name service code. Plus, bug 1499
+ fix applied to Storable_Naming_Context.cpp.
+
+ * orbsvcs/tests/Redundant_Naming:
+ * orbsvcs/tests/Redundant_Naming/README:
+ * orbsvcs/tests/Redundant_Naming/Makefile:
+ * orbsvcs/tests/Redundant_Naming/client.cpp:
+ * orbsvcs/tests/Redundant_Naming/test_object.idl:
+ * orbsvcs/tests/Redundant_Naming/run_test.pl:
+ * orbsvcs/tests/Redundant_Naming/Redundant_Naming.mpc:
+ * orbsvcs/tests/Redundant_Naming/Redundant_Naming.dsw:
+ * orbsvcs/tests/Redundant_Naming/client.dsp:
+ * orbsvcs/tests/Redundant_Naming/makefile.bor:
+ * orbsvcs/tests/Makefile:
+ * orbsvcs/tests/Makefile.am:
+ * orbsvcs/tests/Makefile.bor:
+ * orbsvcs/tests/tests.dsw:
+ added test for redundant name service
+
+ * orbsvcs/tests/Simple_Naming/run_test.pl:
+ * orbsvcs/tests/Simple_Naming/run_test_ffp.pl:
+ Moved the flat file persistance test to a separate run test
+ so that it could be disabled on MIN CORBA. The Redundant
+ Naming Service is build on the same code base as Flat File
+ and uses a Servant Activator which is not available in
+ minimum CORBA.
+
Sun Jun 22 13:58:08 UTC 2003 Don Hinton <dhinton@dresystems.com>
* tests/CodeSets/libs/IBM1047_ISO8859/Char_IBM1047_ISO8859_Translator.cpp:
diff --git a/TAO/orbsvcs/orbsvcs/CosNaming.bor b/TAO/orbsvcs/orbsvcs/CosNaming.bor
index e4ede96f9a4..06d914defd0 100644
--- a/TAO/orbsvcs/orbsvcs/CosNaming.bor
+++ b/TAO/orbsvcs/orbsvcs/CosNaming.bor
@@ -27,7 +27,8 @@ OBJFILES = \
$(OBJDIR)\Flat_File_Persistence.obj \
$(OBJDIR)\Naming_Service_Container.obj \
$(OBJDIR)\Storable.obj \
- $(OBJDIR)\Storable_Naming_Context.obj
+ $(OBJDIR)\Storable_Naming_Context.obj \
+ $(OBJDIR)\Storable_Naming_Context_Activator.obj
RESOURCE = $(OBJDIR)\CosNaming.res
diff --git a/TAO/orbsvcs/orbsvcs/CosNaming.dsp b/TAO/orbsvcs/orbsvcs/CosNaming.dsp
index 8d7e2c4431e..5abfbe91fb6 100644
--- a/TAO/orbsvcs/orbsvcs/CosNaming.dsp
+++ b/TAO/orbsvcs/orbsvcs/CosNaming.dsp
@@ -216,6 +216,10 @@ SOURCE=.\Naming\Storable_Naming_Context.cpp
# End Source File
# Begin Source File
+SOURCE=.\Naming\Storable_Naming_Context_Activator.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\Naming\Transient_Naming_Context.cpp
# End Source File
# End Group
@@ -284,6 +288,10 @@ SOURCE=.\Naming\Storable_Naming_Context.h
# End Source File
# Begin Source File
+SOURCE=.\Naming\Storable_Naming_Context_Activator.h
+# End Source File
+# Begin Source File
+
SOURCE=.\Naming\Transient_Naming_Context.h
# End Source File
# End Group
diff --git a/TAO/orbsvcs/orbsvcs/CosNaming.mpc b/TAO/orbsvcs/orbsvcs/CosNaming.mpc
index 967de0866c1..8ff4a0f63f1 100644
--- a/TAO/orbsvcs/orbsvcs/CosNaming.mpc
+++ b/TAO/orbsvcs/orbsvcs/CosNaming.mpc
@@ -2,10 +2,12 @@ project(CosNaming) : orbsvcslib, core {
depends += Svc_Utils IORTable PortableServer
sharedname = TAO_CosNaming
libs += TAO_Svc_Utils TAO_IORTable TAO_PortableServer TAO
- idlflags += -Wb,pre_include=ace/pre.h -Wb,post_include=ace/post.h -Wb,export_macro=TAO_Naming_Export -Wb,export_include=Naming/naming_export.h
+ idlflags += -Wb,pch_include=CosNaming_pch.h -Wb,pre_include=ace/pre.h -Wb,post_include=ace/post.h -Wb,export_macro=TAO_Naming_Export -Wb,export_include=Naming/naming_export.h
dllflags = TAO_NAMING_BUILD_DLL
tagchecks = Naming
include_dir = orbsvcs
+ // Add this include path for precompiled headers
+ includes += $(TAO_ROOT)/orbsvcs/orbsvcs
IDL_Files {
CosNaming.idl
@@ -15,7 +17,19 @@ project(CosNaming) : orbsvcslib, core {
Naming {
CosNamingC.cpp
CosNamingS.cpp
- Naming
+ Naming/Entries.cpp
+ Naming/Flat_File_Persistence.cpp
+ Naming/Hash_Naming_Context.cpp
+ Naming/Naming_Context_Interface.cpp
+ Naming/Naming_Loader.cpp
+ Naming/Naming_Utils.cpp
+ Naming/Persistent_Context_Index.cpp
+ Naming/Persistent_Entries.cpp
+ Naming/Persistent_Naming_Context.cpp
+ Naming/Storable.cpp
+ Naming/Storable_Naming_Context.cpp
+ Naming/Storable_Naming_Context_Activator.cpp
+ Naming/Transient_Naming_Context.cpp
}
}
}
diff --git a/TAO/orbsvcs/orbsvcs/Makefile.CosNaming b/TAO/orbsvcs/orbsvcs/Makefile.CosNaming
index c54788a4240..2eb35ad05ec 100644
--- a/TAO/orbsvcs/orbsvcs/Makefile.CosNaming
+++ b/TAO/orbsvcs/orbsvcs/Makefile.CosNaming
@@ -47,6 +47,7 @@ CPP_SRCS += \
Naming/Naming_Loader \
Naming/Storable \
Naming/Storable_Naming_Context \
+ Naming/Storable_Naming_Context_Activator \
Naming/Naming_Service_Container \
Naming/Flat_File_Persistence
@@ -69,7 +70,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
#----------------------------------------------------------------------------
LDFLAGS += -L$(TAO_ROOT)/tao -L$(TAO_ROOT)/orbsvcs/orbsvcs
-CPPFLAGS += -I$(TAO_ROOT) -I$(TAO_ROOT)/orbsvcs
+CPPFLAGS += -I$(TAO_ROOT) -I$(TAO_ROOT)/orbsvcs -I$(TAO_ROOT)/orbsvcs/orbsvcs
ifeq ($(shared_libs),1)
ifneq ($(SHLIB),)
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp b/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp
index a67364773cc..15854db92bd 100644
--- a/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp
+++ b/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp
@@ -5,251 +5,270 @@
//-----------------------------------------------------------------------------
#include "Flat_File_Persistence.h"
-TAO_NS_FlatFileWriter::TAO_NS_FlatFileWriter ()
- : fout_ (0)
+TAO_NS_FlatFileStream::TAO_NS_FlatFileStream (const ACE_CString & file,
+ const char * mode)
+ : fl_ (0)
{
+ ACE_TRACE("TAO_NS_FlatFileStream");
+ file_ = file;
+ mode_ = mode;
}
-int
-TAO_NS_FlatFileWriter::open(const char * filename)
+TAO_NS_FlatFileStream::~TAO_NS_FlatFileStream ()
{
+ ACE_TRACE("~TAO_NS_FlatFileStream");
+ if ( fl_ != 0 )
+ this->close();
+}
- this->fout_ = ACE_OS::fopen(ACE_TEXT_CHAR_TO_TCHAR(filename), ACE_LIB_TEXT("w"));
- if (this->fout_ == 0)
- ACE_ERROR_RETURN ((LM_ERROR,
- "Cannot open output file for writing %s",
- filename),
- 1);
+void
+TAO_NS_FlatFileStream::remove ()
+{
+ ACE_TRACE("remove");
+ ACE_OS::unlink(file_.c_str());
+}
- delete_bindings_ = 0;
- filename_ = filename;
+int
+TAO_NS_FlatFileStream::exists ()
+{
+ ACE_TRACE("exists");
+ // We could check the mode for this file, but for now just check exists
+ return ! ACE_OS::access(file_.c_str(), F_OK);
+}
+int
+TAO_NS_FlatFileStream::open()
+{
+ ACE_TRACE("open");
+ // For now, three flags exist "r", "w", and "c"
+ int flags = 0;
+ const char *fdmode = 0;
+ if( strchr(mode_.c_str(), 'r') )
+ if( strchr(mode_.c_str(), 'w') )
+ flags = O_RDWR, fdmode = "r+";
+ else
+ flags = O_RDONLY, fdmode = "r";
+ else
+ flags = O_WRONLY, fdmode = "w";
+ if( strchr(mode_.c_str(), 'c') )
+ flags |= O_CREAT;
+#ifndef ACE_WIN32
+ if( ACE_OS::flock_init (&filelock_, flags, file_.c_str(), 0666) != 0 )
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot open file %s for mode %s: (%d) %s\n",
+ file_.c_str(), mode_.c_str(),
+ errno, ACE_OS::strerror(errno)),
+ -1);
+#else
+ if( (filelock_.handle_= ACE_OS::open (file_.c_str(), flags, 0)) == ACE_INVALID_HANDLE )
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot open file %s for mode %s: (%d) %s\n",
+ file_.c_str(), mode_.c_str(),
+ errno, ACE_OS::strerror(errno)),
+ -1);
+#endif
+ this->fl_ = ACE_OS::fdopen(filelock_.handle_, fdmode);
+ if (this->fl_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot fdopen file %s for mode %s: (%d) %s\n",
+ file_.c_str(), mode_.c_str(),
+ errno, ACE_OS::strerror(errno)),
+ -1);
return 0;
}
-TAO_NS_FlatFileWriter::~TAO_NS_FlatFileWriter ()
+int
+TAO_NS_FlatFileStream::close()
{
+ ACE_TRACE("close");
+ ACE_OS::fflush(fl_);
+#ifndef ACE_WIN32
+ ACE_OS::flock_destroy (&filelock_, 0);
+#else
+ ACE_OS::fclose (fl_);
+#endif
+ fl_ = 0;
+ return 0;
}
int
-TAO_NS_FlatFileWriter::close()
+TAO_NS_FlatFileStream::flock (int whence, int start, int len)
{
- ACE_OS::fclose(this->fout_);
-
- if (delete_bindings_)
-#if defined (ACE_HAS_WINCE)
- ::DeleteFile(ACE_TEXT_CHAR_TO_TCHAR(filename_.c_str()));
+ ACE_TRACE("flock");
+#if defined (ACE_WIN32)
+ ACE_UNUSED_ARG (whence);
+ ACE_UNUSED_ARG (start);
+ ACE_UNUSED_ARG (len);
#else
- remove (filename_.c_str());
-#endif // ACE_HAS_WINCE
+ if( ACE_OS::strcmp(mode_.c_str(), "r") == 0 )
+ ACE_OS::flock_rdlock(&filelock_, whence, start, len);
+ else
+ ACE_OS::flock_wrlock(&filelock_, whence, start, len);
+#endif
return 0;
}
-TAO_Writer_Base &
-TAO_NS_FlatFileWriter::operator <<(
- const TAO_NS_Persistence_Header &header)
+int
+TAO_NS_FlatFileStream::funlock (int whence, int start, int len)
{
- unsigned int size = header.size();
- ACE_CString context_name = header.context_name();
-
- if (this->fout_ != 0)
- {
- ACE_OS::fprintf(this->fout_, "%u\n%s\n%d\n",
- ACE_static_cast(unsigned int, context_name.length()),
- context_name.c_str(),
- size);
- ACE_OS::fflush(this->fout_);
- }
-
- return *this;
+ ACE_TRACE("funlock");
+#if defined (ACE_WIN32)
+ ACE_UNUSED_ARG (whence);
+ ACE_UNUSED_ARG (start);
+ ACE_UNUSED_ARG (len);
+#else
+ ACE_OS::flock_unlock(&filelock_, whence, start, len);
+#endif
+ return 0;
}
-TAO_Writer_Base &
-TAO_NS_FlatFileWriter::operator <<(
- const TAO_NS_Persistence_Record &record)
+time_t
+TAO_NS_FlatFileStream::last_changed(void)
{
- if (this->fout_ != 0)
- {
- TAO_NS_Persistence_Record::Record_Type type = record.type();
-
- ACE_OS::fprintf(this->fout_, "%d\n", type);
-
- ACE_CString id = record.id();
-
- ACE_OS::fprintf(this->fout_, "%u\n%s\n",
- ACE_static_cast (unsigned int, id.length()),
- id.c_str ());
-
- ACE_CString kind = record.kind();
- ACE_OS::fprintf(this->fout_, "%u\n%s\n",
- ACE_static_cast(unsigned int, kind.length()),
- kind.c_str());
-
- ACE_CString ior = record.ior();
-
- ACE_OS::fprintf(this->fout_, "%u\n%s\n",
- ACE_static_cast(unsigned int, ior.length()),
- ior.c_str());
-
- ACE_CString context_binding = record.context_binding();
-
- ACE_OS::fprintf(this->fout_, "%u\n%s\n",
- ACE_static_cast(unsigned int, context_binding.length()),
- context_binding.c_str());
-
- ACE_OS::fflush(this->fout_);
- }
-
- return *this;
+ ACE_TRACE("last_changed");
+ ACE_stat st;
+ ACE_OS::fstat(filelock_.handle_, &st);
+ return st.st_mtime;
}
-
-
-//******************** Flat File Reader ****************************
-
-
-TAO_NS_FlatFileReader::TAO_NS_FlatFileReader ()
- : fin_ (0)
+TAO_Storable_Base &
+TAO_NS_FlatFileStream::operator <<(
+ const TAO_NS_Persistence_Header &header)
{
+ ACE_TRACE("<<header");
+ ACE_OS::rewind(this->fl_);
+ ACE_OS::fprintf(this->fl_, "%d\n%d\n", header.size(), header.destroyed());
+ ACE_OS::fflush(this->fl_);
+
+ return *this;
}
-int
-TAO_NS_FlatFileReader::open(const char * filename)
+TAO_Storable_Base &
+TAO_NS_FlatFileStream::operator >>(
+ TAO_NS_Persistence_Header &header)
{
- fin_ = ACE_OS::fopen(ACE_TEXT_CHAR_TO_TCHAR(filename), ACE_LIB_TEXT("r"));
+ ACE_TRACE(">>header");
+ unsigned int size;
+ int destroyed;
- ACE_DECLARE_NEW_CORBA_ENV;
- if (fin_ == 0)
- ACE_ERROR_RETURN ((LM_ERROR,
- ""),
- 1);
+ ACE_OS::rewind(this->fl_);
+ fscanf(fl_, "%d\n", &size);
+ header.size(size);
- return 0;
-}
+ fscanf(fl_, "%d\n", &destroyed);
+ header.destroyed(destroyed);
-TAO_NS_FlatFileReader::~TAO_NS_FlatFileReader ()
-{
+ return *this;
}
-int
-TAO_NS_FlatFileReader::close()
+TAO_Storable_Base &
+TAO_NS_FlatFileStream::operator <<(
+ const TAO_NS_Persistence_Record &record)
{
- ACE_OS::fclose(fin_);
- return 0;
-}
-
+ ACE_TRACE("<<record");
+ TAO_NS_Persistence_Record::Record_Type type = record.type();
+ ACE_OS::fprintf(this->fl_, "%d\n", type);
-TAO_Reader_Base &
-TAO_NS_FlatFileReader::operator >>(
- TAO_NS_Persistence_Header &header)
-{
- unsigned int size;
- int bufSize = 0;
+ ACE_CString id = record.id();
+ ACE_OS::fprintf(this->fl_, "%d\n%s\n", id.length(), id.c_str());
- fscanf(fin_, "%d\n", &bufSize);
- ACE_TCHAR* context_name = new ACE_TCHAR[bufSize+1];
- //char* context_name = 0;
- //ACE_NEW_RETURN(context_name, char[bufSize+1], 0);
- ACE_OS::fgets(context_name, bufSize+1, fin_);
- fscanf(fin_, "%u\n", &size);
+ ACE_CString kind = record.kind();
+ ACE_OS::fprintf(this->fl_, "%d\n%s\n", kind.length(), kind.c_str());
- ACE_CString new_cn = ACE_CString(ACE_TEXT_ALWAYS_CHAR(context_name));
- header.context_name(new_cn);
- delete context_name;
+ ACE_CString ref = record.ref();
+ ACE_OS::fprintf(this->fl_, "%d\n%s\n", ref.length(), ref.c_str());
- header.size(size);
+ ACE_OS::fflush(this->fl_);
return *this;
-
}
-TAO_Reader_Base &
-TAO_NS_FlatFileReader::operator >>(
+TAO_Storable_Base &
+TAO_NS_FlatFileStream::operator >>(
TAO_NS_Persistence_Record &record)
{
- int type_integer = 0;
- fscanf(fin_, "%d\n", &type_integer);
- TAO_NS_Persistence_Record::Record_Type type =
- ACE_static_cast (TAO_NS_Persistence_Record::Record_Type, type_integer);
-
+ ACE_TRACE(">>record");
+ TAO_NS_Persistence_Record::Record_Type type;
+ int temp_type_in;
+ fscanf(fl_, "%d\n", &temp_type_in);
+ type = (TAO_NS_Persistence_Record::Record_Type) temp_type_in;
record.type(type);
int bufSize = 0;
//id
- fscanf(fin_, "%d\n", &bufSize);
- ACE_TCHAR *id = new ACE_TCHAR[bufSize+1];
+ fscanf(fl_, "%d\n", &bufSize);
+ char *id = new char[bufSize+1];
//char *id;
//ACE_NEW_RETURN (id, char[bufSize+1], 1);
-
- ACE_OS::fgets(id, bufSize+1, fin_);
- ACE_CString newId(ACE_TEXT_ALWAYS_CHAR(id));
+ ACE_OS::fgets(id, bufSize+1, fl_);
+ ACE_CString newId(id);
record.id(newId);
-
- delete id;
+ delete [] id;
//kind
- fscanf(fin_, "%d\n", &bufSize);
- ACE_TCHAR *kind = new ACE_TCHAR[bufSize+1];
+ fscanf(fl_, "%d\n", &bufSize);
+ char *kind = new char[bufSize+1];
//char *kind;
//ACE_NEW (kind, char[bufSize+1]);
-
- ACE_OS::fgets(kind, bufSize+1, fin_);
+ ACE_OS::fgets(kind, bufSize+1, fl_);
kind[bufSize] = '\0';
-
- ACE_CString newKind(ACE_TEXT_ALWAYS_CHAR(kind));
+ ACE_CString newKind(kind);
record.kind(newKind);
+ delete [] kind;
+
+ //ref
+ fscanf(fl_, "%d\n", &bufSize);
+ char *ref = new char[bufSize+1];
+ //char *ref;
+ //ACE_NEW(ref, char[bufSize+1]);
+ ACE_OS::fgets(ref, bufSize+1, fl_);
+ ACE_CString newRef(ref);
+ record.ref(newRef);
+ delete [] ref;
- delete kind;
-
- //ior
- fscanf(fin_, "%d\n", &bufSize);
- ACE_TCHAR *ior = new ACE_TCHAR[bufSize+1];
- //char *ior;
- //ACE_NEW(ior, char[bufSize+1]);
-
- ACE_OS::fgets(ior, bufSize+1, fin_);
- ACE_CString newIor(ACE_TEXT_ALWAYS_CHAR(ior));
- record.ior(newIor);
-
- delete ior;
-
- //context_binding
- fscanf(fin_, "%d\n", &bufSize);
- ACE_TCHAR *context_binding = new ACE_TCHAR[bufSize+1];
- //char *context_binding;
- //ACE_NEW (context_binding, char[bufSize+1]);
-
- ACE_OS::fgets(context_binding, bufSize+1, fin_);
-
- ACE_CString new_cb(ACE_TEXT_ALWAYS_CHAR(context_binding));
+ return *this;
- record.context_binding(new_cb);
+}
- delete context_binding;
+TAO_Storable_Base &
+TAO_NS_FlatFileStream::operator <<(
+ const TAO_NS_Persistence_Global &global)
+{
+ ACE_TRACE("<<global");
+ ACE_OS::rewind(this->fl_);
+ ACE_OS::fprintf(this->fl_, "%d\n", global.counter());
+ ACE_OS::fflush(this->fl_);
return *this;
-
}
-TAO_Reader_Base *TAO_NS_FlatFileFactory::create_reader()
+TAO_Storable_Base &
+TAO_NS_FlatFileStream::operator >>(
+ TAO_NS_Persistence_Global &global)
{
- TAO_Reader_Base *reader = 0;
+ ACE_TRACE(">>global");
+ unsigned int counter = 0;
- ACE_NEW_RETURN (reader,
- TAO_NS_FlatFileReader(),
- 0);
+ ACE_OS::rewind(this->fl_);
+ fscanf(fl_, "%d\n", &counter);
+ global.counter(counter);
+
+ return *this;
- return reader;
}
-TAO_Writer_Base *TAO_NS_FlatFileFactory::create_writer()
+
+TAO_Storable_Base *TAO_NS_FlatFileFactory::create_stream(
+ const ACE_CString & file,
+ const char * mode)
{
- TAO_Writer_Base *writer = 0;
+ ACE_TRACE("create_stream");
+ TAO_Storable_Base *stream = 0;
- ACE_NEW_RETURN (writer,
- TAO_NS_FlatFileWriter(),
+ ACE_NEW_RETURN (stream,
+ TAO_NS_FlatFileStream(file, mode),
0);
- return writer;
+ return stream;
}
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.h b/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.h
index 2aaab3451db..45afd34ffac 100644
--- a/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.h
+++ b/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.h
@@ -18,49 +18,73 @@
//------------------------------------------------------------------------
// The Flat File concrete classes
//------------------------------------------------------------------------
-class TAO_NS_FlatFileWriter : public TAO_Writer_Base
+class TAO_NS_FlatFileStream : public TAO_Storable_Base
{
public:
- TAO_NS_FlatFileWriter();
- virtual ~TAO_NS_FlatFileWriter();
+ TAO_NS_FlatFileStream(const ACE_CString & file, const char * mode);
+ virtual ~TAO_NS_FlatFileStream();
- virtual int open(const char * filename);
+ /// Remove a file by name (file is not open)
+ virtual void remove();
+
+ /// Check if a file exists on disk (file is not open)
+ virtual int exists();
+
+ /// Open a file (the remaining methods below all require an open file)
+ virtual int open();
+
+ /// Close an open file
virtual int close();
- virtual TAO_Writer_Base& operator << (const TAO_NS_Persistence_Header &header);
- virtual TAO_Writer_Base& operator << (const TAO_NS_Persistence_Record &record);
+ /// Acquire a file lock
+ virtual int flock (int whence, int start, int len);
-private:
- FILE* fout_;
- ACE_CString filename_;
-};
+ /// Release a file lock
+ virtual int funlock (int whence, int start, int len);
-class TAO_NS_FlatFileReader : public TAO_Reader_Base
-{
-public:
+ /// Returns the last time an open file was changed
+ virtual time_t last_changed(void);
- TAO_NS_FlatFileReader ();
- virtual ~TAO_NS_FlatFileReader();
+ /// Write a header to disk
+ virtual TAO_Storable_Base& operator << (
+ const TAO_NS_Persistence_Header& header);
- virtual int open(const char * filename);
- virtual int close();
+ /// Read a header from disk
+ virtual TAO_Storable_Base& operator >> (
+ TAO_NS_Persistence_Header& header);
+
+ /// Write a record to disk
+ virtual TAO_Storable_Base& operator << (
+ const TAO_NS_Persistence_Record& record);
- virtual TAO_Reader_Base& operator >> (TAO_NS_Persistence_Header &header);
- virtual TAO_Reader_Base& operator >> (TAO_NS_Persistence_Record &record);
+ /// Read a record from disk
+ virtual TAO_Storable_Base& operator >> (
+ TAO_NS_Persistence_Record& record);
+
+ /// Write the global data to disk
+ virtual TAO_Storable_Base& operator << (
+ const TAO_NS_Persistence_Global& global);
+
+ /// Read the global data from disk
+ virtual TAO_Storable_Base& operator >> (
+ TAO_NS_Persistence_Global& global);
private:
- FILE* fin_;
+ ACE_OS::ace_flock_t filelock_;
+ FILE* fl_;
+ ACE_CString file_;
+ ACE_CString mode_;
};
-
class TAO_NS_FlatFileFactory : public TAO_Naming_Service_Persistence_Factory
{
public:
// Factory Methods
- virtual TAO_Reader_Base *create_reader();
- virtual TAO_Writer_Base *create_writer();
+ /// Create the stream that can operate on a disk file
+ virtual TAO_Storable_Base *create_stream(const ACE_CString & file,
+ const ACE_TCHAR * mode);
};
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.cpp b/TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.cpp
index 15af452cae3..5dc2ffbecc6 100644
--- a/TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.cpp
+++ b/TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.cpp
@@ -493,46 +493,71 @@ TAO_Hash_Naming_Context::bind_new_context (const CosNaming::Name& n
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
CosNaming::NamingContext::_nil ());
- // Stores our new Naming Context.
- CosNaming::NamingContext_var result =
- CosNaming::NamingContext::_nil ();
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
- // Create new context.
- result = new_context (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
+ CosNaming::NamingContext::_nil ());
- // Bind the new context to the name.
- ACE_TRY
+ // If we received compound name, resolve it to get the context in
+ // which the binding should take place, then perform the operation on
+ // target context.
+ if (name_len > 1)
{
- bind_context (n,
- result.in ()
- ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ return context->bind_new_context (simple_name ACE_ENV_ARG_PARAMETER);
}
- ACE_CATCHANY
- {
- // If the bind() operation fails we must destroy the recently
- // created context, should any exceptions be raised by the
- // destroy() operation we want to ignore them.
+ // If we received a simple name, we need to bind it in this context.
+ else
+ {
+ // Stores our new Naming Context.
+ CosNaming::NamingContext_var result =
+ CosNaming::NamingContext::_nil ();
+
+ // Create new context.
+ result = new_context (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Bind the new context to the name.
+ ACE_TRY
{
- ACE_DECLARE_NEW_CORBA_ENV;
- ACE_TRY_EX(DESTROY)
- {
- result->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_TRY_CHECK_EX(DESTROY);
- }
- ACE_CATCHANY
+ bind_context (n,
+ result.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // If the bind() operation fails we must destroy the recently
+ // created context, should any exceptions be raised by the
+ // destroy() operation we want to ignore them.
{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY_EX(DESTROY)
+ {
+ result->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(DESTROY);
+ }
+ ACE_CATCHANY
+ {
+ }
+ ACE_ENDTRY;
}
- ACE_ENDTRY;
+ // Re-raise the exception in bind_context()
+ ACE_RE_THROW;
}
- // Re-raise the exception in bind_context()
- ACE_RE_THROW;
- }
- ACE_ENDTRY;
- ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
-
- return result._retn ();
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ return result._retn ();
+ }
}
void
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Naming_Utils.cpp b/TAO/orbsvcs/orbsvcs/Naming/Naming_Utils.cpp
index 6c3c569e6b5..613eefb399e 100644
--- a/TAO/orbsvcs/orbsvcs/Naming/Naming_Utils.cpp
+++ b/TAO/orbsvcs/orbsvcs/Naming/Naming_Utils.cpp
@@ -4,6 +4,7 @@
#include "Transient_Naming_Context.h"
#include "Persistent_Context_Index.h"
#include "Storable_Naming_Context.h"
+#include "Storable_Naming_Context_Activator.h"
#include "Flat_File_Persistence.h"
#include "orbsvcs/CosNamingC.h"
@@ -32,7 +33,9 @@ TAO_Naming_Server::TAO_Naming_Server (void)
persistence_file_name_ (0),
base_address_ (TAO_NAMING_BASE_ADDR),
multicast_ (0),
- use_storable_context_ (0)
+ use_storable_context_ (0),
+ use_servant_activator_ (0),
+ use_redundancy_(0)
{
}
@@ -55,7 +58,9 @@ TAO_Naming_Server::TAO_Naming_Server (CORBA::ORB_ptr orb,
persistence_file_name_ (0),
base_address_ (TAO_NAMING_BASE_ADDR),
multicast_ (0),
- use_storable_context_ (0)
+ use_storable_context_ (use_storable_context),
+ use_servant_activator_ (0),
+ use_redundancy_(0)
{
if (this->init (orb,
poa,
@@ -143,7 +148,7 @@ int
TAO_Naming_Server::parse_args (int argc,
ACE_TCHAR *argv[])
{
- ACE_Get_Opt get_opts (argc, argv, ACE_LIB_TEXT("b:do:p:s:f:m:u:"));
+ ACE_Get_Opt get_opts (argc, argv, ACE_LIB_TEXT("b:do:p:s:f:m:u:r:"));
int c;
int size, result;
@@ -157,6 +162,11 @@ TAO_Naming_Server::parse_args (int argc,
long int address;
#endif /* ACE_SIZEOF_VOID_P */
+ // Make sure only one persistence option is specified
+ int f_opt_used = 0;
+ int u_opt_used = 0;
+ int r_opt_used = 0;
+
while ((c = get_opts ()) != -1)
switch (c)
{
@@ -166,18 +176,15 @@ TAO_Naming_Server::parse_args (int argc,
case 'o': // outputs the naming service ior to a file.
this->ior_output_file_ =
ACE_OS::fopen (get_opts.opt_arg (), ACE_LIB_TEXT("w"));
-
+
if (this->ior_output_file_ == 0)
ACE_ERROR_RETURN ((LM_ERROR,
- ACE_LIB_TEXT("Unable to open %s for writing: %p\n"),
- get_opts.opt_arg ()), -1);
+ ACE_LIB_TEXT("Unable to open %s for writing:(%u) %p\n"),
+ get_opts.opt_arg(), errno, ACE_LIB_TEXT("TAO_Naming_Server::parse_args()")), -1);
break;
case 'p':
this->pid_file_name_ = get_opts.opt_arg ();
break;
- case 'f':
- this->persistence_file_name_ = get_opts.opt_arg ();
- break;
case 's':
size = ACE_OS::atoi (get_opts.opt_arg ());
if (size >= 0)
@@ -200,9 +207,20 @@ TAO_Naming_Server::parse_args (int argc,
case 'm':
this->multicast_ = ACE_OS::atoi(get_opts.opt_arg ());
break;
+ case 'f':
+ this->persistence_file_name_ = get_opts.opt_arg ();
+ f_opt_used = 1;
+ break;
+ case 'r':
+ this->use_redundancy_ = 1;
+ this->use_storable_context_ = 1;
+ this->persistence_file_name_ = get_opts.opt_arg ();
+ r_opt_used = 1;
+ break;
case 'u':
this->use_storable_context_ = 1;
this->persistence_file_name_ = get_opts.opt_arg ();
+ u_opt_used = 1;
break;
case '?':
default:
@@ -211,15 +229,23 @@ TAO_Naming_Server::parse_args (int argc,
ACE_LIB_TEXT ("-d ")
ACE_LIB_TEXT ("-o <ior_output_file> ")
ACE_LIB_TEXT ("-p <pid_file_name> ")
- ACE_LIB_TEXT ("-f <persistence_file_name> ")
ACE_LIB_TEXT ("-s <context_size> ")
ACE_LIB_TEXT ("-b <base_address> ")
ACE_LIB_TEXT ("-m <1=enable multicast, 0=disable multicast(default) ")
+ ACE_LIB_TEXT ("-f <persistence_file_name> ")
ACE_LIB_TEXT ("-u <storable_persistence_directory (not used with -f)> ")
+ ACE_LIB_TEXT ("-r <redundant_persistence_directory> ")
ACE_LIB_TEXT ("\n"),
argv [0]),
-1);
}
+
+ if (f_opt_used + u_opt_used + r_opt_used > 1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_LIB_TEXT ("Only one persistence option can be passed")
+ ACE_LIB_TEXT ("\n")),
+ -1);
+
return 0;
}
@@ -248,6 +274,14 @@ TAO_Naming_Server::init_with_orb (int argc,
-1);
}
+ // Check the non-ORB arguments. this needs to come before we
+ // initialize my_naming_server so that we can pass on some of
+ // the command-line arguments.
+ result = this->parse_args (argc, argv);
+
+ if (result < 0)
+ return result;
+
// Get the POA object.
this->root_poa_ = PortableServer::POA::_narrow (poa_object.in ()
ACE_ENV_ARG_PARAMETER);
@@ -261,8 +295,20 @@ TAO_Naming_Server::init_with_orb (int argc,
poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
- CORBA::PolicyList policies (2);
- policies.length (2);
+ int numPolicies = 2;
+#if (TAO_HAS_MINIMUM_POA == 0)
+ if (this->use_storable_context_)
+ {
+ this->use_servant_activator_ = 1;
+ }
+
+ if (this->use_servant_activator_) {
+ numPolicies += 2;
+ }
+#endif /* TAO_HAS_MINIMUM_POA */
+
+ CORBA::PolicyList policies (numPolicies);
+ policies.length (numPolicies);
// Id Assignment policy
policies[0] =
@@ -276,6 +322,21 @@ TAO_Naming_Server::init_with_orb (int argc,
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
+#if (TAO_HAS_MINIMUM_POA == 0)
+ if (this->use_servant_activator_)
+ {
+ // Request Processing Policy
+ policies[2] =
+ this->root_poa_->create_request_processing_policy (PortableServer::USE_SERVANT_MANAGER
+ ACE_ENV_ARG_PARAMETER);
+
+ // Servant Retention Policy
+ policies[3] =
+ this->root_poa_->create_servant_retention_policy (PortableServer::RETAIN
+ ACE_ENV_ARG_PARAMETER);
+ }
+#endif /* TAO_HAS_MINIMUM_POA */
+
// We use a different POA, otherwise the user would have to change
// the object key each time it invokes the server.
this->ns_poa_ = this->root_poa_->create_POA ("NameService",
@@ -296,14 +357,6 @@ TAO_Naming_Server::init_with_orb (int argc,
ACE_TRY_CHECK;
}
- // Check the non-ORB arguments. this needs to come before we
- // initialize my_naming_server so that we can pass on some of
- // the command-line arguments.
- result = this->parse_args (argc, argv);
-
- if (result < 0)
- return result;
-
result = this->init (orb,
this->ns_poa_.in (),
this->context_size_,
@@ -371,19 +424,41 @@ TAO_Naming_Server::init_new_naming (CORBA::ORB_ptr orb,
// Was a location specified?
if (persistence_location == 0)
{
- // No, assign the default location "."
- persistence_location = ACE_LIB_TEXT(".");
+ // No, assign the default location "NameService"
+ persistence_location = ACE_LIB_TEXT("NameService");
}
+ // Now make sure this directory exists
+ if (ACE_OS::access (persistence_location, W_OK|X_OK))
+ {
+ ACE_ERROR ((LM_ERROR, "Invalid persistence directory\n"));
+ return -1;
+ }
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ if (this->use_servant_activator_)
+ {
+ TAO_Storable_Naming_Context_Activator *servant_activator;
+ ACE_NEW_THROW_EX (servant_activator,
+ TAO_Storable_Naming_Context_Activator (orb,
+ persFactory,
+ persistence_location,
+ context_size),
+ CORBA::NO_MEMORY ());
+ this->ns_poa_->set_servant_manager(servant_activator);
+ }
+#endif /* TAO_HAS_MINIMUM_POA */
+
this->naming_context_ =
- TAO_Storable_Naming_Context::recreate_all(orb,
- poa,
- TAO_ROOT_NAMING_CONTEXT,
- context_size,
- 0,
- persFactory,
- persistence_location
- ACE_ENV_ARG_PARAMETER);
+ TAO_Storable_Naming_Context::recreate_all (orb,
+ poa,
+ TAO_ROOT_NAMING_CONTEXT,
+ context_size,
+ 0,
+ persFactory,
+ persistence_location,
+ use_redundancy_
+ ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
else if (persistence_location != 0)
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Naming_Utils.h b/TAO/orbsvcs/orbsvcs/Naming/Naming_Utils.h
index 87659787e54..cb945502ee3 100644
--- a/TAO/orbsvcs/orbsvcs/Naming/Naming_Utils.h
+++ b/TAO/orbsvcs/orbsvcs/Naming/Naming_Utils.h
@@ -28,6 +28,7 @@
// Forward decl;
class TAO_Persistent_Context_Index;
+class TAO_Storable_Naming_Context_Activator;
/**
* @class TAO_Naming_Server
@@ -206,6 +207,23 @@ protected:
/// If not zero use flat file persistence
int use_storable_context_;
+
+ /**
+ * If not zero use servant activator that uses flat file persistence.
+ */
+ int use_servant_activator_;
+
+ /**
+ * Need to retain the servant activator between calls to
+ * init_with_orb() and init_new_naming().
+ */
+ TAO_Storable_Naming_Context_Activator *servant_activator_;
+
+ /**
+ * If not zero support redundant naming servers.
+ */
+ int use_redundancy_;
+
};
/**
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable.h b/TAO/orbsvcs/orbsvcs/Naming/Storable.h
index 4b997a35da0..4f563eb9d50 100644
--- a/TAO/orbsvcs/orbsvcs/Naming/Storable.h
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable.h
@@ -19,34 +19,18 @@ const int szInt = sizeof(int);
const int szChar = sizeof(char);
const int szBool = sizeof(int);
-class TAO_Writer_Base;
-class TAO_Reader_Base;
-
-class TAO_Storable_Base
-{
-public:
- TAO_Storable_Base();
-
- TAO_Storable_Base (TAO_Reader_Base&);
-
- virtual ~TAO_Storable_Base();
-
- virtual void Write(TAO_Writer_Base&) = 0;
-
-};
-
class TAO_NS_Persistence_Header
{
public:
void size (unsigned int size);
unsigned int size () const ;
- void context_name (const ACE_CString& context_name);
- ACE_CString context_name () const;
+ void destroyed (int flag);
+ int destroyed () const ;
private:
unsigned int size_;
- ACE_CString context_name_;
+ int destroyed_;
};
class TAO_NS_Persistence_Record
@@ -63,63 +47,67 @@ class TAO_NS_Persistence_Record
ACE_CString kind () const;
void kind (const ACE_CString& kind);
- ACE_CString ior () const;
- void ior (const ACE_CString& ior);
-
- ACE_CString context_binding () const;
- void context_binding (const ACE_CString& context_binding);
+ ACE_CString ref () const;
+ void ref (const ACE_CString& ior);
private:
Record_Type type_;
ACE_CString id_;
ACE_CString kind_;
- ACE_CString ior_;
- ACE_CString context_binding_;
+ ACE_CString ref_;
};
-class TAO_Writer_Base
+class TAO_NS_Persistence_Global
{
public:
- virtual ~TAO_Writer_Base();
- TAO_Writer_Base();
+ void counter (unsigned int counter);
+ unsigned int counter () const ;
- virtual int open (const char* name) = 0;
- virtual int close () = 0;
+ private:
+ unsigned int counter_;
+};
+
+class TAO_Storable_Base
+{
+public:
+ TAO_Storable_Base();
- virtual TAO_Writer_Base& operator << (
- const TAO_NS_Persistence_Header& header) = 0;
+ virtual ~TAO_Storable_Base();
- virtual TAO_Writer_Base& operator << (
- const TAO_NS_Persistence_Record& record) = 0;
+ virtual void remove() = 0;
+ virtual int exists() = 0;
+ virtual int open () = 0;
- public:
- /// This is used to indicate to the Writer that the bindings map is now
- /// empty and therefore now persistence resources are needed for it.
- int delete_bindings_;
+ virtual int close () = 0;
-};
+ virtual int flock (int whence, int start, int len) = 0;
-class TAO_Reader_Base
-{
- public:
- TAO_Reader_Base ();
- virtual ~TAO_Reader_Base ();
+ virtual int funlock (int whence, int start, int len) = 0;
- virtual int open (const char* name) = 0;
- virtual int close () = 0;
+ virtual time_t last_changed(void) = 0;
+
+ virtual TAO_Storable_Base& operator << (
+ const TAO_NS_Persistence_Header& header) = 0;
+
+ virtual TAO_Storable_Base& operator << (
+ const TAO_NS_Persistence_Record& record) = 0;
- virtual TAO_Reader_Base& operator >> (
+ virtual TAO_Storable_Base& operator >> (
TAO_NS_Persistence_Header& header) = 0;
- virtual TAO_Reader_Base& operator >> (
+ virtual TAO_Storable_Base& operator >> (
TAO_NS_Persistence_Record& record) = 0;
+ virtual TAO_Storable_Base& operator << (
+ const TAO_NS_Persistence_Global& global) = 0;
+ virtual TAO_Storable_Base& operator >> (
+ TAO_NS_Persistence_Global& global) = 0;
};
-
+
class TAO_Naming_Service_Persistence_Factory
{
public:
@@ -129,8 +117,8 @@ public:
// Factory Methods
- virtual TAO_Reader_Base *create_reader() = 0;
- virtual TAO_Writer_Base *create_writer() = 0;
+ virtual TAO_Storable_Base *create_stream(const ACE_CString & file,
+ const ACE_TCHAR * mode) = 0;
};
#if defined (__ACE_INLINE__)
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable.inl b/TAO/orbsvcs/orbsvcs/Naming/Storable.inl
index 7de75a8f4e4..ca417e0913d 100644
--- a/TAO/orbsvcs/orbsvcs/Naming/Storable.inl
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable.inl
@@ -13,44 +13,6 @@
//
// ============================================================================
-ACE_INLINE
-TAO_Storable_Base::TAO_Storable_Base()
-{
-}
-
-ACE_INLINE
-TAO_Storable_Base::TAO_Storable_Base (TAO_Reader_Base &)
-{
-}
-
-ACE_INLINE
-TAO_Storable_Base::~TAO_Storable_Base()
-{
-}
-
-ACE_INLINE
-TAO_Writer_Base::TAO_Writer_Base()
- : delete_bindings_(0)
-{
-}
-
-ACE_INLINE
-TAO_Writer_Base::~TAO_Writer_Base()
-{
-}
-
-ACE_INLINE
-TAO_Reader_Base::TAO_Reader_Base()
-{
-}
-
-ACE_INLINE
-TAO_Reader_Base::~TAO_Reader_Base()
-{
-}
-
-
-
ACE_INLINE void
TAO_NS_Persistence_Header::size (unsigned int size)
{
@@ -64,15 +26,15 @@ TAO_NS_Persistence_Header::size () const
}
ACE_INLINE void
-TAO_NS_Persistence_Header::context_name (const ACE_CString& context_name)
+TAO_NS_Persistence_Header::destroyed (int flag)
{
- this->context_name_ = context_name;
+ this->destroyed_ = flag;
}
-ACE_INLINE ACE_CString
-TAO_NS_Persistence_Header::context_name () const
+ACE_INLINE int
+TAO_NS_Persistence_Header::destroyed () const
{
- return this->context_name_;
+ return this->destroyed_;
}
@@ -113,30 +75,30 @@ TAO_NS_Persistence_Record::kind (const ACE_CString& kind)
}
ACE_INLINE ACE_CString
-TAO_NS_Persistence_Record::ior () const
+TAO_NS_Persistence_Record::ref () const
{
- return this->ior_;
+ return this->ref_;
}
ACE_INLINE void
-TAO_NS_Persistence_Record::ior (const ACE_CString& ior)
+TAO_NS_Persistence_Record::ref (const ACE_CString& ref)
{
- this->ior_ = ior;
+ this->ref_ = ref;
}
-
-ACE_INLINE ACE_CString
-TAO_NS_Persistence_Record::context_binding () const
+ACE_INLINE void
+TAO_NS_Persistence_Global::counter (unsigned int counter)
{
- return this->context_binding_;
+ this->counter_ = counter;
}
-ACE_INLINE void
-TAO_NS_Persistence_Record::context_binding (const ACE_CString& context_binding)
+ACE_INLINE unsigned int
+TAO_NS_Persistence_Global::counter () const
{
- this->context_binding_ = context_binding;
+ return this->counter_;
}
+
ACE_INLINE
TAO_Naming_Service_Persistence_Factory::TAO_Naming_Service_Persistence_Factory()
{
@@ -146,3 +108,14 @@ ACE_INLINE
TAO_Naming_Service_Persistence_Factory::~TAO_Naming_Service_Persistence_Factory()
{
}
+
+ACE_INLINE
+TAO_Storable_Base::TAO_Storable_Base()
+{
+}
+
+ACE_INLINE
+TAO_Storable_Base::~TAO_Storable_Base()
+{
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.cpp b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.cpp
index 44ae87c8605..464c9037c50 100644
--- a/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.cpp
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.cpp
@@ -14,7 +14,10 @@
#include "ace/Auto_Ptr.h"
-CosNaming::NamingContext_ptr TAO_Storable_Naming_Context::root_context_;
+const char * TAO_Storable_Naming_Context::root_name_;
+ACE_UINT32 TAO_Storable_Naming_Context::gcounter_;
+TAO_Storable_Base * TAO_Storable_Naming_Context::gfl_;
+int TAO_Storable_Naming_Context::redundant_;
ACE_RCSID (Naming,
Storable_Naming_Context,
@@ -24,6 +27,7 @@ int
TAO_Storable_Bindings_Map::unbind (const char *id,
const char *kind)
{
+ ACE_TRACE("unbind");
TAO_Persistent_ExtId name (id, kind);
return this->map_.unbind (name);
}
@@ -34,6 +38,7 @@ TAO_Storable_Bindings_Map::bind (const char *id,
CORBA::Object_ptr obj,
CosNaming::BindingType type)
{
+ ACE_TRACE("bind");
return this->shared_bind (id, kind, obj, type, 0);
}
@@ -43,6 +48,7 @@ TAO_Storable_Bindings_Map::rebind (const char *id,
CORBA::Object_ptr obj,
CosNaming::BindingType type)
{
+ ACE_TRACE("rebind");
return this->shared_bind (id, kind, obj, type, 1);
}
@@ -52,6 +58,7 @@ TAO_Storable_Bindings_Map::find (const char *id,
CORBA::Object_ptr & obj,
CosNaming::BindingType &type)
{
+ ACE_TRACE("find");
TAO_Persistent_ExtId name (id, kind);
TAO_Persistent_IntId entry;
@@ -71,38 +78,37 @@ TAO_Storable_Bindings_Map::find (const char *id,
}
}
-TAO_Storable_Bindings_Map::TAO_Storable_Bindings_Map (size_t hash_table_size)
- : map_ (hash_table_size)
-{
-}
-
-TAO_Storable_Bindings_Map::TAO_Storable_Bindings_Map (size_t hash_table_size, CORBA::ORB_ptr orb, const char* poa_id,PortableServer::POA_ptr poa)
+TAO_Storable_Bindings_Map::TAO_Storable_Bindings_Map (size_t hash_table_size,
+ CORBA::ORB_ptr orb)
: map_ (hash_table_size),
- orb_ (CORBA::ORB::_duplicate (orb)),
- name_ (poa_id),
- poa_ (PortableServer::POA::_duplicate (poa))
+ orb_(CORBA::ORB::_duplicate (orb))
{
+ ACE_TRACE("TAO_Storable_Bindings_Map");
}
TAO_Storable_Bindings_Map::~TAO_Storable_Bindings_Map (void)
{
+ ACE_TRACE("~TAO_Storable_Bindings_Map");
}
TAO_Storable_Bindings_Map::HASH_MAP &
TAO_Storable_Bindings_Map::map (void)
{
+ ACE_TRACE("map");
return map_;
}
size_t
TAO_Storable_Bindings_Map::current_size (void)
{
+ ACE_TRACE("current_size");
return map_.current_size ();
}
size_t
TAO_Storable_Bindings_Map::total_size (void)
{
+ ACE_TRACE("total_size");
return map_.total_size ();
}
@@ -113,6 +119,7 @@ TAO_Storable_Bindings_Map::shared_bind (const char * id,
CosNaming::BindingType type,
int rebind)
{
+ ACE_TRACE("shared_bind");
TAO_Persistent_ExtId new_name (CORBA::string_dup(id), CORBA::string_dup(kind));
TAO_Persistent_IntId new_entry (orb_->object_to_string(obj), type);
TAO_Persistent_IntId old_entry;
@@ -136,33 +143,26 @@ TAO_Storable_Bindings_Map::shared_bind (const char * id,
}
}
-const char * TAO_Storable_Bindings_Map::name()
-{
- return name_.rep();
-}
-
-void TAO_Storable_Bindings_Map::Write(TAO_Writer_Base& wrtr)
+void TAO_Storable_Naming_Context::Write(TAO_Storable_Base& wrtr)
{
- ACE_Hash_Map_Iterator<TAO_Persistent_ExtId,TAO_Persistent_IntId, ACE_Null_Mutex> it = map_.begin();
- ACE_Hash_Map_Iterator<TAO_Persistent_ExtId,TAO_Persistent_IntId, ACE_Null_Mutex> itend = map_.end();
-
- if (it == itend)
- {
- wrtr.delete_bindings_ = 1;
- return;
- }
+ ACE_TRACE("Write");
+ TAO_NS_Persistence_Header header;
- ACE_Hash_Map_Entry<TAO_Persistent_ExtId,TAO_Persistent_IntId> ent = *it;
+ header.size (ACE_static_cast(unsigned int,
+ storable_context_->current_size()));
+ header.destroyed (destroyed_);
- const char *my_name = name_.rep();
+ wrtr << header;
- TAO_NS_Persistence_Header header;
+ if( storable_context_->current_size() == 0 )
+ return;
- ACE_CString name(my_name);
- header.context_name (name);
- header.size ((unsigned int)map_.current_size());
+ ACE_Hash_Map_Iterator<TAO_Persistent_ExtId,TAO_Persistent_IntId,
+ ACE_Null_Mutex> it = storable_context_->map().begin();
+ ACE_Hash_Map_Iterator<TAO_Persistent_ExtId,TAO_Persistent_IntId,
+ ACE_Null_Mutex> itend = storable_context_->map().end();
- wrtr << header;
+ ACE_Hash_Map_Entry<TAO_Persistent_ExtId,TAO_Persistent_IntId> ent = *it;
while (!(it == itend))
{
@@ -178,7 +178,7 @@ void TAO_Storable_Bindings_Map::Write(TAO_Writer_Base& wrtr)
//ignore for now
// todo - are we using this i ??
- //int i = map_.current_size();
+ //int i = storable_context_->current_size();
const char *myid = (*it).ext_id_.id();
ACE_CString id(myid);
@@ -188,23 +188,210 @@ void TAO_Storable_Bindings_Map::Write(TAO_Writer_Base& wrtr)
ACE_CString kind(mykind);
record.kind(kind);
- ACE_CString ior((*it).int_id_.ref_);
- record.ior(ior);
-
- if (bt == 1)
+ ACE_CString name;
+ if (bt == CosNaming::nobject)
+ {
+ name.set((*it).int_id_.ref_);
+ }
+ else
{
CORBA::Object_var obj = orb_->string_to_object((*it).int_id_.ref_);
PortableServer::ObjectId_var oid = poa_->reference_to_id(obj.in());
CORBA::String_var nm = PortableServer::ObjectId_to_string(oid.in());
const char *newname = nm.in();
- ACE_CString name(newname);
- record.context_binding(name);
+ name.set(newname);
}
+ record.ref(name);
+
wrtr << record;
it.advance();
}
}
+// Helper function to load a new context into the binding_map
+int
+TAO_Storable_Naming_Context::load_map(File_Open_Lock_and_Check *flck
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRACE("load_map");
+ // assume file already open for reading
+ TAO_Storable_Bindings_Map *bindings_map;
+
+ // create the new bindings map
+ ACE_NEW_THROW_EX (bindings_map,
+ TAO_Storable_Bindings_Map (hash_table_size_,orb_),
+ CORBA::NO_MEMORY ());
+
+ // get the data for this bindings map from the file
+
+ TAO_NS_Persistence_Header header;
+ TAO_NS_Persistence_Record record;
+
+ // we are only using the size from this header
+ flck->peer() >> header;
+
+ // reset the destroyed flag
+ this->destroyed_ = header.destroyed();
+
+ // read in the data for the map
+ for (unsigned int i=0; i<header.size(); i++)
+ {
+ flck->peer() >> record;
+ if( record.type() == TAO_NS_Persistence_Record::NCONTEXT )
+ {
+ PortableServer::ObjectId_var id =
+ PortableServer::string_to_ObjectId(record.ref().c_str());
+ const char * intf = interface_->_interface_repository_id();
+ CORBA::Object_var objref = poa_->create_reference_with_id (
+ id.in (),
+ intf );
+ bindings_map->bind( record.id().c_str(),
+ record.kind().c_str(),
+ objref.in(),
+ CosNaming::ncontext );
+ }
+ else
+ {
+ CORBA::Object_var objref = orb_->string_to_object (record.ref().c_str());
+ bindings_map->bind( record.id().c_str(),
+ record.kind().c_str(),
+ objref.in(),
+ CosNaming::nobject );
+ }
+ }
+ storable_context_ = bindings_map;
+ context_ = storable_context_;
+ return 0;
+}
+
+TAO_Storable_Naming_Context::
+File_Open_Lock_and_Check::File_Open_Lock_and_Check(
+ TAO_Storable_Naming_Context * context,
+ const char * mode
+ ACE_ENV_ARG_DECL)
+:closed_(1),
+ context_(context)
+{
+ ACE_TRACE("File_Open_Lock_and_Check");
+ // We only accept a subset of mode argument, check it
+ rwflags_ = 0;
+ for( unsigned int i = 0; i<ACE_OS::strlen(mode); i++ )
+ {
+ switch (mode[i])
+ {
+ case 'r': rwflags_ |= mode_read;
+ break;
+ case 'w': rwflags_ |= mode_write;
+ break;
+ case 'c': rwflags_ |= mode_create;
+ break;
+ default: rwflags_ = -1;
+ }
+ }
+ if( rwflags_ <= 0 )
+ {
+ errno = EINVAL;
+ ACE_THROW(CORBA::PERSIST_STORE());
+ }
+
+ // build the file name
+ ACE_CString file_name(context->persistence_directory_);
+ file_name += "/";
+ file_name += context->name_;
+
+ // Create the stream
+ fl_ = context->factory_->create_stream(file_name, mode);
+ if (TAO_Storable_Naming_Context::redundant_)
+ {
+ if (fl_->open() != 0)
+ {
+ delete fl_;
+ ACE_THROW(CORBA::PERSIST_STORE());
+ }
+
+ // acquire a lock on it
+ if (fl_ -> flock(0, 0, 0) != 0)
+ {
+ fl_->close();
+ delete fl_;
+ ACE_THROW(CORBA::INTERNAL());
+ }
+
+ // now that the file is successfully opened and locked it must be
+ // unlocked/closed before we leave this class
+ closed_ = 0;
+
+ if ( ! (rwflags_ & mode_create) )
+ {
+ // Check if our copy is up to date
+ time_t new_last_changed = fl_->last_changed();
+ if( new_last_changed > context->last_changed_ )
+ {
+ context->last_changed_ = new_last_changed;
+ // Throw our map away
+ delete context->storable_context_;
+ // and build a new one from disk
+ context->load_map(this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ }
+ else if ( ! context->storable_context_ || (rwflags_ & mode_write) )
+ {
+ if (fl_->open() != 0)
+ {
+ delete fl_;
+ ACE_THROW(CORBA::PERSIST_STORE());
+ }
+
+ // now that the file is successfully opened
+ // unlocked/closed before we leave this class
+ closed_ = 0;
+
+ if(!context->storable_context_)
+ {
+ // Load the map from disk
+ context->load_map(this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+}
+
+void
+TAO_Storable_Naming_Context::
+File_Open_Lock_and_Check::release(void)
+{
+ ACE_TRACE("release");
+ if ( ! closed_ )
+ {
+ // If we updated the disk, save the time stamp
+ if(TAO_Storable_Naming_Context::redundant_)
+ {
+ if( rwflags_ & mode_write )
+ context_->last_changed_ = fl_->last_changed();
+ fl_->funlock(0, 0, 0);
+ }
+ fl_->close();
+ delete fl_;
+ closed_ = 1;
+ }
+}
+
+TAO_Storable_Naming_Context::
+File_Open_Lock_and_Check::~File_Open_Lock_and_Check(void)
+{
+ ACE_TRACE("~File_Open_Lock_and_Check");
+ this->release();
+}
+
+TAO_Storable_Base &
+TAO_Storable_Naming_Context::
+File_Open_Lock_and_Check::peer(void)
+{
+ ACE_TRACE("peer");
+ return *fl_;
+}
+
TAO_Storable_Naming_Context::TAO_Storable_Naming_Context (
CORBA::ORB_ptr orb,
PortableServer::POA_ptr poa,
@@ -217,35 +404,27 @@ TAO_Storable_Naming_Context::TAO_Storable_Naming_Context (
counter_ (0),
storable_context_ (0),
orb_(CORBA::ORB::_duplicate (orb)),
+ name_ (poa_id),
+ poa_ (PortableServer::POA::_duplicate (poa)),
factory_(factory),
- persistence_directory_ (ACE_TEXT_ALWAYS_CHAR(persistence_directory))
+ persistence_directory_ (ACE_TEXT_ALWAYS_CHAR(persistence_directory)),
+ hash_table_size_(hash_table_size),
+ last_changed_(0)
{
- ACE_NEW (this->storable_context_,
- TAO_Storable_Bindings_Map (hash_table_size,orb,poa_id,poa));
- context_ = storable_context_;
-}
-
-TAO_Storable_Naming_Context::TAO_Storable_Naming_Context (
- CORBA::ORB_ptr orb,
- PortableServer::POA_ptr poa,
- const char *poa_id,
- TAO_Storable_Bindings_Map *bindings_map,
- TAO_Naming_Service_Persistence_Factory *factory,
- const ACE_TCHAR *persistence_directory,
- size_t)
- : TAO_Hash_Naming_Context (poa, poa_id),
- counter_ (0),
- storable_context_ (0),
- orb_(CORBA::ORB::_duplicate (orb)),
- factory_(factory),
- persistence_directory_ (ACE_TEXT_ALWAYS_CHAR(persistence_directory))
-{
- this->storable_context_ = bindings_map;
- context_ = storable_context_;
+ ACE_TRACE("TAO_Storable_Naming_Context");
}
TAO_Storable_Naming_Context::~TAO_Storable_Naming_Context (void)
{
+ ACE_TRACE("~TAO_Storable_Naming_Context");
+ // build the file name
+ ACE_CString file_name(persistence_directory_);
+ file_name += "/";
+ file_name += name_;
+ // and delete the file
+ TAO_Storable_Base * fl = factory_->create_stream(file_name, "w");
+ fl->remove();
+
}
CosNaming::NamingContext_ptr
@@ -255,9 +434,11 @@ TAO_Storable_Naming_Context::make_new_context (
const char *poa_id,
size_t context_size,
TAO_Naming_Service_Persistence_Factory *factory,
- const ACE_TCHAR *persistence_directory
+ const ACE_TCHAR *persistence_directory,
+ TAO_Storable_Naming_Context **new_context
ACE_ENV_ARG_DECL)
{
+ ACE_TRACE("make_new_context");
// Store the stub we will return here.
CosNaming::NamingContext_var result;
@@ -320,42 +501,96 @@ TAO_Storable_Naming_Context::make_new_context (
result = context->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ // return the address of the new context object so that caller can finish
+ *new_context = context_impl;
+
return result._retn ();
}
CosNaming::NamingContext_ptr
TAO_Storable_Naming_Context::new_context (ACE_ENV_SINGLE_ARG_DECL)
{
+ ACE_TRACE("new_context");
ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
ace_mon,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
- // Check to make sure this object didn't have <destroy> method
- // invoked on it.
- if (this->destroyed_)
- ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
- CosNaming::NamingContext::_nil ());
+ {
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, "r"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ CosNaming::NamingContext::_nil ());
+ }
+
+ TAO_NS_Persistence_Global global;
// Generate a POA id for the new context.
+ if(redundant_)
+ {
+ // acquire a lock on the file that holds our counter
+ if (gfl_->open() != 0)
+ {
+ delete gfl_;
+ ACE_THROW_RETURN(CORBA::PERSIST_STORE(),
+ CosNaming::NamingContext::_nil ());
+ }
+ if (gfl_ -> flock(0, 0, 0) != 0)
+ ACE_THROW_RETURN (CORBA::INTERNAL(),
+ CosNaming::NamingContext::_nil ());
+ // get the counter from disk
+ *gfl_ >> global;
+ gcounter_ = global.counter();
+ // use it to generate a new name
+ }
char poa_id[BUFSIZ];
ACE_OS::sprintf (poa_id,
"%s_%d",
- this->poa_id_.c_str (),
- this->counter_++);
+ root_name_,
+ gcounter_++);
+ // then save it back on disk
+ global.counter(gcounter_);
+ *gfl_ << global;
+ if(redundant_)
+ {
+ // and release our lock
+ if (gfl_ -> flock(0, 0, 0) != 0)
+ ACE_THROW_RETURN(CORBA::INTERNAL(),
+ CosNaming::NamingContext::_nil ());
+ gfl_->close();
+ }
// Create a new context.
+ TAO_Storable_Naming_Context *new_context = 0;
CosNaming::NamingContext_var result =
make_new_context (this->orb_,
this->poa_.in (),
poa_id,
this->storable_context_->total_size (),
this->factory_,
- ACE_TEXT_CHAR_TO_TCHAR(this->persistence_directory_.c_str ())
+ this->persistence_directory_.c_str (),
+ &new_context
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ // Since this is a new context, make an empty map in it
+ ACE_NEW_THROW_EX (new_context->storable_context_,
+ TAO_Storable_Bindings_Map (hash_table_size_,orb_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ new_context->context_ = new_context->storable_context_;
+
+ File_Open_Lock_and_Check flck(new_context, "wc" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ new_context->Write(flck.peer());
+
return result._retn ();
}
@@ -364,30 +599,40 @@ TAO_Storable_Naming_Context::rebind (const CosNaming::Name& n,
CORBA::Object_ptr obj
ACE_ENV_ARG_DECL)
{
+ ACE_TRACE("rebind");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // we didn't need a lock to check the input arg, but now we do
ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK;
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
- // Get the length of the name.
- CORBA::ULong name_len = n.length ();
-
- // Check for invalid name.
- if (name_len == 0)
- ACE_THROW (CosNaming::NamingContext::InvalidName());
-
// If we received compound name, resolve it to get the context in
// which the rebinding should take place, then perform the rebinding
// on target context.
if (name_len > 1)
{
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
CosNaming::NamingContext_var context =
- get_context (n ACE_ENV_ARG_PARAMETER);
+ get_context (n ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
CosNaming::Name simple_name;
@@ -396,33 +641,15 @@ TAO_Storable_Naming_Context::rebind (const CosNaming::Name& n,
context->rebind (simple_name, obj ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
+ // If we received a simple name, we need to rebind it in this
+ // context.
else
- // If we received a simple name, we need to rebind it in this
- // context.
{
int result = this->context_->rebind (n[0].id,
n[0].kind,
obj,
CosNaming::nobject);
-
- ACE_CString writer_name(this->persistence_directory_);
- writer_name += "/";
- writer_name += ACE_static_cast(TAO_Storable_Bindings_Map*,
- this->context_)->name();
- //TAO_Writer_Base *wrtr = factory_->create_writer(writer_name.c_str());
- TAO_Writer_Base *wrtr = factory_->create_writer();
- if (wrtr->open (writer_name.c_str()) != 0)
- {
- delete wrtr;
- ACE_THROW (CORBA::PERSIST_STORE ());
- }
-
- ACE_static_cast (TAO_Storable_Bindings_Map*,
- this->context_)->Write(*wrtr);
- wrtr->close();
- delete wrtr;
-
// Check for error conditions.
if (result == -1)
ACE_THROW (CORBA::INTERNAL ());
@@ -430,6 +657,8 @@ TAO_Storable_Naming_Context::rebind (const CosNaming::Name& n,
else if (result == -2)
ACE_THROW (CosNaming::NamingContext::NotFound
(CosNaming::NamingContext::not_object, n));
+
+ this->Write(flck.peer());
}
}
@@ -438,32 +667,42 @@ TAO_Storable_Naming_Context::bind_context (const CosNaming::Name &n,
CosNaming::NamingContext_ptr nc
ACE_ENV_ARG_DECL)
{
+ ACE_TRACE("bine_context");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // Do not allow binding of nil context reference.
+ if (CORBA::is_nil (nc))
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ // we didn't need a lock to check the input arg, but now we do
ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK;
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
- // Do not allow binding of nil context reference.
- if (CORBA::is_nil (nc))
- ACE_THROW (CORBA::BAD_PARAM ());
-
- // Get the length of the name.
- CORBA::ULong name_len = n.length ();
-
- // Check for invalid name.
- if (name_len == 0)
- ACE_THROW (CosNaming::NamingContext::InvalidName());
-
// If we received compound name, resolve it to get the context in
- // which the binding should take place, then perform the binding on
- // target context.
+ // which the binding should take place, then perform the binding
+ // on target context.
if (name_len > 1)
{
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
CosNaming::NamingContext_var context =
get_context (n ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
@@ -489,23 +728,7 @@ TAO_Storable_Naming_Context::bind_context (const CosNaming::Name &n,
else if (result == -1)
ACE_THROW (CORBA::INTERNAL ());
- ACE_CString writer_name(this->persistence_directory_);
- writer_name += "/";
- writer_name += ACE_static_cast(TAO_Storable_Bindings_Map*,
- this->context_)->name();
-
- //TAO_Writer_Base *wrtr = factory_->create_writer(writer_name.c_str());
- TAO_Writer_Base *wrtr = factory_->create_writer();
- if (wrtr->open (writer_name.c_str()) != 0)
- {
- delete wrtr;
- ACE_THROW (CORBA::PERSIST_STORE ());
- }
-
- ACE_static_cast(TAO_Storable_Bindings_Map*,
- this->context_)->Write(*wrtr);
- wrtr->close();
- delete wrtr;
+ this->Write(flck.peer());
}
}
@@ -514,28 +737,38 @@ TAO_Storable_Naming_Context::rebind_context (const CosNaming::Name &n,
CosNaming::NamingContext_ptr nc
ACE_ENV_ARG_DECL)
{
+ ACE_TRACE("rebind_context");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // we didn't need a lock to check the input arg, but now we do
ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK;
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
- // Get the length of the name.
- CORBA::ULong name_len = n.length ();
-
- // Check for invalid name.
- if (name_len == 0)
- ACE_THROW (CosNaming::NamingContext::InvalidName());
-
// If we received compound name, resolve it to get the context in
// which the rebinding should take place, then perform the rebinding
// on target context.
if (name_len > 1)
{
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
CosNaming::NamingContext_var context =
get_context (n ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
@@ -546,9 +779,9 @@ TAO_Storable_Naming_Context::rebind_context (const CosNaming::Name &n,
context->rebind_context (simple_name, nc ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
+ // If we received a simple name, we need to rebind it in this
+ // context.
else
- // If we received a simple name, we need to rebind it in this
- // context.
{
int result = this->context_->rebind (n[0].id,
n[0].kind,
@@ -557,27 +790,11 @@ TAO_Storable_Naming_Context::rebind_context (const CosNaming::Name &n,
// Check for error conditions.
if (result == -1)
ACE_THROW (CORBA::INTERNAL ());
-
else if (result == -2)
ACE_THROW (CosNaming::NamingContext::NotFound
(CosNaming::NamingContext::not_context, n));
- ACE_CString writer_name(this->persistence_directory_);
- writer_name += "/";
- writer_name += ACE_static_cast(TAO_Storable_Bindings_Map*,
- this->context_)->name();
- //TAO_Writer_Base *wrtr = factory_->create_writer(writer_name.c_str());
- TAO_Writer_Base *wrtr = factory_->create_writer();
- if (wrtr->open (writer_name.c_str()) != 0)
- {
- delete wrtr;
- ACE_THROW (CORBA::PERSIST_STORE ());
- }
-
- ACE_static_cast(TAO_Storable_Bindings_Map*,
- this->context_)->Write(*wrtr);
- wrtr->close();
- delete wrtr;
+ this->Write(flck.peer());
}
}
@@ -585,25 +802,33 @@ CORBA::Object_ptr
TAO_Storable_Naming_Context::resolve (const CosNaming::Name& n
ACE_ENV_ARG_DECL)
{
+ ACE_TRACE("resolve");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
+ CORBA::Object::_nil ());
+
+ // we didn't need a lock to check the input arg, but now we do
ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon, this->lock_,
CORBA::INTERNAL ());
ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, "r"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
CORBA::Object::_nil ());
- // Get the length of the name.
- CORBA::ULong name_len = n.length ();
-
- // Check for invalid name.
- if (name_len == 0)
- ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
- CORBA::Object::_nil ());
-
// Resolve the first component of the name.
+ flck.release();
// Stores the binding type for the first name component.
CosNaming::BindingType type;
@@ -676,28 +901,38 @@ void
TAO_Storable_Naming_Context::unbind (const CosNaming::Name& n
ACE_ENV_ARG_DECL)
{
+ ACE_TRACE("unbind");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // we didn't need a lock to check the input arg, but now we do
ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK;
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
- // Get the length of the name.
- CORBA::ULong name_len = n.length ();
-
- // Check for invalid name.
- if (name_len == 0)
- ACE_THROW (CosNaming::NamingContext::InvalidName());
-
// If we received compound name, resolve it to get the context in
// which the unbinding should take place, then perform the unbinding
// on target context.
if (name_len > 1)
{
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
CosNaming::NamingContext_var context =
get_context (n ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
@@ -711,33 +946,29 @@ TAO_Storable_Naming_Context::unbind (const CosNaming::Name& n
// If we received a simple name, we need to unbind it in this
// context.
else
- if (this->context_->unbind (n[0].id,
- n[0].kind) == -1)
- ACE_THROW (CosNaming::NamingContext::NotFound
- (CosNaming::NamingContext::missing_node, n));
-
- ACE_CString writer_name(this->persistence_directory_);
- writer_name += "/";
- writer_name += ACE_static_cast(TAO_Storable_Bindings_Map*,
- this->context_)->name();
- //TAO_Writer_Base *wrtr = factory_->create_writer(writer_name.c_str());
- TAO_Writer_Base *wrtr = factory_->create_writer();
- if (wrtr->open (writer_name.c_str()) != 0)
- {
- delete wrtr;
- ACE_THROW (CORBA::PERSIST_STORE ());
- }
+ {
+ if (this->context_->unbind (n[0].id,
+ n[0].kind) == -1)
+ ACE_THROW (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::missing_node, n));
- ACE_static_cast(TAO_Storable_Bindings_Map*,
- this->context_)->Write(*wrtr);
- wrtr->close();
- delete wrtr;
+ this->Write(flck.peer());
+ }
}
CosNaming::NamingContext_ptr
TAO_Storable_Naming_Context::bind_new_context (const CosNaming::Name& n
ACE_ENV_ARG_DECL)
{
+ ACE_TRACE("bind_new_context");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
+ CosNaming::NamingContext::_nil ());
+
ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
ace_mon,
this->lock_,
@@ -750,55 +981,95 @@ TAO_Storable_Naming_Context::bind_new_context (const CosNaming::Name& n
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
CosNaming::NamingContext::_nil ());
- // Stores our new Naming Context.
- CosNaming::NamingContext_var result =
- CosNaming::NamingContext::_nil ();
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
- // Create new context.
- result = new_context (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
- // Bind the new context to the name.
- ACE_TRY
+ // If we received compound name, resolve it to get the context in
+ // which the binding should take place, then perform the operation on
+ // target context.
+ if (name_len > 1)
{
- bind_context (n,
- result.in ()
- ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ return context->bind_new_context (simple_name ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
}
- ACE_CATCHANY
- {
+ // If we received a simple name, we need to bind it in this context.
+ else
+ {
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
+ // Stores our new Naming Context.
+ CosNaming::NamingContext_var result =
+ CosNaming::NamingContext::_nil ();
+
+ // Create new context.
+ result = new_context (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Bind the new context to the name.
+ ACE_TRY
{
- ACE_DECLARE_NEW_CORBA_ENV;
- ACE_TRY_EX(DESTROY)
- {
- result->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_TRY_CHECK_EX(DESTROY);
- }
- ACE_CATCHANY
- {
- // Do nothing?
- }
- ACE_ENDTRY;
+ bind_context (n,
+ result.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
}
- // Re-raise the exception in bind_context()
- ACE_RE_THROW;
- }
- ACE_ENDTRY;
- ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
-
- return result._retn ();
+ ACE_CATCHANY
+ {
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY_EX(DESTROY)
+ {
+ result->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(DESTROY);
+ }
+ ACE_CATCHANY
+ {
+ // Do nothing?
+ }
+ ACE_ENDTRY;
+ }
+ // Re-raise the exception in bind_context()
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ return result._retn ();
+ }
}
void
TAO_Storable_Naming_Context::destroy (ACE_ENV_SINGLE_ARG_DECL)
{
+ ACE_TRACE("destroy");
ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
ace_mon,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK;
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
@@ -830,6 +1101,8 @@ TAO_Storable_Naming_Context::destroy (ACE_ENV_SINGLE_ARG_DECL)
poa->deactivate_object (id.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
+
+ this->Write(flck.peer());
}
}
@@ -839,30 +1112,40 @@ TAO_Storable_Naming_Context::bind (const CosNaming::Name& n,
CORBA::Object_ptr obj
ACE_ENV_ARG_DECL)
{
- ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
- ace_mon, this->lock_,
+ ACE_TRACE("bine");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // we didn't need a lock to check the input arg, but now we do
+ ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
+ this->lock_,
CORBA::INTERNAL ());
ACE_CHECK;
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
- // Get the length of the name.
- CORBA::ULong name_len = n.length ();
-
- // Check for invalid name.
- if (name_len == 0)
- ACE_THROW (CosNaming::NamingContext::InvalidName());
-
// If we received compound name, resolve it to get the context in
- // which the binding should take place, then perform the binding on
- // target context.
+ // which the binding should take place, then perform the binding
+ // on target context.
if (name_len > 1)
{
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
CosNaming::NamingContext_var context =
- this->get_context (n ACE_ENV_ARG_PARAMETER);
+ get_context (n ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
CosNaming::Name simple_name;
@@ -886,23 +1169,7 @@ TAO_Storable_Naming_Context::bind (const CosNaming::Name& n,
else if (result == -1)
ACE_THROW (CORBA::INTERNAL ());
- ACE_CString writer_name(this->persistence_directory_);
- writer_name += "/";
- writer_name += ACE_static_cast(TAO_Storable_Bindings_Map*,
- this->context_)->name();
- //TAO_Writer_Base *wrtr = factory_->create_writer((char*)(writer_name.c_str()));
- TAO_Writer_Base *wrtr = factory_->create_writer();
- if (wrtr->open (writer_name.c_str()) != 0)
- {
- delete wrtr;
- ACE_THROW (CORBA::PERSIST_STORE ());
- }
-
- ACE_static_cast(TAO_Storable_Bindings_Map*,
- this->context_)->Write(*wrtr);
-
- wrtr->close();
- delete wrtr;
+ this->Write(flck.peer());
}
}
@@ -913,6 +1180,7 @@ TAO_Storable_Naming_Context::list (CORBA::ULong how_many,
CosNaming::BindingIterator_out &bi
ACE_ENV_ARG_DECL)
{
+ ACE_TRACE("list");
// Allocate nil out parameters in case we won't be able to complete
// the operation.
bi = CosNaming::BindingIterator::_nil ();
@@ -928,11 +1196,19 @@ TAO_Storable_Naming_Context::list (CORBA::ULong how_many,
CORBA::INTERNAL ());
ACE_CHECK;
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, "r"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+ // We have the map in memory, let the disk go
+ flck.release();
+
// Dynamically allocate iterator for traversing the underlying hash map.
HASH_MAP::ITERATOR *hash_iter = 0;
ACE_NEW_THROW_EX (hash_iter,
@@ -990,6 +1266,9 @@ TAO_Storable_Naming_Context::list (CORBA::ULong how_many,
return;
else
{
+ // *** This is a problem. Is there an exception we can throw? ***
+ ACE_THROW (CORBA::NO_IMPLEMENT());
+
// Create a BindingIterator for return.
ACE_NEW_THROW_EX (bind_iter,
ITER_SERVANT (this, hash_iter,
@@ -1034,235 +1313,77 @@ CosNaming::NamingContext_ptr TAO_Storable_Naming_Context::recreate_all(
size_t context_size,
int reentering,
TAO_Naming_Service_Persistence_Factory *factory,
- const ACE_TCHAR *persistence_directory
+ const ACE_TCHAR *persistence_directory,
+ int use_redundancy
ACE_ENV_ARG_DECL)
{
- ACE_UNUSED_ARG (reentering);
-
- ACE_Unbounded_List<ACE_CString> context_id_coll;
- ACE_Unbounded_List<ACE_CString> context_kind_coll;
- ACE_Unbounded_List<ACE_CString> context_binding_coll;
- ACE_Unbounded_List<ACE_CString> context_IOR_coll;
- ACE_Unbounded_List<ACE_CString> ref_id_coll;
- ACE_Unbounded_List<ACE_CString> ref_kind_coll;
- ACE_Unbounded_List<ACE_CString> ref_IOR_coll;
- ACE_Unbounded_List<ACE_CString> ref_type_coll;
-
- ACE_CString reader_name(ACE_TEXT_ALWAYS_CHAR(persistence_directory));
- reader_name += "/";
- reader_name += poa_id;
-
- TAO_Reader_Base *rdr;
-
- // This is the call the to the abstract factory
- //rdr = factory->create_reader(ACE_const_cast (char *, reader_name.c_str()));
- rdr = factory->create_reader();
- int retVal = rdr->open(ACE_const_cast (char *, reader_name.c_str()));
-
- if (retVal != 0)
- {
- // This means that there was no stored state and so need to make the context.
- // This can happen if a naming context with no entries existed at the time the
- // INS crashed.
- return TAO_Storable_Naming_Context::make_new_context (
- orb,
- poa,
- poa_id,
- context_size,
- factory,
- persistence_directory
- ACE_ENV_ARG_PARAMETER);
-
- }
-
- TAO_Storable_Bindings_Map *bindings_map;
+ ACE_TRACE("recreate_all");
- // create the new bindings map
- ACE_NEW_THROW_EX (bindings_map,
- TAO_Storable_Bindings_Map (context_size,orb,poa_id,poa),
- CORBA::NO_MEMORY ());
-
- // get the data for this bindings map from the file
-
- TAO_NS_Persistence_Header header;
- TAO_NS_Persistence_Record record;
-
- *rdr >> header;
- unsigned int max_count = 0;
-
- // read in the data
- for (unsigned int i = 0; i < header.size() ; i++)
- {
- *rdr >> record;
- TAO_NS_Persistence_Record::Record_Type type = record.type();
-
- if (type == TAO_NS_Persistence_Record::NCONTEXT)
- {
- ACE_CString context_id = record.id();
- context_id_coll.insert(context_id);
-
- ACE_CString context_kind = record.kind();
- context_kind_coll.insert(context_kind);
- //size_t sz = context_kind_coll.size();
-
- ACE_CString context_IOR = record.ior();
- context_IOR_coll.insert(context_IOR);
-
- ACE_CString context_binding = record.context_binding();
- context_binding_coll.insert(context_binding);
-
- // Lets rip the context_binding apart to reverse engineer
- // the counter used to generate it. We'll save the max
- // count we see for later use to initialize this context
- int underscore_pos = context_binding.rfind('_');
- if (underscore_pos != ACE_CString::npos)
- {
- ACE_CString count_str = context_binding.substring (
- underscore_pos + 1);
- unsigned int count = ACE_OS::atoi (count_str.c_str());
- if (count >= max_count)
- {
- max_count = count + 1;
- }
- }
- }
-
- else if (type == TAO_NS_Persistence_Record::OBJREF)
- {
- ref_type_coll.insert(ACE_CString("nobject"));
+ ACE_UNUSED_ARG (reentering);
- ACE_CString ref_id = record.id();
- ref_id_coll.insert(ref_id);
+ // Whether we are redundant is global
+ redundant_ = use_redundancy;
- ACE_CString ref_kind = record.kind();
- ref_kind_coll.insert(ref_kind);
- //size_t sz = ref_kind_coll.size();
+ // Save the root name for later use
+ root_name_ = poa_id;
- ACE_CString ref_IOR = record.ior();
- ref_IOR_coll.insert(ref_IOR);
- }
- }
+ // Create a new context.
+ TAO_Storable_Naming_Context *new_context = 0;
+ CosNaming::NamingContext_var result =
+ make_new_context (orb,
+ poa,
+ poa_id,
+ context_size,
+ factory,
+ persistence_directory,
+ &new_context
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
- // now put this data into the bindings map. Let's bind the nobject
- //references first
- ACE_Unbounded_List<ACE_CString>::iterator id_set_iter(ref_id_coll);
- ACE_Unbounded_List<ACE_CString>::iterator IOR_set_iter(ref_IOR_coll);
- IOR_set_iter = ref_IOR_coll.begin();
- ACE_Unbounded_List<ACE_CString>::iterator kind_set_iter(ref_kind_coll);
- kind_set_iter = ref_kind_coll.begin();
- //vector<ACE_CString>::iterator kind_set_iter = ref_kind_coll.begin();
- for (id_set_iter = ref_id_coll.begin();
- id_set_iter != ref_id_coll.end();
- ++id_set_iter,++IOR_set_iter,++kind_set_iter)
+ // Now does this already exist on disk?
+ ACE_CString file_name(persistence_directory);
+ file_name += "/";
+ file_name += poa_id;
+ TAO_Storable_Base * fl = factory->create_stream(file_name, "r");
+ if (fl->exists())
{
- CORBA::Object_var obj_ref = orb->string_to_object((*IOR_set_iter).c_str());
- bindings_map->bind((*id_set_iter).c_str(),
- (*kind_set_iter).c_str(),obj_ref.in(),
- (CosNaming::BindingType)0);
+ // Load the map from disk
+ File_Open_Lock_and_Check flck(new_context, "r" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
}
-
- // Now bind the ncontexts
- ACE_Unbounded_List<ACE_CString>::iterator
- context_id_set_iter(context_id_coll);
- ACE_Unbounded_List<ACE_CString>::iterator
- context_IOR_set_iter(context_IOR_coll);
- context_IOR_set_iter = context_IOR_coll.begin();
- ACE_Unbounded_List<ACE_CString>::iterator
- context_kind_set_iter(context_kind_coll);
- context_kind_set_iter = context_kind_coll.begin();
- for (context_id_set_iter = context_id_coll.begin();
- context_id_set_iter != context_id_coll.end();
- ++context_id_set_iter,++context_IOR_set_iter,++context_kind_set_iter)
+ else
{
- CORBA::Object_var obj_ref = orb->string_to_object(
- (*context_IOR_set_iter).c_str());
- bindings_map->bind((*context_id_set_iter).c_str(),
- (*context_kind_set_iter).c_str(),
- obj_ref.in(),
- (CosNaming::BindingType)1);
+ // Since this is a new context, make and empty map in it
+ ACE_NEW_THROW_EX (new_context->storable_context_,
+ TAO_Storable_Bindings_Map (context_size,orb),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ new_context->context_ = new_context->storable_context_;
+ File_Open_Lock_and_Check flck(new_context, "wc" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ new_context->Write(flck.peer());
}
- // now create the context
- // This is basically a call to make_new_context except we are creating
- // the context impl with the bindings map already created and we are passing
- // it into the overloaded constructor.
-
- // Store the stub we will return here.
- CosNaming::NamingContext_var result;
+ // build the global file name
+ file_name += "_global";
- // Put together a servant for the new Naming Context.
- TAO_Storable_Naming_Context *context_impl = 0;
- // create an impl that takes a bindings map in its constructor
- ACE_NEW_THROW_EX (context_impl,
- TAO_Storable_Naming_Context (orb,
- poa,
- poa_id,
- bindings_map,
- factory,
- persistence_directory,
- context_size),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (result._retn ());
-
- // We need to ensure that we set the counter for this context
- // higher than the highest count we see in the contexts contained
- // within it. Otherwise we will end up with object id collisions
- // if we add a new context after a reload.
- if (context_impl->counter_ < max_count)
+ // Create the stream for the counter used to uniquely creat context names
+ gfl_ = factory->create_stream(file_name, "crw");
+ if (gfl_->open() != 0)
{
- context_impl->counter_ = max_count;
+ delete gfl_;
+ ACE_THROW_RETURN(CORBA::PERSIST_STORE(),
+ CosNaming::NamingContext::_nil ());
}
- // Put <context_impl> into the auto pointer temporarily, in case next
- // allocation fails.
- ACE_Auto_Basic_Ptr<TAO_Storable_Naming_Context> temp (context_impl);
+ // get the counter from disk
+ TAO_NS_Persistence_Global global;
+ *gfl_ >> global;
+ gcounter_ = global.counter();
+ if(redundant_) gfl_->close();
- TAO_Naming_Context *context = 0;
- ACE_NEW_THROW_EX (context,
- TAO_Naming_Context (context_impl),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (result._retn ());
-
- // Let <implementation> know about it's <interface>.
- context_impl->interface (context);
-
- // Release auto pointer, and start using reference counting to
- // control our servant.
- temp.release ();
- PortableServer::ServantBase_var s = context;
-
- // Register the new context with the POA.
- PortableServer::ObjectId_var id =
- PortableServer::string_to_ObjectId (poa_id);
-
- poa->activate_object_with_id (id.in (),
- context
- ACE_ENV_ARG_PARAMETER);
- ACE_CHECK_RETURN (result._retn ());
-
- result = context->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
-
- // Now we need to recursively read in the other context's contents
- ACE_Unbounded_List<ACE_CString>::iterator context_binding_set_iter(context_binding_coll);
- context_binding_set_iter = context_binding_coll.begin();
- for (; context_binding_set_iter != context_binding_coll.end();
- ++context_binding_set_iter)
- {
- CosNaming::NamingContext_var temp =
- TAO_Storable_Naming_Context::recreate_all(
- orb,
- poa,
- (*context_binding_set_iter).c_str(),
- context_size,
- 1,
- factory,
- persistence_directory
- ACE_ENV_ARG_PARAMETER);
- }
- rdr->close();
- delete rdr; // Should be scoped instead
return result._retn ();
+
}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.h b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.h
index a61946f2a0d..125e4c8bbde 100644
--- a/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.h
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.h
@@ -33,8 +33,7 @@
* A thin wrapper on top of ACE_Hash_Map_Manager. Supports
* TAO_Bindings_Map interface. Used by TAO_Transient_Naming_Context.
*/
-class TAO_Naming_Export TAO_Storable_Bindings_Map : public TAO_Bindings_Map,
- public TAO_Storable_Base
+class TAO_Naming_Export TAO_Storable_Bindings_Map : public TAO_Bindings_Map
{
public:
@@ -46,12 +45,7 @@ public:
// = Initialization and termination methods.
/// Constructor.
- TAO_Storable_Bindings_Map (size_t hash_table_size);
-
- /// Constructor.
- TAO_Storable_Bindings_Map (size_t hash_table_size,
- CORBA::ORB_ptr orb,
- const char* poa_id,PortableServer::POA_ptr poa);
+ TAO_Storable_Bindings_Map (size_t hash_table_size, CORBA::ORB_ptr orb);
/// Destructor.
virtual ~TAO_Storable_Bindings_Map (void);
@@ -110,10 +104,6 @@ public:
CORBA::Object_ptr & obj,
CosNaming::BindingType &type);
- virtual void Write(TAO_Writer_Base& wrtr);
-
- virtual const char * name();
-
private:
/// Helper: factors common code from <bind> and <rebind>.
@@ -128,9 +118,6 @@ private:
CORBA::ORB_ptr orb_;
- ACE_CString name_;
-
- PortableServer::POA_var poa_;
};
/**
@@ -164,15 +151,6 @@ public:
const ACE_TCHAR *persistence_directory,
size_t hash_table_size = ACE_DEFAULT_MAP_SIZE);
- /// Constructor.
- TAO_Storable_Naming_Context (CORBA::ORB_ptr orb,
- PortableServer::POA_ptr poa,
- const char *poa_id,
- TAO_Storable_Bindings_Map* bm,
- TAO_Naming_Service_Persistence_Factory *factory,
- const ACE_TCHAR *persistence_directory,
- size_t hash_table_size = ACE_DEFAULT_MAP_SIZE);
-
/// Destructor.
virtual ~TAO_Storable_Naming_Context (void);
@@ -190,7 +168,8 @@ public:
const char *poa_id,
size_t context_size,
TAO_Naming_Service_Persistence_Factory *factory,
- const ACE_TCHAR *persistence_directory
+ const ACE_TCHAR *persistence_directory,
+ TAO_Storable_Naming_Context **new_context
ACE_ENV_ARG_DECL);
// = Methods not implemented in TAO_Hash_Naming_Context.
@@ -202,7 +181,8 @@ public:
size_t context_size,
int reentering,
TAO_Naming_Service_Persistence_Factory *factory,
- const ACE_TCHAR *persistence_directory
+ const ACE_TCHAR *persistence_directory,
+ int use_redundancy
ACE_ENV_ARG_DECL);
@@ -301,8 +281,11 @@ public:
protected:
- /// Counter used for generation of POA ids for children Naming
+ /// Global counter used for generation of POA ids for children Naming
/// Contexts.
+ static ACE_UINT32 gcounter_;
+
+ /// Counter used for generation of transients
ACE_UINT32 counter_;
/**
@@ -316,13 +299,92 @@ protected:
CORBA::ORB_ptr orb_;
+ ACE_CString name_;
+
+ PortableServer::POA_var poa_;
+
TAO_Naming_Service_Persistence_Factory *factory_;
/// The directory in which to store the files
ACE_CString persistence_directory_;
- static CosNaming::NamingContext_ptr root_context_;
+ /// Save the hash table initial size
+ size_t hash_table_size_;
+
+ /// Disk time that match current memory state
+ time_t last_changed_;
+
+ /// Flag to tell use whether we are redundant or not
+ static int redundant_;
+
+ static const char * root_name_;
+
+ /// The pointer to the global file used to allocate new contexts
+ static TAO_Storable_Base *gfl_;
+
+/**
+ * @class File_Open_Lock_and_Check
+ *
+ * @brief Helper class for the TAO_Storable_Naming_Context.
+ *
+ * Guard class for the TAO_Storable_Naming_Context. It opens
+ * a file for read/write and sets a lock on it. It then checks
+ * if the file has changed and re-reads it if it has.
+ *
+ * The destructor insures that the lock gets released.
+ *
+ * <pre>
+ * How to use this class:
+ * File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw");
+ ACE_CHECK;
+ * </pre>
+ */
+class File_Open_Lock_and_Check
+{
+public:
+
+ /// Constructor - we always need the object which we guard.
+ File_Open_Lock_and_Check(TAO_Storable_Naming_Context * context,
+ const char * mode
+ ACE_ENV_ARG_DECL);
+
+ /// Destructor
+ ~File_Open_Lock_and_Check(void);
+
+ /// Releases the lock, closes the file, and deletes the I/O stream.
+ void release(void);
+
+ /// Returns the stream to read/write on
+ TAO_Storable_Base & peer(void);
+
+private:
+ /// Default constructor
+ File_Open_Lock_and_Check(void);
+
+ /// A flag to keep us from trying to close things more than once.
+ int closed_;
+
+ /// We need to save the pointer to our parent for cleaning up
+ TAO_Storable_Naming_Context * context_;
+
+ /// The pointer to the actual file I/O (bridge pattern)
+ TAO_Storable_Base *fl_;
+
+ /// The flags that we were opened with
+ int rwflags_;
+
+ /// Symbolic values for the flags in the above
+ enum{ mode_write = 1, mode_read = 2, mode_create = 4 };
+}; // end of embedded class File_Open_Lock_and_Check
+
+ friend class File_Open_Lock_and_Check;
+
+ int load_map(File_Open_Lock_and_Check *flck ACE_ENV_ARG_DECL);
+
+ void Write(TAO_Storable_Base& wrtr);
+
};
+
#include "ace/post.h"
#endif /* TAO_STORABLE_NAMING_CONTEXT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.cpp b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.cpp
new file mode 100644
index 00000000000..48edea3d915
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.cpp
@@ -0,0 +1,118 @@
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Storable_Naming_Context_Activator.h
+//
+// = AUTHOR
+// Byron Harris <harris_b@ociweb.com>
+//
+// ============================================================================
+
+#include "Storable_Naming_Context_Activator.h"
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+#include "Naming_Context_Interface.h"
+#include "Storable_Naming_Context.h"
+#include "Storable.h"
+#include "ace/Auto_Ptr.h"
+
+TAO_Storable_Naming_Context_Activator::
+TAO_Storable_Naming_Context_Activator (CORBA::ORB_ptr orb,
+ TAO_Naming_Service_Persistence_Factory *factory,
+ const ACE_TCHAR *persistence_directory,
+ size_t context_size)
+ : orb_(orb),
+ factory_(factory),
+ persistence_directory_(persistence_directory),
+ context_size_(context_size)
+{
+}
+
+TAO_Storable_Naming_Context_Activator::~TAO_Storable_Naming_Context_Activator ()
+{
+}
+
+PortableServer::Servant
+TAO_Storable_Naming_Context_Activator::incarnate (const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::ForwardRequest))
+{
+
+ // Make sure complete initialization has been done
+ ACE_ASSERT (factory_ != 0);
+
+ CORBA::String_var poa_id = PortableServer::ObjectId_to_string (oid);
+
+ // The approached used is to simply verify that there is a
+ // persistence element that exists that corresponds to the
+ // poa_id. If so, an empty context is created. Later, when the
+ // context is accessed it will be determined that the contents of
+ // the persistence elment needs to be read in.
+
+ // Does this already exist on disk?
+ ACE_CString file_name(persistence_directory_);
+ file_name += "/";
+ file_name += poa_id.in();
+ TAO_Storable_Base * fl = factory_->create_stream(file_name, "rw");
+ if (!fl->exists()) {
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ 0);
+ }
+
+ // Store the stub we will return here.
+ CosNaming::NamingContext_var result (CosNaming::NamingContext::_nil());
+
+ // Put together a servant for the new Naming Context.
+
+ TAO_Storable_Naming_Context *context_impl = 0;
+ ACE_NEW_THROW_EX (context_impl,
+ TAO_Storable_Naming_Context (orb_,
+ poa,
+ poa_id.in (),
+ factory_,
+ persistence_directory_,
+ context_size_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ // Put <context_impl> into the auto pointer temporarily, in case next
+ // allocation fails.
+ ACE_Auto_Basic_Ptr<TAO_Storable_Naming_Context> temp (context_impl);
+
+ TAO_Naming_Context *context = 0;
+ ACE_NEW_THROW_EX (context,
+ TAO_Naming_Context (context_impl),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ // Let <implementation> know about it's <interface>.
+ context_impl->interface (context);
+
+ // Release auto pointer, and start using reference counting to
+ // control our servant.
+ temp.release ();
+
+ return context;
+}
+
+void
+TAO_Storable_Naming_Context_Activator::etherealize (const PortableServer::ObjectId &/*oid*/,
+ PortableServer::POA_ptr /*adapter*/,
+ PortableServer::Servant servant,
+ CORBA::Boolean /*cleanup_in_progress*/,
+ CORBA::Boolean remaining_activations
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (!remaining_activations) {
+ delete servant;
+ }
+}
+
+#endif /* TAO_HAS_MINIMUM_POA */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.h b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.h
new file mode 100644
index 00000000000..159b5c2b2c1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.h
@@ -0,0 +1,83 @@
+/* -*- C++ -*- */
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Storable_Naming_Context_Activator.h
+//
+// = AUTHOR
+// Byron Harris <harris_b@ociweb.com>
+//
+// ============================================================================
+
+#ifndef TAO_STORABLE_NAMING_CONTEXT_ACTIVATOR_H
+#define TAO_STORABLE_NAMING_CONTEXT_ACTIVATOR_H
+#include "ace/pre.h"
+
+#include "tao/PortableServer/PortableServer.h"
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+
+#include "naming_export.h"
+
+class TAO_Naming_Service_Persistence_Factory;
+
+/**
+ * A servant activator to be use with a TAO_Storable_Naming_Context.
+ * Permits contexts saved to disk in one naming service process to be
+ * "lazily" created on demand in other processes by reading the
+ * context file off disk only when a request to the context is made.
+ */
+class TAO_Naming_Export TAO_Storable_Naming_Context_Activator :
+ public PortableServer::ServantActivator
+{
+public:
+
+ /**
+ * The constructor takes arguments needed to create a
+ * TAO_Storable_Naming_Context and TAO_Naming_Context on demand.
+ */
+ TAO_Storable_Naming_Context_Activator(CORBA::ORB_ptr orb,
+ TAO_Naming_Service_Persistence_Factory *factory,
+ const ACE_TCHAR *persistence_directory,
+ size_t context_size);
+
+ virtual ~TAO_Storable_Naming_Context_Activator();
+
+ /**
+ * Create a TAO_Storable_Naming_Context and TAO_Naming_Context on
+ * demand if a request to a naming context CORBA reference is made
+ * and the servant implementing this reference does not yet exist.
+ */
+ virtual PortableServer::Servant incarnate (const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::ForwardRequest));
+
+ /**
+ * Used by the POA to delete the servant created from a call to incarnate.
+ */
+ virtual void etherealize (const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr adapter,
+ PortableServer::Servant servant,
+ CORBA::Boolean cleanup_in_progress,
+ CORBA::Boolean remaining_activations
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+
+ CORBA::ORB_ptr orb_;
+ TAO_Naming_Service_Persistence_Factory *factory_;
+ const ACE_TCHAR *persistence_directory_;
+ size_t context_size_;
+};
+
+#endif /* TAO_HAS_MINIMUM_POA */
+
+#include "ace/post.h"
+#endif
diff --git a/TAO/orbsvcs/tests/Makefile b/TAO/orbsvcs/tests/Makefile
index d0e615f08eb..44e6548b585 100644
--- a/TAO/orbsvcs/tests/Makefile
+++ b/TAO/orbsvcs/tests/Makefile
@@ -17,7 +17,8 @@ include $(TAO_ROOT)/rules.tao.GNU
DIRS = \
- Simple_Naming
+ Simple_Naming \
+ Redundant_Naming
ifeq ($(corba_messaging),1)
DIRS += \
diff --git a/TAO/orbsvcs/tests/Makefile.am b/TAO/orbsvcs/tests/Makefile.am
index 7dd5d407b2a..c6fb1a658e6 100644
--- a/TAO/orbsvcs/tests/Makefile.am
+++ b/TAO/orbsvcs/tests/Makefile.am
@@ -29,6 +29,7 @@ SUBDIRS = \
Sched \
Sched_Conf \
Simple_Naming \
+ Redundant_Naming \
Simulator \
Time \
Trading \
diff --git a/TAO/orbsvcs/tests/Makefile.bor b/TAO/orbsvcs/tests/Makefile.bor
index 69553d90d9a..64467f11b8c 100644
--- a/TAO/orbsvcs/tests/Makefile.bor
+++ b/TAO/orbsvcs/tests/Makefile.bor
@@ -23,6 +23,7 @@ DIRS = \
Property \
Security \
Simple_Naming \
+ Redundant_Naming \
Time \
Trading \
Log
diff --git a/TAO/orbsvcs/tests/Redundant_Naming/Makefile b/TAO/orbsvcs/tests/Redundant_Naming/Makefile
new file mode 100644
index 00000000000..4d5608f0b32
--- /dev/null
+++ b/TAO/orbsvcs/tests/Redundant_Naming/Makefile
@@ -0,0 +1,998 @@
+#----------------------------------------------------------------------------
+#
+# $Id$
+#
+#----------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------
+# Local macros
+#----------------------------------------------------------------------------
+
+ifndef TAO_ROOT
+ TAO_ROOT = $(ACE_ROOT)/TAO
+endif
+
+LDLIBS = -lTAO_CosNaming -lTAO_Svc_Utils -lTAO_IORTable -lTAO_PortableServer -lTAO
+
+IDL_FILES = test_object
+IDL_SRC = test_objectC.cpp test_objectS.cpp
+CLIENT_SRC = client.cpp
+
+LSRC = $(IDL_SRC) $(CLIENT_SRC)
+
+CLIENT_OBJS = $(IDL_SRC:.cpp=.o) $(CLIENT_SRC:.cpp=.o)
+
+TEST_OBJECT_OBJS = test_objectC.o \
+ test_objectS.o \
+ client.o
+
+BIN2 = client
+
+TAO_IDLFLAGS += -Ge 1
+
+#### If the TAO orbsvcs library wasn't built with sufficient components,
+#### don't try to build here.
+TAO_ORBSVCS := $(shell sh $(ACE_ROOT)/bin/ace_components --orbsvcs)
+ifeq (Naming,$(findstring Naming,$(TAO_ORBSVCS)))
+ BIN = $(BIN2)
+endif # Naming
+
+#----------------------------------------------------------------------------
+# Include macros and targets
+#----------------------------------------------------------------------------
+
+include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU
+include $(ACE_ROOT)/include/makeinclude/macros.GNU
+include $(TAO_ROOT)/rules.tao.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.common.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
+include $(TAO_ROOT)/taoconfig.mk
+
+LDFLAGS += -L$(TAO_ROOT)/orbsvcs/orbsvcs -L$(TAO_ROOT)/tao
+CPPFLAGS += -I$(TAO_ROOT)/orbsvcs -I$(TAO_ROOT)
+
+client: $(addprefix $(VDIR),$(TEST_OBJECT_OBJS))
+ $(LINK.cc) $(LDFLAGS) -o $@ $^ $(VLDLIBS) $(POSTLINK)
+
+realclean:
+ -$(RM) test_objectC.* test_objectS* client
+
+#----------------------------------------------------------------------------
+# Dependencies
+#----------------------------------------------------------------------------
+
+# DO NOT DELETE THIS LINE -- g++dep uses it.
+# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
+
+
+.obj/test_objectC.o .obj/test_objectC.so .shobj/test_objectC.o .shobj/test_objectC.so: test_objectC.cpp test_objectC.h \
+ $(TAO_ROOT)/tao/corba.h \
+ $(ACE_ROOT)/ace/pre.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(TAO_ROOT)/tao/corbafwd.h \
+ $(ACE_ROOT)/ace/CDR_Base.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Errno.h \
+ $(ACE_ROOT)/ace/OS_Errno.inl \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Time_Value.h \
+ $(ACE_ROOT)/ace/Time_Value.inl \
+ $(ACE_ROOT)/ace/Default_Constants.h \
+ $(ACE_ROOT)/ace/Global_Macros.h \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ $(ACE_ROOT)/ace/Message_Block.i \
+ $(ACE_ROOT)/ace/Message_Block_T.h \
+ $(ACE_ROOT)/ace/Message_Block_T.i \
+ $(ACE_ROOT)/ace/Message_Block_T.cpp \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/CDR_Base.inl \
+ $(ACE_ROOT)/ace/CORBA_macros.h \
+ $(ACE_ROOT)/ace/Exception_Macros.h \
+ $(TAO_ROOT)/tao/orbconf.h \
+ $(TAO_ROOT)/tao/varbase.h \
+ $(TAO_ROOT)/tao/TAO_Export.h \
+ $(TAO_ROOT)/tao/corbafwd.i \
+ $(TAO_ROOT)/tao/Typecode.h \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/Synch.i \
+ $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h \
+ $(ACE_ROOT)/ace/Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.inl \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(TAO_ROOT)/tao/Exception.h \
+ $(ACE_ROOT)/ace/SString.h \
+ $(ACE_ROOT)/ace/String_Base.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/Flag_Manip.h \
+ $(ACE_ROOT)/ace/Flag_Manip.i \
+ $(ACE_ROOT)/ace/Handle_Ops.h \
+ $(ACE_ROOT)/ace/Handle_Ops.i \
+ $(ACE_ROOT)/ace/Lib_Find.h \
+ $(ACE_ROOT)/ace/Lib_Find.i \
+ $(ACE_ROOT)/ace/Init_ACE.h \
+ $(ACE_ROOT)/ace/Init_ACE.i \
+ $(ACE_ROOT)/ace/Sock_Connect.h \
+ $(ACE_ROOT)/ace/Sock_Connect.i \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/String_Base_Const.h \
+ $(ACE_ROOT)/ace/String_Base.i \
+ $(ACE_ROOT)/ace/String_Base.cpp \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Malloc_Allocator.h \
+ $(ACE_ROOT)/ace/Malloc_Allocator.i \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Unbounded_Set.h \
+ $(ACE_ROOT)/ace/Node.h \
+ $(ACE_ROOT)/ace/Node.cpp \
+ $(ACE_ROOT)/ace/Unbounded_Set.inl \
+ $(ACE_ROOT)/ace/Unbounded_Set.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Auto_Ptr.h \
+ $(ACE_ROOT)/ace/Auto_Ptr.i \
+ $(ACE_ROOT)/ace/Auto_Ptr.cpp \
+ $(ACE_ROOT)/ace/SString.i \
+ $(TAO_ROOT)/tao/Exception.i \
+ $(TAO_ROOT)/tao/Typecode.i \
+ $(TAO_ROOT)/tao/Any.h \
+ $(TAO_ROOT)/tao/CDR.h \
+ $(ACE_ROOT)/ace/CDR_Stream.h \
+ $(ACE_ROOT)/ace/CDR_Stream.i \
+ $(TAO_ROOT)/tao/CDR.i \
+ $(TAO_ROOT)/tao/Environment.h \
+ $(TAO_ROOT)/tao/Environment.i \
+ $(TAO_ROOT)/tao/Object.h \
+ $(TAO_ROOT)/tao/Policy_ForwardC.h \
+ $(TAO_ROOT)/tao/Sequence.h \
+ $(TAO_ROOT)/tao/Managed_Types.h \
+ $(TAO_ROOT)/tao/Managed_Types.i \
+ $(TAO_ROOT)/tao/Sequence.i \
+ $(TAO_ROOT)/tao/Sequence_T.h \
+ $(TAO_ROOT)/tao/Sequence_T.i \
+ $(TAO_ROOT)/tao/Sequence_T.cpp \
+ $(TAO_ROOT)/tao/Policy_ForwardC.i \
+ $(TAO_ROOT)/tao/Object.i \
+ $(TAO_ROOT)/tao/Any.i \
+ $(TAO_ROOT)/tao/NVList.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.inl \
+ $(ACE_ROOT)/ace/Unbounded_Queue.cpp \
+ $(TAO_ROOT)/tao/NVList.i \
+ $(TAO_ROOT)/tao/LocalObject.h \
+ $(TAO_ROOT)/tao/LocalObject.i \
+ $(TAO_ROOT)/tao/Principal.h \
+ $(TAO_ROOT)/tao/OctetSeqC.h \
+ $(TAO_ROOT)/tao/OctetSeqC.i \
+ $(TAO_ROOT)/tao/Principal.i \
+ $(TAO_ROOT)/tao/ORB.h \
+ $(TAO_ROOT)/tao/CORBA_String.h \
+ $(TAO_ROOT)/tao/CORBA_String.inl \
+ $(TAO_ROOT)/tao/objectid.h \
+ $(TAO_ROOT)/tao/PolicyC.h \
+ $(TAO_ROOT)/tao/CurrentC.h \
+ $(TAO_ROOT)/tao/CurrentC.i \
+ $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/Encodable.h \
+ $(TAO_ROOT)/tao/PolicyC.i \
+ $(TAO_ROOT)/tao/ORB.i \
+ $(TAO_ROOT)/tao/BoundsC.h \
+ $(TAO_ROOT)/tao/BoundsC.i \
+ $(TAO_ROOT)/tao/Valuetype/ValueBase.h \
+ $(TAO_ROOT)/tao/Valuetype/ValueBase.inl \
+ $(TAO_ROOT)/tao/Valuetype/ValueFactory.h \
+ $(TAO_ROOT)/tao/Valuetype/ValueFactory.inl \
+ $(TAO_ROOT)/tao/Valuetype/AbstractBase.h \
+ $(TAO_ROOT)/tao/Valuetype/AbstractBase.inl \
+ $(TAO_ROOT)/tao/DomainC.h \
+ $(TAO_ROOT)/tao/DomainC.i \
+ $(TAO_ROOT)/tao/WrongTransactionC.h \
+ $(TAO_ROOT)/tao/WrongTransactionC.i \
+ $(TAO_ROOT)/tao/Object_KeyC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.i \
+ $(TAO_ROOT)/tao/StringSeqC.h \
+ $(TAO_ROOT)/tao/StringSeqC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.h \
+ $(TAO_ROOT)/tao/DynamicC.h \
+ $(TAO_ROOT)/tao/DynamicC.i \
+ $(TAO_ROOT)/tao/ObjRefTemplate/ObjectReferenceTemplateC.h \
+ $(TAO_ROOT)/tao/ObjRefTemplate/ObjectReferenceTemplateC.i \
+ $(TAO_ROOT)/tao/Messaging_SyncScopeC.h \
+ $(TAO_ROOT)/tao/Messaging_SyncScopeC.i \
+ $(TAO_ROOT)/tao/IOPC.h \
+ $(TAO_ROOT)/tao/IOPC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.i \
+ test_objectC.i $(TAO_ROOT)/tao/Stub.h \
+ $(TAO_ROOT)/tao/MProfile.h \
+ $(TAO_ROOT)/tao/MProfile.i \
+ $(TAO_ROOT)/tao/ORB_Core.h \
+ $(TAO_ROOT)/tao/Policy_Manager.h \
+ $(TAO_ROOT)/tao/Policy_Set.h \
+ $(TAO_ROOT)/tao/Policy_Set.i \
+ $(TAO_ROOT)/tao/debug.h \
+ $(TAO_ROOT)/tao/Policy_Manager.i \
+ $(TAO_ROOT)/tao/Resource_Factory.h \
+ $(ACE_ROOT)/ace/Service_Object.h \
+ $(ACE_ROOT)/ace/Shared_Object.h \
+ $(ACE_ROOT)/ace/Shared_Object.i \
+ $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \
+ $(ACE_ROOT)/ace/DLL.h \
+ $(ACE_ROOT)/ace/Service_Object.i \
+ $(TAO_ROOT)/tao/params.h \
+ $(TAO_ROOT)/tao/params.i \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.inl \
+ $(TAO_ROOT)/tao/TAO_Singleton.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.inl \
+ $(TAO_ROOT)/tao/TAO_Singleton.cpp \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
+ $(TAO_ROOT)/tao/Adapter.h \
+ $(TAO_ROOT)/tao/Adapter.i \
+ $(TAO_ROOT)/tao/PolicyFactory_Registry.h \
+ $(ACE_ROOT)/ace/Map_Manager.h \
+ $(ACE_ROOT)/ace/Map_Manager.i \
+ $(ACE_ROOT)/ace/Map_Manager.cpp \
+ $(ACE_ROOT)/ace/Service_Config.h \
+ $(ACE_ROOT)/ace/Service_Types.h \
+ $(ACE_ROOT)/ace/Service_Types.i \
+ $(ACE_ROOT)/ace/XML_Svc_Conf.h \
+ $(ACE_ROOT)/ace/Service_Config.i \
+ $(ACE_ROOT)/ace/Reactor.h \
+ $(ACE_ROOT)/ace/Handle_Set.h \
+ $(ACE_ROOT)/ace/Handle_Set.i \
+ $(ACE_ROOT)/ace/Timer_Queue.h \
+ $(ACE_ROOT)/ace/Timer_Queue_T.h \
+ $(ACE_ROOT)/ace/Test_and_Set.h \
+ $(ACE_ROOT)/ace/Test_and_Set.i \
+ $(ACE_ROOT)/ace/Test_and_Set.cpp \
+ $(ACE_ROOT)/ace/Timer_Queue_T.i \
+ $(ACE_ROOT)/ace/Timer_Queue_T.cpp \
+ $(ACE_ROOT)/ace/Reactor.i \
+ $(ACE_ROOT)/ace/Reactor_Impl.h \
+ $(TAO_ROOT)/tao/Parser_Registry.h \
+ $(TAO_ROOT)/tao/Parser_Registry.i \
+ $(TAO_ROOT)/tao/Service_Callbacks.h \
+ $(TAO_ROOT)/tao/Service_Callbacks.i \
+ $(TAO_ROOT)/tao/Fault_Tolerance_Service.h \
+ $(TAO_ROOT)/tao/Fault_Tolerance_Service.i \
+ $(TAO_ROOT)/tao/Cleanup_Func_Registry.h \
+ $(ACE_ROOT)/ace/Array_Base.h \
+ $(ACE_ROOT)/ace/Array_Base.inl \
+ $(ACE_ROOT)/ace/Array_Base.cpp \
+ $(TAO_ROOT)/tao/Cleanup_Func_Registry.inl \
+ $(TAO_ROOT)/tao/Object_Ref_Table.h \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \
+ $(ACE_ROOT)/ace/Functor.h \
+ $(ACE_ROOT)/ace/Functor.i \
+ $(ACE_ROOT)/ace/Functor_T.h \
+ $(ACE_ROOT)/ace/Functor_T.i \
+ $(ACE_ROOT)/ace/Functor_T.cpp \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \
+ $(TAO_ROOT)/tao/Interceptor_List.h \
+ $(TAO_ROOT)/tao/Interceptor_List.inl \
+ $(TAO_ROOT)/tao/PICurrent.h \
+ $(TAO_ROOT)/tao/PICurrent.inl \
+ $(ACE_ROOT)/ace/Thread_Manager.h \
+ $(ACE_ROOT)/ace/Thread_Exit.h \
+ $(ACE_ROOT)/ace/Thread_Control.h \
+ $(ACE_ROOT)/ace/Thread_Control.inl \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(ACE_ROOT)/ace/Framework_Component.h \
+ $(ACE_ROOT)/ace/Framework_Component.inl \
+ $(ACE_ROOT)/ace/Framework_Component_T.h \
+ $(ACE_ROOT)/ace/Framework_Component_T.inl \
+ $(ACE_ROOT)/ace/Framework_Component_T.cpp \
+ $(ACE_ROOT)/ace/Thread_Manager.i \
+ $(TAO_ROOT)/tao/ORB_Core.i \
+ $(TAO_ROOT)/tao/Stub.i \
+ $(TAO_ROOT)/tao/Invocation.h \
+ $(TAO_ROOT)/tao/Synch_Reply_Dispatcher.h \
+ $(TAO_ROOT)/tao/Reply_Dispatcher.h \
+ $(TAO_ROOT)/tao/Condition.h \
+ $(TAO_ROOT)/tao/Condition.inl \
+ $(TAO_ROOT)/tao/Condition.cpp \
+ $(TAO_ROOT)/tao/Reply_Dispatcher.i \
+ $(TAO_ROOT)/tao/LF_Invocation_Event.h \
+ $(TAO_ROOT)/tao/LF_Event.h \
+ $(TAO_ROOT)/tao/LF_Event.inl \
+ $(TAO_ROOT)/tao/LF_Invocation_Event.inl \
+ $(TAO_ROOT)/tao/GIOP_Message_Version.h \
+ $(TAO_ROOT)/tao/GIOP_Message_Version.inl \
+ $(TAO_ROOT)/tao/operation_details.h \
+ $(TAO_ROOT)/tao/Service_Context.h \
+ $(TAO_ROOT)/tao/Service_Context.inl \
+ $(TAO_ROOT)/tao/target_specification.h \
+ $(TAO_ROOT)/tao/target_specification.i \
+ $(TAO_ROOT)/tao/operation_details.i \
+ $(TAO_ROOT)/tao/Invocation.i \
+ $(TAO_ROOT)/tao/PortableInterceptor.h \
+ $(TAO_ROOT)/tao/RequestInfo_Util.h \
+ $(TAO_ROOT)/tao/ClientRequestInfo_i.h \
+ $(TAO_ROOT)/tao/ClientRequestInfo_i.inl \
+ $(TAO_ROOT)/tao/ClientInterceptorAdapter.h \
+ $(TAO_ROOT)/tao/ClientInterceptorAdapter.inl
+
+.obj/test_objectS.o .obj/test_objectS.so .shobj/test_objectS.o .shobj/test_objectS.so: test_objectS.cpp test_objectS.h test_objectC.h \
+ $(TAO_ROOT)/tao/corba.h \
+ $(ACE_ROOT)/ace/pre.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(TAO_ROOT)/tao/corbafwd.h \
+ $(ACE_ROOT)/ace/CDR_Base.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Errno.h \
+ $(ACE_ROOT)/ace/OS_Errno.inl \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Time_Value.h \
+ $(ACE_ROOT)/ace/Time_Value.inl \
+ $(ACE_ROOT)/ace/Default_Constants.h \
+ $(ACE_ROOT)/ace/Global_Macros.h \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ $(ACE_ROOT)/ace/Message_Block.i \
+ $(ACE_ROOT)/ace/Message_Block_T.h \
+ $(ACE_ROOT)/ace/Message_Block_T.i \
+ $(ACE_ROOT)/ace/Message_Block_T.cpp \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/CDR_Base.inl \
+ $(ACE_ROOT)/ace/CORBA_macros.h \
+ $(ACE_ROOT)/ace/Exception_Macros.h \
+ $(TAO_ROOT)/tao/orbconf.h \
+ $(TAO_ROOT)/tao/varbase.h \
+ $(TAO_ROOT)/tao/TAO_Export.h \
+ $(TAO_ROOT)/tao/corbafwd.i \
+ $(TAO_ROOT)/tao/Typecode.h \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/Synch.i \
+ $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h \
+ $(ACE_ROOT)/ace/Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.inl \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(TAO_ROOT)/tao/Exception.h \
+ $(ACE_ROOT)/ace/SString.h \
+ $(ACE_ROOT)/ace/String_Base.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/Flag_Manip.h \
+ $(ACE_ROOT)/ace/Flag_Manip.i \
+ $(ACE_ROOT)/ace/Handle_Ops.h \
+ $(ACE_ROOT)/ace/Handle_Ops.i \
+ $(ACE_ROOT)/ace/Lib_Find.h \
+ $(ACE_ROOT)/ace/Lib_Find.i \
+ $(ACE_ROOT)/ace/Init_ACE.h \
+ $(ACE_ROOT)/ace/Init_ACE.i \
+ $(ACE_ROOT)/ace/Sock_Connect.h \
+ $(ACE_ROOT)/ace/Sock_Connect.i \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/String_Base_Const.h \
+ $(ACE_ROOT)/ace/String_Base.i \
+ $(ACE_ROOT)/ace/String_Base.cpp \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Malloc_Allocator.h \
+ $(ACE_ROOT)/ace/Malloc_Allocator.i \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Unbounded_Set.h \
+ $(ACE_ROOT)/ace/Node.h \
+ $(ACE_ROOT)/ace/Node.cpp \
+ $(ACE_ROOT)/ace/Unbounded_Set.inl \
+ $(ACE_ROOT)/ace/Unbounded_Set.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Auto_Ptr.h \
+ $(ACE_ROOT)/ace/Auto_Ptr.i \
+ $(ACE_ROOT)/ace/Auto_Ptr.cpp \
+ $(ACE_ROOT)/ace/SString.i \
+ $(TAO_ROOT)/tao/Exception.i \
+ $(TAO_ROOT)/tao/Typecode.i \
+ $(TAO_ROOT)/tao/Any.h \
+ $(TAO_ROOT)/tao/CDR.h \
+ $(ACE_ROOT)/ace/CDR_Stream.h \
+ $(ACE_ROOT)/ace/CDR_Stream.i \
+ $(TAO_ROOT)/tao/CDR.i \
+ $(TAO_ROOT)/tao/Environment.h \
+ $(TAO_ROOT)/tao/Environment.i \
+ $(TAO_ROOT)/tao/Object.h \
+ $(TAO_ROOT)/tao/Policy_ForwardC.h \
+ $(TAO_ROOT)/tao/Sequence.h \
+ $(TAO_ROOT)/tao/Managed_Types.h \
+ $(TAO_ROOT)/tao/Managed_Types.i \
+ $(TAO_ROOT)/tao/Sequence.i \
+ $(TAO_ROOT)/tao/Sequence_T.h \
+ $(TAO_ROOT)/tao/Sequence_T.i \
+ $(TAO_ROOT)/tao/Sequence_T.cpp \
+ $(TAO_ROOT)/tao/Policy_ForwardC.i \
+ $(TAO_ROOT)/tao/Object.i \
+ $(TAO_ROOT)/tao/Any.i \
+ $(TAO_ROOT)/tao/NVList.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.inl \
+ $(ACE_ROOT)/ace/Unbounded_Queue.cpp \
+ $(TAO_ROOT)/tao/NVList.i \
+ $(TAO_ROOT)/tao/LocalObject.h \
+ $(TAO_ROOT)/tao/LocalObject.i \
+ $(TAO_ROOT)/tao/Principal.h \
+ $(TAO_ROOT)/tao/OctetSeqC.h \
+ $(TAO_ROOT)/tao/OctetSeqC.i \
+ $(TAO_ROOT)/tao/Principal.i \
+ $(TAO_ROOT)/tao/ORB.h \
+ $(TAO_ROOT)/tao/CORBA_String.h \
+ $(TAO_ROOT)/tao/CORBA_String.inl \
+ $(TAO_ROOT)/tao/objectid.h \
+ $(TAO_ROOT)/tao/PolicyC.h \
+ $(TAO_ROOT)/tao/CurrentC.h \
+ $(TAO_ROOT)/tao/CurrentC.i \
+ $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/Encodable.h \
+ $(TAO_ROOT)/tao/PolicyC.i \
+ $(TAO_ROOT)/tao/ORB.i \
+ $(TAO_ROOT)/tao/BoundsC.h \
+ $(TAO_ROOT)/tao/BoundsC.i \
+ $(TAO_ROOT)/tao/Valuetype/ValueBase.h \
+ $(TAO_ROOT)/tao/Valuetype/ValueBase.inl \
+ $(TAO_ROOT)/tao/Valuetype/ValueFactory.h \
+ $(TAO_ROOT)/tao/Valuetype/ValueFactory.inl \
+ $(TAO_ROOT)/tao/Valuetype/AbstractBase.h \
+ $(TAO_ROOT)/tao/Valuetype/AbstractBase.inl \
+ $(TAO_ROOT)/tao/DomainC.h \
+ $(TAO_ROOT)/tao/DomainC.i \
+ $(TAO_ROOT)/tao/WrongTransactionC.h \
+ $(TAO_ROOT)/tao/WrongTransactionC.i \
+ $(TAO_ROOT)/tao/Object_KeyC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.i \
+ $(TAO_ROOT)/tao/StringSeqC.h \
+ $(TAO_ROOT)/tao/StringSeqC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.h \
+ $(TAO_ROOT)/tao/DynamicC.h \
+ $(TAO_ROOT)/tao/DynamicC.i \
+ $(TAO_ROOT)/tao/ObjRefTemplate/ObjectReferenceTemplateC.h \
+ $(TAO_ROOT)/tao/ObjRefTemplate/ObjectReferenceTemplateC.i \
+ $(TAO_ROOT)/tao/Messaging_SyncScopeC.h \
+ $(TAO_ROOT)/tao/Messaging_SyncScopeC.i \
+ $(TAO_ROOT)/tao/IOPC.h \
+ $(TAO_ROOT)/tao/IOPC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.i \
+ test_objectC.i \
+ $(TAO_ROOT)/tao/PortableServer/PortableServer.h \
+ $(TAO_ROOT)/tao/PortableServer/portableserver_export.h \
+ $(TAO_ROOT)/tao/PortableServer/PortableServerC.h \
+ $(TAO_ROOT)/tao/PortableServer/PortableServerC.i \
+ $(TAO_ROOT)/tao/PortableServer/Servant_Base.h \
+ $(TAO_ROOT)/tao/Abstract_Servant_Base.h \
+ $(ACE_ROOT)/ace/Atomic_Op.h \
+ $(ACE_ROOT)/ace/Atomic_Op_T.h \
+ $(ACE_ROOT)/ace/Atomic_Op_T.i \
+ $(ACE_ROOT)/ace/Atomic_Op_T.cpp \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(TAO_ROOT)/tao/PortableServer/Servant_Base.i \
+ $(TAO_ROOT)/tao/PortableServer/Collocated_Object.h \
+ $(TAO_ROOT)/tao/PortableServer/Collocated_Object.i \
+ $(TAO_ROOT)/tao/PortableServer/ThruPOA_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/PortableServer/Direct_Object_Proxy_Impl.h \
+ test_objectS_T.h test_objectS_T.i test_objectS_T.cpp test_objectS.i \
+ $(TAO_ROOT)/tao/PortableServer/Object_Adapter.h \
+ $(TAO_ROOT)/tao/PortableServer/Key_Adapters.h \
+ $(ACE_ROOT)/ace/Map_T.h \
+ $(ACE_ROOT)/ace/Pair_T.h \
+ $(ACE_ROOT)/ace/Pair_T.i \
+ $(ACE_ROOT)/ace/Pair_T.cpp \
+ $(ACE_ROOT)/ace/Map_Manager.h \
+ $(ACE_ROOT)/ace/Map_Manager.i \
+ $(ACE_ROOT)/ace/Map_Manager.cpp \
+ $(ACE_ROOT)/ace/Service_Config.h \
+ $(ACE_ROOT)/ace/Service_Types.h \
+ $(ACE_ROOT)/ace/Service_Object.h \
+ $(ACE_ROOT)/ace/Shared_Object.h \
+ $(ACE_ROOT)/ace/Shared_Object.i \
+ $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \
+ $(ACE_ROOT)/ace/DLL.h \
+ $(ACE_ROOT)/ace/Service_Object.i \
+ $(ACE_ROOT)/ace/Service_Types.i \
+ $(ACE_ROOT)/ace/XML_Svc_Conf.h \
+ $(ACE_ROOT)/ace/Service_Config.i \
+ $(ACE_ROOT)/ace/Reactor.h \
+ $(ACE_ROOT)/ace/Handle_Set.h \
+ $(ACE_ROOT)/ace/Handle_Set.i \
+ $(ACE_ROOT)/ace/Timer_Queue.h \
+ $(ACE_ROOT)/ace/Timer_Queue_T.h \
+ $(ACE_ROOT)/ace/Test_and_Set.h \
+ $(ACE_ROOT)/ace/Test_and_Set.i \
+ $(ACE_ROOT)/ace/Test_and_Set.cpp \
+ $(ACE_ROOT)/ace/Timer_Queue_T.i \
+ $(ACE_ROOT)/ace/Timer_Queue_T.cpp \
+ $(ACE_ROOT)/ace/Reactor.i \
+ $(ACE_ROOT)/ace/Reactor_Impl.h \
+ $(ACE_ROOT)/ace/Hash_Map_Manager.h \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \
+ $(ACE_ROOT)/ace/Functor.h \
+ $(ACE_ROOT)/ace/Functor.i \
+ $(ACE_ROOT)/ace/Functor_T.h \
+ $(ACE_ROOT)/ace/Functor_T.i \
+ $(ACE_ROOT)/ace/Functor_T.cpp \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \
+ $(ACE_ROOT)/ace/Active_Map_Manager.h \
+ $(ACE_ROOT)/ace/Active_Map_Manager.i \
+ $(ACE_ROOT)/ace/Active_Map_Manager_T.h \
+ $(ACE_ROOT)/ace/Active_Map_Manager_T.i \
+ $(ACE_ROOT)/ace/Active_Map_Manager_T.cpp \
+ $(ACE_ROOT)/ace/Map_T.i \
+ $(ACE_ROOT)/ace/Map_T.cpp \
+ $(TAO_ROOT)/tao/PortableServer/Key_Adapters.i \
+ $(TAO_ROOT)/tao/PortableServer/poa_macros.h \
+ $(TAO_ROOT)/tao/PortableServer/Active_Object_Map.h \
+ $(TAO_ROOT)/tao/Server_Strategy_Factory.h \
+ $(TAO_ROOT)/tao/PortableServer/Active_Object_Map.i \
+ $(TAO_ROOT)/tao/Adapter.h \
+ $(TAO_ROOT)/tao/Adapter.i \
+ $(TAO_ROOT)/tao/PortableServer/Default_Policy_Validator.h \
+ $(TAO_ROOT)/tao/Policy_Validator.h \
+ $(TAO_ROOT)/tao/PortableServer/POA_Policy_Set.h \
+ $(TAO_ROOT)/tao/PortableServer/POA_Policies.h \
+ $(TAO_ROOT)/tao/PortableServer/POA_Policies.i \
+ $(TAO_ROOT)/tao/Policy_Set.h \
+ $(TAO_ROOT)/tao/Policy_Set.i \
+ $(TAO_ROOT)/tao/PortableServer/POA_Policy_Set.i \
+ $(TAO_ROOT)/tao/PortableServer/Object_Adapter.i \
+ $(TAO_ROOT)/tao/PortableServer/Operation_Table.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.h \
+ $(TAO_ROOT)/tao/TAO_Singleton.inl \
+ $(TAO_ROOT)/tao/TAO_Singleton.cpp \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \
+ $(TAO_ROOT)/tao/TAO_Singleton_Manager.inl \
+ $(TAO_ROOT)/tao/TAO_Server_Request.h \
+ $(TAO_ROOT)/tao/Tagged_Profile.h \
+ $(TAO_ROOT)/tao/GIOPC.h \
+ $(TAO_ROOT)/tao/GIOPC.i \
+ $(TAO_ROOT)/tao/Tagged_Profile.i \
+ $(TAO_ROOT)/tao/Service_Context.h \
+ $(TAO_ROOT)/tao/Service_Context.inl \
+ $(TAO_ROOT)/tao/PICurrent.h \
+ $(ACE_ROOT)/ace/Array_Base.h \
+ $(ACE_ROOT)/ace/Array_Base.inl \
+ $(ACE_ROOT)/ace/Array_Base.cpp \
+ $(TAO_ROOT)/tao/PICurrent.inl \
+ $(TAO_ROOT)/tao/TAO_Server_Request.i \
+ $(TAO_ROOT)/tao/ORB_Core.h \
+ $(TAO_ROOT)/tao/Policy_Manager.h \
+ $(TAO_ROOT)/tao/debug.h \
+ $(TAO_ROOT)/tao/Policy_Manager.i \
+ $(TAO_ROOT)/tao/Resource_Factory.h \
+ $(TAO_ROOT)/tao/params.h \
+ $(TAO_ROOT)/tao/params.i \
+ $(TAO_ROOT)/tao/PolicyFactory_Registry.h \
+ $(TAO_ROOT)/tao/Parser_Registry.h \
+ $(TAO_ROOT)/tao/Parser_Registry.i \
+ $(TAO_ROOT)/tao/Service_Callbacks.h \
+ $(TAO_ROOT)/tao/Service_Callbacks.i \
+ $(TAO_ROOT)/tao/Fault_Tolerance_Service.h \
+ $(TAO_ROOT)/tao/Fault_Tolerance_Service.i \
+ $(TAO_ROOT)/tao/Cleanup_Func_Registry.h \
+ $(TAO_ROOT)/tao/Cleanup_Func_Registry.inl \
+ $(TAO_ROOT)/tao/Object_Ref_Table.h \
+ $(TAO_ROOT)/tao/Interceptor_List.h \
+ $(TAO_ROOT)/tao/Interceptor_List.inl \
+ $(ACE_ROOT)/ace/Thread_Manager.h \
+ $(ACE_ROOT)/ace/Thread_Exit.h \
+ $(ACE_ROOT)/ace/Thread_Control.h \
+ $(ACE_ROOT)/ace/Thread_Control.inl \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(ACE_ROOT)/ace/Framework_Component.h \
+ $(ACE_ROOT)/ace/Framework_Component.inl \
+ $(ACE_ROOT)/ace/Framework_Component_T.h \
+ $(ACE_ROOT)/ace/Framework_Component_T.inl \
+ $(ACE_ROOT)/ace/Framework_Component_T.cpp \
+ $(ACE_ROOT)/ace/Thread_Manager.i \
+ $(TAO_ROOT)/tao/ORB_Core.i \
+ $(TAO_ROOT)/tao/Stub.h \
+ $(TAO_ROOT)/tao/MProfile.h \
+ $(TAO_ROOT)/tao/MProfile.i \
+ $(TAO_ROOT)/tao/Stub.i \
+ $(TAO_ROOT)/tao/IFR_Client_Adapter.h \
+ $(TAO_ROOT)/tao/PortableInterceptor.h \
+ $(TAO_ROOT)/tao/RequestInfo_Util.h \
+ $(TAO_ROOT)/tao/PortableServer/ServerRequestInfo.h \
+ $(TAO_ROOT)/tao/PortableServer/ServerRequestInfo.inl \
+ $(TAO_ROOT)/tao/PortableServer/ServerInterceptorAdapter.h \
+ $(TAO_ROOT)/tao/PortableServer/ServerInterceptorAdapter.inl \
+ $(ACE_ROOT)/ace/Dynamic_Service.h \
+ $(ACE_ROOT)/ace/Dynamic_Service_Base.h \
+ $(ACE_ROOT)/ace/Dynamic_Service.i \
+ $(ACE_ROOT)/ace/Dynamic_Service.cpp
+
+.obj/client.o .obj/client.so .shobj/client.o .shobj/client.so: client.cpp test_objectS.h test_objectC.h \
+ $(TAO_ROOT)/tao/corba.h \
+ $(ACE_ROOT)/ace/pre.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(TAO_ROOT)/tao/corbafwd.h \
+ $(ACE_ROOT)/ace/CDR_Base.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Errno.h \
+ $(ACE_ROOT)/ace/OS_Errno.inl \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Time_Value.h \
+ $(ACE_ROOT)/ace/Time_Value.inl \
+ $(ACE_ROOT)/ace/Default_Constants.h \
+ $(ACE_ROOT)/ace/Global_Macros.h \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ $(ACE_ROOT)/ace/Message_Block.i \
+ $(ACE_ROOT)/ace/Message_Block_T.h \
+ $(ACE_ROOT)/ace/Message_Block_T.i \
+ $(ACE_ROOT)/ace/Message_Block_T.cpp \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/CDR_Base.inl \
+ $(ACE_ROOT)/ace/CORBA_macros.h \
+ $(ACE_ROOT)/ace/Exception_Macros.h \
+ $(TAO_ROOT)/tao/orbconf.h \
+ $(TAO_ROOT)/tao/varbase.h \
+ $(TAO_ROOT)/tao/TAO_Export.h \
+ $(TAO_ROOT)/tao/corbafwd.i \
+ $(TAO_ROOT)/tao/Typecode.h \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/Synch.i \
+ $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h \
+ $(ACE_ROOT)/ace/Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \
+ $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.inl \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(TAO_ROOT)/tao/Exception.h \
+ $(ACE_ROOT)/ace/SString.h \
+ $(ACE_ROOT)/ace/String_Base.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/Flag_Manip.h \
+ $(ACE_ROOT)/ace/Flag_Manip.i \
+ $(ACE_ROOT)/ace/Handle_Ops.h \
+ $(ACE_ROOT)/ace/Handle_Ops.i \
+ $(ACE_ROOT)/ace/Lib_Find.h \
+ $(ACE_ROOT)/ace/Lib_Find.i \
+ $(ACE_ROOT)/ace/Init_ACE.h \
+ $(ACE_ROOT)/ace/Init_ACE.i \
+ $(ACE_ROOT)/ace/Sock_Connect.h \
+ $(ACE_ROOT)/ace/Sock_Connect.i \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/String_Base_Const.h \
+ $(ACE_ROOT)/ace/String_Base.i \
+ $(ACE_ROOT)/ace/String_Base.cpp \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Malloc_Allocator.h \
+ $(ACE_ROOT)/ace/Malloc_Allocator.i \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Unbounded_Set.h \
+ $(ACE_ROOT)/ace/Node.h \
+ $(ACE_ROOT)/ace/Node.cpp \
+ $(ACE_ROOT)/ace/Unbounded_Set.inl \
+ $(ACE_ROOT)/ace/Unbounded_Set.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Auto_Ptr.h \
+ $(ACE_ROOT)/ace/Auto_Ptr.i \
+ $(ACE_ROOT)/ace/Auto_Ptr.cpp \
+ $(ACE_ROOT)/ace/SString.i \
+ $(TAO_ROOT)/tao/Exception.i \
+ $(TAO_ROOT)/tao/Typecode.i \
+ $(TAO_ROOT)/tao/Any.h \
+ $(TAO_ROOT)/tao/CDR.h \
+ $(ACE_ROOT)/ace/CDR_Stream.h \
+ $(ACE_ROOT)/ace/CDR_Stream.i \
+ $(TAO_ROOT)/tao/CDR.i \
+ $(TAO_ROOT)/tao/Environment.h \
+ $(TAO_ROOT)/tao/Environment.i \
+ $(TAO_ROOT)/tao/Object.h \
+ $(TAO_ROOT)/tao/Policy_ForwardC.h \
+ $(TAO_ROOT)/tao/Sequence.h \
+ $(TAO_ROOT)/tao/Managed_Types.h \
+ $(TAO_ROOT)/tao/Managed_Types.i \
+ $(TAO_ROOT)/tao/Sequence.i \
+ $(TAO_ROOT)/tao/Sequence_T.h \
+ $(TAO_ROOT)/tao/Sequence_T.i \
+ $(TAO_ROOT)/tao/Sequence_T.cpp \
+ $(TAO_ROOT)/tao/Policy_ForwardC.i \
+ $(TAO_ROOT)/tao/Object.i \
+ $(TAO_ROOT)/tao/Any.i \
+ $(TAO_ROOT)/tao/NVList.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.h \
+ $(ACE_ROOT)/ace/Unbounded_Queue.inl \
+ $(ACE_ROOT)/ace/Unbounded_Queue.cpp \
+ $(TAO_ROOT)/tao/NVList.i \
+ $(TAO_ROOT)/tao/LocalObject.h \
+ $(TAO_ROOT)/tao/LocalObject.i \
+ $(TAO_ROOT)/tao/Principal.h \
+ $(TAO_ROOT)/tao/OctetSeqC.h \
+ $(TAO_ROOT)/tao/OctetSeqC.i \
+ $(TAO_ROOT)/tao/Principal.i \
+ $(TAO_ROOT)/tao/ORB.h \
+ $(TAO_ROOT)/tao/CORBA_String.h \
+ $(TAO_ROOT)/tao/CORBA_String.inl \
+ $(TAO_ROOT)/tao/objectid.h \
+ $(TAO_ROOT)/tao/PolicyC.h \
+ $(TAO_ROOT)/tao/CurrentC.h \
+ $(TAO_ROOT)/tao/CurrentC.i \
+ $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/Encodable.h \
+ $(TAO_ROOT)/tao/PolicyC.i \
+ $(TAO_ROOT)/tao/ORB.i \
+ $(TAO_ROOT)/tao/BoundsC.h \
+ $(TAO_ROOT)/tao/BoundsC.i \
+ $(TAO_ROOT)/tao/Valuetype/ValueBase.h \
+ $(TAO_ROOT)/tao/Valuetype/ValueBase.inl \
+ $(TAO_ROOT)/tao/Valuetype/ValueFactory.h \
+ $(TAO_ROOT)/tao/Valuetype/ValueFactory.inl \
+ $(TAO_ROOT)/tao/Valuetype/AbstractBase.h \
+ $(TAO_ROOT)/tao/Valuetype/AbstractBase.inl \
+ $(TAO_ROOT)/tao/DomainC.h \
+ $(TAO_ROOT)/tao/DomainC.i \
+ $(TAO_ROOT)/tao/WrongTransactionC.h \
+ $(TAO_ROOT)/tao/WrongTransactionC.i \
+ $(TAO_ROOT)/tao/Object_KeyC.h \
+ $(TAO_ROOT)/tao/Object_KeyC.i \
+ $(TAO_ROOT)/tao/StringSeqC.h \
+ $(TAO_ROOT)/tao/StringSeqC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.h \
+ $(TAO_ROOT)/tao/DynamicC.h \
+ $(TAO_ROOT)/tao/DynamicC.i \
+ $(TAO_ROOT)/tao/ObjRefTemplate/ObjectReferenceTemplateC.h \
+ $(TAO_ROOT)/tao/ObjRefTemplate/ObjectReferenceTemplateC.i \
+ $(TAO_ROOT)/tao/Messaging_SyncScopeC.h \
+ $(TAO_ROOT)/tao/Messaging_SyncScopeC.i \
+ $(TAO_ROOT)/tao/IOPC.h \
+ $(TAO_ROOT)/tao/IOPC.i \
+ $(TAO_ROOT)/tao/PortableInterceptorC.i \
+ test_objectC.i \
+ $(TAO_ROOT)/tao/PortableServer/PortableServer.h \
+ $(TAO_ROOT)/tao/PortableServer/portableserver_export.h \
+ $(TAO_ROOT)/tao/PortableServer/PortableServerC.h \
+ $(TAO_ROOT)/tao/PortableServer/PortableServerC.i \
+ $(TAO_ROOT)/tao/PortableServer/Servant_Base.h \
+ $(TAO_ROOT)/tao/Abstract_Servant_Base.h \
+ $(ACE_ROOT)/ace/Atomic_Op.h \
+ $(ACE_ROOT)/ace/Atomic_Op_T.h \
+ $(ACE_ROOT)/ace/Atomic_Op_T.i \
+ $(ACE_ROOT)/ace/Atomic_Op_T.cpp \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(TAO_ROOT)/tao/PortableServer/Servant_Base.i \
+ $(TAO_ROOT)/tao/PortableServer/Collocated_Object.h \
+ $(TAO_ROOT)/tao/PortableServer/Collocated_Object.i \
+ $(TAO_ROOT)/tao/PortableServer/ThruPOA_Object_Proxy_Impl.h \
+ $(TAO_ROOT)/tao/PortableServer/Direct_Object_Proxy_Impl.h \
+ test_objectS_T.h test_objectS_T.i test_objectS_T.cpp test_objectS.i \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/CosNamingC.h \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/Naming/naming_export.h \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/CosNamingC.i \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/Naming/Naming_Utils.h \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/IOR_Multicast.h \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/svc_utils_export.h \
+ $(ACE_ROOT)/ace/INET_Addr.h \
+ $(ACE_ROOT)/ace/Addr.h \
+ $(ACE_ROOT)/ace/Addr.i \
+ $(ACE_ROOT)/ace/INET_Addr.i \
+ $(ACE_ROOT)/ace/SOCK_Dgram_Mcast.h \
+ $(ACE_ROOT)/ace/SOCK_Dgram.h \
+ $(ACE_ROOT)/ace/SOCK.h \
+ $(ACE_ROOT)/ace/IPC_SAP.h \
+ $(ACE_ROOT)/ace/IPC_SAP.i \
+ $(ACE_ROOT)/ace/SOCK.i \
+ $(ACE_ROOT)/ace/SOCK_Dgram.i \
+ $(ACE_ROOT)/ace/SOCK_Dgram_Mcast.i \
+ $(ACE_ROOT)/ace/Reactor.h \
+ $(ACE_ROOT)/ace/Handle_Set.h \
+ $(ACE_ROOT)/ace/Handle_Set.i \
+ $(ACE_ROOT)/ace/Timer_Queue.h \
+ $(ACE_ROOT)/ace/Timer_Queue_T.h \
+ $(ACE_ROOT)/ace/Test_and_Set.h \
+ $(ACE_ROOT)/ace/Test_and_Set.i \
+ $(ACE_ROOT)/ace/Test_and_Set.cpp \
+ $(ACE_ROOT)/ace/Timer_Queue_T.i \
+ $(ACE_ROOT)/ace/Timer_Queue_T.cpp \
+ $(ACE_ROOT)/ace/Reactor.i \
+ $(ACE_ROOT)/ace/Reactor_Impl.h \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/Naming/Naming_Context_Interface.h \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/CosNamingS.h \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/CosNamingS_T.h \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/CosNamingS_T.i \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/CosNamingS_T.cpp \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/CosNamingS.i \
+ $(TAO_ROOT)/orbsvcs/orbsvcs/Naming/nsconf.h \
+ $(TAO_ROOT)/tao/PortableServer/ORB_Manager.h \
+ $(ACE_ROOT)/ace/Task.h \
+ $(ACE_ROOT)/ace/Service_Object.h \
+ $(ACE_ROOT)/ace/Shared_Object.h \
+ $(ACE_ROOT)/ace/Shared_Object.i \
+ $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \
+ $(ACE_ROOT)/ace/DLL.h \
+ $(ACE_ROOT)/ace/Service_Object.i \
+ $(ACE_ROOT)/ace/Thread_Manager.h \
+ $(ACE_ROOT)/ace/Thread_Exit.h \
+ $(ACE_ROOT)/ace/Thread_Control.h \
+ $(ACE_ROOT)/ace/Thread_Control.inl \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Array_Base.h \
+ $(ACE_ROOT)/ace/Array_Base.inl \
+ $(ACE_ROOT)/ace/Array_Base.cpp \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
+ $(ACE_ROOT)/ace/Framework_Component.h \
+ $(ACE_ROOT)/ace/Framework_Component.inl \
+ $(ACE_ROOT)/ace/Framework_Component_T.h \
+ $(ACE_ROOT)/ace/Framework_Component_T.inl \
+ $(ACE_ROOT)/ace/Framework_Component_T.cpp \
+ $(ACE_ROOT)/ace/Thread_Manager.i \
+ $(ACE_ROOT)/ace/Task.i \
+ $(ACE_ROOT)/ace/Task_T.h \
+ $(ACE_ROOT)/ace/Message_Queue.h \
+ $(ACE_ROOT)/ace/IO_Cntl_Msg.h \
+ $(ACE_ROOT)/ace/Message_Queue_T.h \
+ $(ACE_ROOT)/ace/Message_Queue_T.i \
+ $(ACE_ROOT)/ace/Message_Queue_T.cpp \
+ $(ACE_ROOT)/ace/Notification_Strategy.h \
+ $(ACE_ROOT)/ace/Notification_Strategy.inl \
+ $(ACE_ROOT)/ace/Message_Queue.i \
+ $(ACE_ROOT)/ace/Task_T.i \
+ $(ACE_ROOT)/ace/Task_T.cpp \
+ $(ACE_ROOT)/ace/Module.h \
+ $(ACE_ROOT)/ace/Module.i \
+ $(ACE_ROOT)/ace/Module.cpp \
+ $(ACE_ROOT)/ace/Stream_Modules.h \
+ $(ACE_ROOT)/ace/Stream_Modules.cpp \
+ $(TAO_ROOT)/tao/debug.h \
+ $(ACE_ROOT)/ace/Get_Opt.h \
+ $(ACE_ROOT)/ace/Get_Opt.i
+
+# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
diff --git a/TAO/orbsvcs/tests/Redundant_Naming/README b/TAO/orbsvcs/tests/Redundant_Naming/README
new file mode 100644
index 00000000000..ce0c91729b5
--- /dev/null
+++ b/TAO/orbsvcs/tests/Redundant_Naming/README
@@ -0,0 +1,89 @@
+// $Id$
+
+This application tests the redundancy feature of TAO's Naming Service.
+
+To run all tests automatically -
+ execute Perl script run_test.pl
+
+To run tests manually -
+ start the Naming Service (see
+ TAO/orbsvcs/Naming_Service/README for valid options),
+ then run ./client the optional options are shown below.
+
+NOTE: if running tests manually, the NameService directory must exist
+before starting the Naming Service and this directory must be cleaned out
+manually after stopping the Naming Service.
+
+The following options exist:
+---------------------------
+-b Breath of Context tree, default is 4, minimum is 2
+
+-d Depth of Context tree, default is 4, minimum is 2
+
+-o Breath of Object tree, default is 4, minimum is 2
+
+-p ior for Naming Server 1
+
+-q ior for Naming Server 2
+
+The client creates two context trees, one of breath b and one of depth d,
+and another node with o objects. It then removes the contexts b-1, d and
+the object o-1. All these are done using the first name server. The
+client then accesses contexts b, b-1, d, d-1, and objects o, o-1 looking
+for the appropriate found/not-found returns using the second name server.
+
+ Example (on a Unix system):
+ $ $TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o nsior1\
+ -R NameService -ORBEndPoint iiop://localhost:10001 &
+ $ $TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o nsior2\
+ -R NameService -ORBEndPoint iiop://localhost:10002 &
+ $ ./client -p file://nsior1 -q file://nsior2
+
+ where the steps correspond to 1&2)starting the Naming Service
+ in redundant mode, 3) running the client.
+ Don't forget to kill the name servers after you are done.
+
+
+
+EXPECTED OUTPUT FOR THIS TEST
+*****************************
+
+Redundancy test OK.
+
+The default test runs in a few seconds. (4 on my 500MHz Linux)
+
+
+*****************************
+Restrictions, performance notes, and future
+
+While the redundant naming service is only fully function on Tru64
+clusters, it can be used on any two systems that share a file system
+with locking. However, this test puts the two naming servers on the
+local system doesn't test the locking (probablistic to do, at best)
+and runs the client on the same system. This will specifically test
+only the functionality of the redundancy. The extra parameters can
+be used manually to probe performance, as illustrated below.
+
+Using the b,d, and o options, I determined:
+
+As the number of objects in a single context increases, performance
+decreases. This is because of I/O limits, each addition of a new
+object reference adds about 1/2 KB and rewrites the whole file. I
+observed 9746 objects added to a single context in 100 minutes and
+noted that the disk light was on solid.
+
+As the number of contexts increase, the CPU became the limiting factor.
+2000 contexts under the root context took 20 minutes.
+
+As the depth of the contexts increases, the limit becomes the file
+system. As the number of contexts, equivalent to files, passed 12000,
+the system slowed to a crawl. The first 12000 took about 5 minutes, the
+next 15 minutes only got another 2000. Process CPU was very low, less
+than 5 %. Disk activity was high, but not contiguous, lot of head motion
+not seen in the single context above.
+
+Future enhancement of this service should address these performance
+limits. One obvious enhancement is to use IPC between the redundant
+Naming Servers to reduce the dependence on the disk, then a lazy update
+of the disk can be done. Would take a lot of code, but doable.
+
diff --git a/TAO/orbsvcs/tests/Redundant_Naming/Redundant_Naming.dsw b/TAO/orbsvcs/tests/Redundant_Naming/Redundant_Naming.dsw
new file mode 100644
index 00000000000..3e83cd1bc20
--- /dev/null
+++ b/TAO/orbsvcs/tests/Redundant_Naming/Redundant_Naming.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "client"=.\client.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/TAO/orbsvcs/tests/Redundant_Naming/Redundant_Naming.mpc b/TAO/orbsvcs/tests/Redundant_Naming/Redundant_Naming.mpc
new file mode 100644
index 00000000000..109e9d8e637
--- /dev/null
+++ b/TAO/orbsvcs/tests/Redundant_Naming/Redundant_Naming.mpc
@@ -0,0 +1,4 @@
+project(Redundant Naming Client) : namingexe {
+ exename = client
+}
+
diff --git a/TAO/orbsvcs/tests/Redundant_Naming/client.cpp b/TAO/orbsvcs/tests/Redundant_Naming/client.cpp
new file mode 100644
index 00000000000..ddcc664fb6e
--- /dev/null
+++ b/TAO/orbsvcs/tests/Redundant_Naming/client.cpp
@@ -0,0 +1,540 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/Naming_Service/
+//
+// = FILENAME
+// client.cpp
+//
+// = DESCRIPTION
+// This class implements a CORBA client for a redundant CosNaming
+// Service using stubs generated by the TAO ORB IDL compiler.
+//
+// = AUTHORS
+// Rich Seibel <seibel_r@ociweb.com>
+// ============================================================================
+
+#include "test_objectS.h"
+#include "orbsvcs/CosNamingC.h"
+#include "orbsvcs/Naming/Naming_Utils.h"
+#include "tao/corba.h"
+#include "tao/PortableServer/ORB_Manager.h"
+#include "tao/debug.h"
+#include "ace/Get_Opt.h"
+
+ACE_RCSID(Simple_Naming, client, "$Id$")
+
+#if defined (_MSC_VER)
+# pragma warning (disable : 4250)
+#endif /* _MSC_VER */
+
+class My_Test_Object :
+ public virtual PortableServer::RefCountServantBase,
+ public virtual POA_Test_Object
+{
+public:
+ // = Initialization and termination methods.
+ My_Test_Object (CORBA::Short id = 0);
+ // Constructor.
+
+ ~My_Test_Object (void);
+ // Destructor.
+
+ // = Interface implementation accessor methods.
+
+ void id (CORBA::Short id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Sets id.
+
+ CORBA::Short id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Gets id.
+
+private:
+ short id_;
+};
+
+My_Test_Object::My_Test_Object (CORBA::Short id)
+ : id_ (id)
+{
+}
+
+My_Test_Object::~My_Test_Object (void)
+{
+}
+
+CORBA::Short
+My_Test_Object::id (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return id_;
+}
+
+void
+My_Test_Object::id (CORBA::Short id ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ id_ = id;
+}
+
+
+// This function runs the test.
+
+int
+main (int argc, ACE_TCHAR **argv)
+{
+ int c_breath = 4;
+ int c_depth = 4;
+ int o_breath = 4;
+ ACE_TCHAR *ns1ref;
+ ACE_TCHAR *ns2ref;
+
+ ACE_Get_Opt get_opts (argc, argv, ACE_LIB_TEXT ("b:d:o:p:q:"));
+ int c;
+ int i;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'b':
+ i = ACE_OS::atoi(get_opts.opt_arg ());
+ if (i<2)
+ {
+ ACE_ERROR((LM_ERROR,
+ ACE_LIB_TEXT ("Invalid breath, must be 2 or more\n")));
+ exit(1);
+ }
+ c_breath = i;
+ break;
+ case 'd':
+ i = ACE_OS::atoi(get_opts.opt_arg ());
+ if (i<2)
+ {
+ ACE_ERROR((LM_ERROR,
+ ACE_LIB_TEXT ("Invalid depth, must be 2 or more\n")));
+ exit(1);
+ }
+ c_depth = i;
+ break;
+ case 'o':
+ i = ACE_OS::atoi(get_opts.opt_arg ());
+ if (i<2)
+ {
+ ACE_ERROR((LM_ERROR,
+ ACE_LIB_TEXT ("Invalid breath, must be 2 or more\n")));
+ exit(1);
+ }
+ o_breath = i;
+ break;
+ case 'p':
+ ns1ref = get_opts.opt_arg ();
+ break;
+ case 'q':
+ ns2ref = get_opts.opt_arg ();
+ break;
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_LIB_TEXT ("Argument %c \n usage: %s")
+ ACE_LIB_TEXT (" [-b <breath of context tree>]")
+ ACE_LIB_TEXT (" [-d <depth of context tree>]")
+ ACE_LIB_TEXT (" [-o <breath of object tree>]")
+ ACE_LIB_TEXT (" -p <ior of first name server>")
+ ACE_LIB_TEXT (" -q <ior of second name server>")
+ ACE_LIB_TEXT ("\n")),
+ -1);
+ }
+
+ CosNaming::NamingContext_var root_context_1;
+ CosNaming::NamingContext_var root_context_2;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY_EX(bl_a)
+ {
+ // Initialize orb
+ CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, 0 ACE_ENV_ARG_PARAMETER);
+
+ // ior's are specified for the name servers through a commandline
+ // option or a file.
+
+ // Resolve the first name server
+
+ CORBA::Object_var ns1obj = orb->string_to_object (
+ ACE_TEXT_ALWAYS_CHAR (ns1ref) ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_a);
+
+ if (CORBA::is_nil (ns1obj.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_LIB_TEXT ("invalid ior <%s>\n"),
+ ns1ref),
+ -1);
+ root_context_1 = CosNaming::NamingContext::_narrow (ns1obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK_EX(bl_a);
+
+ // Resolve the second name server
+
+ CORBA::Object_var ns2obj = orb->string_to_object (
+ ACE_TEXT_ALWAYS_CHAR (ns2ref) ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_a);
+
+ if (CORBA::is_nil (ns2obj.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_LIB_TEXT ("invalid ior <%s>\n"),
+ ns2ref),
+ -1);
+ root_context_2 = CosNaming::NamingContext::_narrow (ns2obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_a);
+
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_LIB_TEXT ("Unable to resolve name servers"));
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ // Create a bunch of objects in one context
+ // Note: strings to the naming service must be char, not wchar
+ ACE_TRY_EX(bl_b)
+ {
+ // Bind one context level under root.
+ CosNaming::Name level1;
+ level1.length (1);
+ level1[0].id = CORBA::string_dup ("level1_context");
+ CosNaming::NamingContext_var level1_context;
+ level1_context = root_context_1->bind_new_context (level1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_b);
+ for (i=0; i<o_breath; i++)
+ {
+ // Instantiate a dummy object and bind it under the new context.
+ My_Test_Object *impl1 = new My_Test_Object (i+1);
+ Test_Object_var obj1 = impl1->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_b);
+ impl1->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_b);
+
+ CosNaming::Name obj_name;
+ obj_name.length (1);
+ char wide_name[16];
+ ACE_OS::sprintf(wide_name, "obj_%d", i);
+ obj_name[0].id = CORBA::string_dup (wide_name);
+ level1_context->bind (obj_name, obj1.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_b);
+ }
+
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_LIB_TEXT ("Unable to create a lot of objects"));
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ // Create a deep context tree
+ ACE_TRY_EX(bl_c)
+ {
+ CosNaming::NamingContext_var next_context = root_context_1;
+ for (i=0; i<c_depth; i++)
+ {
+ // Bind level1 context under root.
+ CosNaming::Name deep;
+ deep.length (1);
+ char deep_name[16];
+ ACE_OS::sprintf(deep_name, "deep_%d", i);
+ deep[0].id = CORBA::string_dup (deep_name);
+ CosNaming::NamingContext_var deep_context;
+ deep_context = next_context->bind_new_context (deep
+ ACE_ENV_ARG_PARAMETER);
+ next_context = deep_context;
+ ACE_TRY_CHECK_EX(bl_c);
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_LIB_TEXT ("Unable to create deep context"));
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ // Create a wide context tree
+ ACE_TRY_EX(bl_d)
+ {
+ for (i=0; i<c_breath; i++)
+ {
+ // Bind all level of context under root.
+ CosNaming::Name wide;
+ wide.length (1);
+ char wide_name[16];
+ ACE_OS::sprintf(wide_name, "wide_%d", i);
+ wide[0].id = CORBA::string_dup (wide_name);
+ CosNaming::NamingContext_var wide_context;
+ wide_context = root_context_1->bind_new_context (wide
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_d);
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_LIB_TEXT ("Unable to create wide context"));
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ // Delete three selected things, one from each tree
+ ACE_TRY_EX(bl_e)
+ {
+ // Remove the second to last object from the Naming Context
+ CosNaming::Name wide1;
+ wide1.length (2);
+ wide1[0].id = CORBA::string_dup ("level1_context");
+ char wide_name[16];
+ ACE_OS::sprintf(wide_name, "obj_%d", o_breath-2);
+ wide1[1].id = CORBA::string_dup (wide_name);
+ root_context_1->unbind (wide1 ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_e);
+
+ // Remove the second to last context from the wide root Naming Context
+ CosNaming::Name wide2;
+ wide2.length (1);
+ ACE_OS::sprintf(wide_name, "wide_%d", c_breath-2);
+ wide2[0].id = CORBA::string_dup (wide_name);
+ CORBA::Object_var result_obj_ref = root_context_1->resolve (wide2
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_e);
+ CosNaming::NamingContext_var result_object =
+ CosNaming::NamingContext::_narrow (result_obj_ref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_e);
+ if (CORBA::is_nil (result_object.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_LIB_TEXT ("Problems with resolving wide context ")
+ ACE_LIB_TEXT ("- nil object ref.\n")),
+ -1);
+ result_object->destroy(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_e);
+ root_context_1->unbind (wide2 ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_e);
+
+ // Remove the last context from the deep Naming Context
+ CosNaming::Name deep;
+ deep.length (c_depth);
+ char deep_name[16];
+ for (i=0; i<c_depth; i++)
+ {
+ ACE_OS::sprintf(deep_name, "deep_%d", i);
+ deep[i].id = CORBA::string_dup (deep_name);
+ }
+ result_obj_ref = root_context_1->resolve (deep ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_e);
+ result_object =
+ CosNaming::NamingContext::_narrow (result_obj_ref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_e);
+ if (CORBA::is_nil (result_object.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_LIB_TEXT ("Problems with resolving deep context ")
+ ACE_LIB_TEXT ("- nil object ref.\n")),
+ -1);
+ result_object->destroy(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_e);
+ root_context_1->unbind (deep ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_e);
+
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_LIB_TEXT ("Unable to delete objects"));
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ // Now use the other name server to access 3 objects next to the
+ // deleted objects and the 3 deleted objects
+ ACE_TRY_EX(bl_f)
+ {
+ // Access the last object from the Naming Context
+ CosNaming::Name wide;
+ wide.length (2);
+ wide[0].id = CORBA::string_dup ("level1_context");
+ char wide_name[16];
+ ACE_OS::sprintf(wide_name, "obj_%d", o_breath-1);
+ wide[1].id = CORBA::string_dup (wide_name);
+ CORBA::Object_var result_obj_ref = root_context_2->resolve (wide
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_f);
+ Test_Object_var result_object = Test_Object::_narrow (result_obj_ref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_f);
+ if (CORBA::is_nil (result_object.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_LIB_TEXT ("Problems with resolving object from ")
+ ACE_LIB_TEXT ("redundant server - nil object ref.\n")),
+ -1);
+ ACE_TRY_CHECK_EX(bl_f);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_LIB_TEXT ("Unable to resolve object from redundant server"));
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ ACE_TRY_EX(bl_g)
+ {
+ // Access the deleted second to last object from the Naming Context
+ CosNaming::Name wide;
+ wide.length (2);
+ wide[0].id = CORBA::string_dup ("level1_context");
+ char wide_name[16];
+ ACE_OS::sprintf(wide_name, "obj_%d", o_breath-2);
+ wide[1].id = CORBA::string_dup (wide_name);
+ CORBA::Object_var result_obj_ref = root_context_2->resolve (wide
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_g);
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_LIB_TEXT ("Problems with resolving object from ")
+ ACE_LIB_TEXT ("redundant server - deleted object found.\n")),
+ -1);
+ }
+ ACE_CATCHANY
+ {
+ //expect exception since the context was deleted
+ }
+ ACE_ENDTRY;
+
+ ACE_TRY_EX(bl_h)
+ {
+ // Access the last context from the wide Naming Context
+ CosNaming::Name wide;
+ wide.length (1);
+ char wide_name[16];
+ ACE_OS::sprintf(wide_name, "wide_%d", c_breath-1);
+ wide[0].id = CORBA::string_dup (wide_name);
+ CORBA::Object_var result_obj_ref = root_context_2->resolve (wide
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_h);
+ CosNaming::NamingContext_var result_object =
+ CosNaming::NamingContext::_narrow (result_obj_ref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_h);
+ if (CORBA::is_nil (result_object.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_LIB_TEXT ("Problems with resolving wide context from ")
+ ACE_LIB_TEXT ("redundant server - nil object ref.\n")),
+ -1);
+ ACE_TRY_CHECK_EX(bl_h);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_LIB_TEXT ("Unable to resolve wide context from redundant server"));
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ ACE_TRY_EX(bl_i)
+ {
+ // Access the deleted second to last object from the Naming Context
+ CosNaming::Name wide;
+ wide.length (2);
+ char wide_name[16];
+ ACE_OS::sprintf(wide_name, "wide_%d", c_breath-2);
+ wide[0].id = CORBA::string_dup (wide_name);
+ CORBA::Object_var result_obj_ref = root_context_2->resolve (wide
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_i);
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_LIB_TEXT ("Problems with resolving wide context from ")
+ ACE_LIB_TEXT ("redundant server - deleted object found.\n")),
+ -1);
+ }
+ ACE_CATCHANY
+ {
+ //expect exception since the context was deleted
+ }
+ ACE_ENDTRY;
+
+ ACE_TRY_EX(bl_j)
+ {
+ // Access the deleted last context from the deep Naming Context
+ CosNaming::Name deep;
+ deep.length (c_depth);
+ char deep_name[16];
+ for (i=0; i<c_depth; i++)
+ {
+ ACE_OS::sprintf(deep_name, "deep_%d", i);
+ deep[i].id = CORBA::string_dup (deep_name);
+ }
+ CORBA::Object_var result_obj_ref = root_context_1->resolve (deep
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_j);
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_LIB_TEXT ("Problems with resolving deep context from ")
+ ACE_LIB_TEXT ("redundant server - deleted object found.\n")),
+ -1);
+ }
+ ACE_CATCHANY
+ {
+ //expect exception since the context was deleted
+ }
+ ACE_ENDTRY;
+
+ ACE_TRY_EX(bl_k)
+ {
+ // Access the second to last object from the Naming Context
+ CosNaming::Name deep;
+ deep.length (c_depth-1);
+ char deep_name[16];
+ for (i=0; i<c_depth-1; i++)
+ {
+ ACE_OS::sprintf(deep_name, "deep_%d", i);
+ deep[i].id = CORBA::string_dup (deep_name);
+ }
+ CORBA::Object_var result_obj_ref = root_context_1->resolve (deep
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_k);
+ CosNaming::NamingContext_var result_object =
+ CosNaming::NamingContext::_narrow (result_obj_ref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(bl_k);
+ if (CORBA::is_nil (result_object.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_LIB_TEXT ("Problems with resolving deep context from ")
+ ACE_LIB_TEXT ("redundant server - nil object ref.\n")),
+ -1);
+
+ ACE_TRY_CHECK_EX(bl_k);
+
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_LIB_TEXT ("Unable to resolve deep context from redundant server"));
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("Redundancy test OK\n")));
+ return 0;
+
+}
diff --git a/TAO/orbsvcs/tests/Redundant_Naming/client.dsp b/TAO/orbsvcs/tests/Redundant_Naming/client.dsp
new file mode 100644
index 00000000000..5d8c0ce564f
--- /dev/null
+++ b/TAO/orbsvcs/tests/Redundant_Naming/client.dsp
@@ -0,0 +1,238 @@
+# Microsoft Developer Studio Project File - Name="Redundant Naming Client" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=Redundant Naming Client - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "client.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "client.mak" CFG="Redundant Naming Client - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "Redundant Naming Client - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "Redundant Naming Client - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "Redundant Naming Client - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\\" /I "..\..\..\\" /I "..\..\..\..\\" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 TAO_CosNaming.lib ace.lib TAO.lib TAO_PortableServer.lib TAO_IORTable.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\orbsvcs" /libpath:"..\..\..\tao" /libpath:"..\..\..\tao\PortableServer" /libpath:"..\..\..\tao\IORTable" /libpath:"..\..\..\..\ace"
+
+!ELSEIF "$(CFG)" == "Redundant Naming Client - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\\" /I "..\..\..\\" /I "..\..\..\..\\" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D TAO_ORBSVCS_HAS_DLL=1 /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 TAO_CosNamingd.lib aced.lib TAOd.lib TAO_PortableServerd.lib TAO_IORTabled.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\orbsvcs" /libpath:"..\..\..\tao" /libpath:"..\..\..\tao\PortableServer" /libpath:"..\..\..\tao\IORTable" /libpath:"..\..\..\..\ace"
+
+!ENDIF
+
+# Begin Target
+
+# Name "Redundant Naming Client - Win32 Release"
+# Name "Redundant Naming Client - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter ".cpp"
+# Begin Source File
+
+SOURCE=.\client.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\test_objectC.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\test_objectS.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter ".h"
+# Begin Source File
+
+SOURCE=.\client.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\test_objectC.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\test_objectS.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\test_objectS_T.h
+# End Source File
+# End Group
+# Begin Group "IDL Files"
+
+# PROP Default_Filter ".idl"
+# Begin Source File
+
+SOURCE=.\test_object.idl
+
+!IF "$(CFG)" == "Redundant Naming Client - Win32 Release"
+
+# PROP Ignore_Default_Tool 1
+USERDEP__TEST_="..\..\..\..\bin\Release\tao_idl.exe"
+# Begin Custom Build - Invoking TAO_IDL Compiler
+InputPath=.\test_object.idl
+InputName=test_object
+
+BuildCmds= \
+ ..\..\..\..\bin\Release\tao_idl -Ge 1 $(InputName).idl
+
+"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "Redundant Naming Client - Win32 Debug"
+
+# PROP Ignore_Default_Tool 1
+USERDEP__TEST_="..\..\..\..\bin\tao_idl.exe"
+# Begin Custom Build - Invoking TAO_IDL Compiler
+InputPath=.\test_object.idl
+InputName=test_object
+
+BuildCmds= \
+ ..\..\..\..\bin\tao_idl -Ge 1 $(InputName).idl
+
+"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Group "Inline Files"
+
+# PROP Default_Filter ".i"
+# Begin Source File
+
+SOURCE=.\test_objectC.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\test_objectS.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\test_objectS_T.i
+# End Source File
+# End Group
+# Begin Group "Template Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\test_objectS_T.cpp
+# PROP Exclude_From_Build 1
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/TAO/orbsvcs/tests/Redundant_Naming/makefile.bor b/TAO/orbsvcs/tests/Redundant_Naming/makefile.bor
new file mode 100644
index 00000000000..d79124b7307
--- /dev/null
+++ b/TAO/orbsvcs/tests/Redundant_Naming/makefile.bor
@@ -0,0 +1,38 @@
+#
+# Makefile for building the Simple_Naming test
+#
+
+NAME = client
+
+TAO_IDL = $(CORE_BINDIR)\tao_idl -g $(CORE_BINDIR)\gperf.exe -Ge 1
+
+OBJFILES = \
+ $(OBJDIR)\test_objectC.obj \
+ $(OBJDIR)\test_objectS.obj \
+ $(OBJDIR)\client.obj
+
+CFLAGS = $(ACE_CFLAGS) $(TAO_CFLAGS) $(TAO_NAMING_CFLAGS) $(TAO_SVC_UTILS_CFLAGS) $(TAO_PORTABLESERVER_CFLAGS) $(TAO_IORTABLE_CFLAGS)
+
+LIBFILES = \
+ $(ACE_LIB) \
+ $(TAO_LIB) \
+ $(TAO_NAMING_LIB) \
+ $(TAO_PORTABLESERVER_LIB) \
+ $(TAO_SVC_UTILS_LIB) \
+ $(TAO_IORTABLE_LIB)
+
+CPPDIR = .
+
+IDLDIR = .
+
+IDLFILES = test_object.idl
+
+!include <$(ACE_ROOT)\include\makeinclude\build_exe.bor>
+
+#
+# IDL Build rules
+#
+
+$(IDLDIR)\test_objectS.cpp $(IDLDIR)\test_objectC.cpp: $(IDLDIR)\test_object.idl
+ $(TAO_IDL) $**
+
diff --git a/TAO/orbsvcs/tests/Redundant_Naming/run_test.pl b/TAO/orbsvcs/tests/Redundant_Naming/run_test.pl
new file mode 100755
index 00000000000..d0b5146cd18
--- /dev/null
+++ b/TAO/orbsvcs/tests/Redundant_Naming/run_test.pl
@@ -0,0 +1,99 @@
+eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
+ & eval 'exec perl -S $0 $argv:q'
+ if 0;
+
+# $Id$
+# -*- perl -*-
+
+# This is a Perl script that runs a Naming Service test. It starts
+# all the servers and clients as necessary.
+
+use lib '../../../../bin';
+use PerlACE::Run_Test;
+
+# Amount of delay (in seconds) between starting a server and a client
+# to allow proper server initialization.
+$sleeptime = 10;
+
+$quiet = 0;
+
+# check for -q flag
+if ($ARGV[0] eq '-q') {
+ $quiet = 1;
+}
+
+# Variables for command-line arguments to client and server
+# executables.
+$ns_orb_port1 = 10001 + PerlACE::uniqueid ();
+$ns_orb_port2 = 10002 + PerlACE::uniqueid ();
+$ns_endpoint1 = "iiop://localhost:$ns_orb_port1";
+$ns_endpoint2 = "iiop://localhost:$ns_orb_port2";
+$iorfile1 = PerlACE::LocalFile ("ns1.ior");
+$iorfile2 = PerlACE::LocalFile ("ns2.ior");
+
+$status = 0;
+
+# Make sure that the directory to use to hold the naming contexts exists
+# and is cleaned out
+if ( ! -d "NameService" ) {
+ mkdir (NameService, 0777);
+ }
+else {
+ chdir "NameService";
+ opendir(THISDIR, ".");
+ @allfiles = grep(!/^\.\.?$/, readdir(THISDIR));
+ closedir(THISDIR);
+ unlink @allfiles;
+ chdir "..";
+ }
+
+# Run two Naming Servers in redundant mode and one client. Client uses iors
+# in files to find the individual copies of the Naming Servers.
+
+my $args = "-ORBEndPoint $ns_endpoint1 -o $iorfile1 -m 0 -r NameService";
+my $prog = "../../Naming_Service/Naming_Service";
+$NS1 = new PerlACE::Process ($prog, $args);
+
+unlink $iorfile1;
+
+$NS1->Spawn ();
+
+if (PerlACE::waitforfile_timed ($iorfile1, $sleeptime) == -1) {
+ print STDERR "ERROR: cannot find IOR file <$iorfile>\n";
+ $NS1->Kill ();
+ exit 1;
+}
+
+my $args = "-ORBEndPoint $ns_endpoint2 -o $iorfile2 -m 0 -r NameService";
+my $prog = "../../Naming_Service/Naming_Service";
+$NS2 = new PerlACE::Process ($prog, $args);
+
+unlink $iorfile2;
+
+$NS2->Spawn ();
+
+if (PerlACE::waitforfile_timed ($iorfile2, $sleeptime) == -1) {
+ print STDERR "ERROR: cannot find IOR file <$iorfile>\n";
+ $NS2->Kill ();
+ exit 1;
+}
+
+my $args = "-p file://$iorfile1 -q file://$iorfile2";
+my $prog = "client";
+
+$CL = new PerlACE::Process ($prog, $args);
+
+$client = $CL->SpawnWaitKill (12);
+
+if ($client != 0) {
+ print STDERR "ERROR: client returned $client\n";
+ $status = 1;
+}
+
+$NS1->Kill ();
+$NS2->Kill ();
+
+unlink $iorfile1;
+unlink $iorfile2;
+
+exit $status;
diff --git a/TAO/orbsvcs/tests/Redundant_Naming/test_object.idl b/TAO/orbsvcs/tests/Redundant_Naming/test_object.idl
new file mode 100644
index 00000000000..4737f6dc6c8
--- /dev/null
+++ b/TAO/orbsvcs/tests/Redundant_Naming/test_object.idl
@@ -0,0 +1,11 @@
+// $Id$
+
+interface Test_Object
+{
+ // = TITLE
+ // This is a simple interface that tests the Naming Service.
+
+ attribute short id;
+ // This provides an easy way to differentiate objects if each
+ // objects is served by a separate servant.
+};
diff --git a/TAO/orbsvcs/tests/Simple_Naming/run_test.pl b/TAO/orbsvcs/tests/Simple_Naming/run_test.pl
index e64d914c7cf..2f52a7c86d1 100755
--- a/TAO/orbsvcs/tests/Simple_Naming/run_test.pl
+++ b/TAO/orbsvcs/tests/Simple_Naming/run_test.pl
@@ -5,8 +5,9 @@ eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
# $Id$
# -*- perl -*-
-# This is a Perl script that runs all Naming Service tests. It starts
-# all the servers and clients as necessary.
+# This is a Perl script that runs some Naming Service tests.
+# It runs all the tests that will run with min CORBA.
+# It starts all the servers and clients as necessary.
use lib '../../../../bin';
use PerlACE::Run_Test;
@@ -28,7 +29,6 @@ $ns_multicast_port = 10001 + PerlACE::uniqueid (); # Can not be 10000 on Chorus
$ns_orb_port = 12000 + PerlACE::uniqueid ();
$iorfile = PerlACE::LocalFile ("ns.ior");
$persistent_ior_file = PerlACE::LocalFile ("pns.ior");
-$file_persistent_ior_file = PerlACE::LocalFile ("fpns.ior");
$persistent_log_file = PerlACE::LocalFile ("test_log");
$data_file = PerlACE::LocalFile ("test_run.data");
@@ -73,37 +73,33 @@ sub client
# Options for all simple tests recognized by the 'client' program.
@opts = ("-s -ORBInitRef NameService=file://$iorfile",
"-p $persistent_ior_file -ORBInitRef NameService=file://$iorfile",
- "-p $file_persistent_ior_file -ORBInitRef NameService=file://$iorfile",
"-s -ORBInitRef NameService=mcast://:$ns_multicast_port\::/NameService",
"-t -ORBInitRef NameService=file://$iorfile",
"-i -ORBInitRef NameService=file://$iorfile",
"-e -ORBInitRef NameService=file://$iorfile",
"-y -ORBInitRef NameService=file://$iorfile",
"-c file://$persistent_ior_file -ORBInitRef NameService=file://$iorfile",
- "-c file://$file_persistent_ior_file -ORBInitRef NameService=file://$iorfile");
+ );
@server_opts = ("-t 30",
"-ORBEndpoint iiop://$TARGETHOSTNAME:$ns_orb_port -f $persistent_log_file",
- "-ORBEndpoint iiop://$TARGETHOSTNAME:$ns_orb_port -u .",
"", "", "", "", "",
"-ORBEndpoint iiop://$TARGETHOSTNAME:$ns_orb_port -f $persistent_log_file",
- "-ORBEndpoint iiop://$TARGETHOSTNAME:$ns_orb_port -u .");
+ );
@comments = ("Simple Test: \n",
"mmap() Persistent Test (Part 1): \n",
- "Flat File Persistent Test (Part 1): \n",
"Simple Test (using multicast to locate the server): \n",
"Tree Test: \n",
"Iterator Test: \n",
"Exceptions Test: \n",
"Destroy Test: \n",
"mmap() Persistent Test (Part 2): \n",
- "Flat File Persistent Test (Part 2): \n");
+ );
$test_number = 0;
-unlink ($persistent_ior_file, $file_persistent_ior_file,
- $persistent_log_file, "NameService", "NameService_0");
+unlink ($persistent_ior_file, $persistent_log_file);
# Run server and client for each of the tests. Client uses ior in a
# file to bootstrap to the server.
@@ -126,8 +122,7 @@ foreach $o (@opts) {
$test_number++;
}
-unlink ($persistent_ior_file, $file_persistent_ior_file, \
- $persistent_log_file, "NameService", "NameService_0");
+unlink ($persistent_ior_file, $persistent_log_file);
# Now run the multithreaded test, sending output to the file.
print STDERR "\n Multithreaded Test:\n";
diff --git a/TAO/orbsvcs/tests/Simple_Naming/run_test_ffp.pl b/TAO/orbsvcs/tests/Simple_Naming/run_test_ffp.pl
new file mode 100755
index 00000000000..068b5c66038
--- /dev/null
+++ b/TAO/orbsvcs/tests/Simple_Naming/run_test_ffp.pl
@@ -0,0 +1,131 @@
+eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
+ & eval 'exec perl -S $0 $argv:q'
+ if 0;
+
+# $Id$
+# -*- perl -*-
+
+# This is a Perl script that runs additional Naming Service tests.
+# It runs all the tests that will *not* run with min CORBA.
+# It starts all the servers and clients as necessary.
+
+use lib '../../../../bin';
+use PerlACE::Run_Test;
+
+# Amount of delay (in seconds) between starting a server and a client
+# to allow proper server initialization.
+$sleeptime = 10;
+
+$quiet = 0;
+
+# check for -q flag
+if ($ARGV[0] eq '-q') {
+ $quiet = 1;
+}
+
+# Variables for command-line arguments to client and server
+# executables.
+$ns_multicast_port = 10001 + PerlACE::uniqueid (); # Can not be 10000 on Chorus 4.0
+$ns_orb_port = 12000 + PerlACE::uniqueid ();
+$iorfile = PerlACE::LocalFile ("ns.ior");
+$file_persistent_ior_file = PerlACE::LocalFile ("fpns.ior");
+
+$status = 0;
+
+sub name_server
+{
+ my $args = "-ORBNameServicePort $ns_multicast_port -o $iorfile -m 1 @_";
+ my $prog = "../../Naming_Service/Naming_Service";
+ $NS = new PerlACE::Process ($prog, $args);
+
+ unlink $iorfile;
+
+ $NS->Spawn ();
+
+ if (PerlACE::waitforfile_timed ($iorfile, $sleeptime) == -1) {
+ print STDERR "ERROR: cannot find IOR file <$iorfile>\n";
+ $NS->Kill ();
+ exit 1;
+ }
+}
+
+sub client
+{
+ my $args = "@_"." ";
+ my $prog = "client";
+
+ $CL = new PerlACE::Process ($prog, $args);
+
+ $client = $CL->SpawnWaitKill (60);
+
+ if ($client != 0) {
+ print STDERR "ERROR: client returned $client\n";
+ $status = 1;
+ }
+}
+
+## The options below have been reordered due to a
+## initialization problem (within the Naming_Service)
+## that has only been seen on Windows XP.
+
+# Options for all simple tests recognized by the 'client' program.
+@opts = ("-p $file_persistent_ior_file -ORBInitRef NameService=file://$iorfile",
+ "-c file://$file_persistent_ior_file -ORBInitRef NameService=file://$iorfile");
+
+@server_opts = ("-ORBEndpoint iiop://$TARGETHOSTNAME:$ns_orb_port -u NameService",
+ "-ORBEndpoint iiop://$TARGETHOSTNAME:$ns_orb_port -u NameService");
+
+@comments = ("Flat File Persistent Test (Part 1): \n",
+ "Flat File Persistent Test (Part 2): \n");
+
+$test_number = 0;
+
+unlink ($file_persistent_ior_file);
+
+if ( ! -d "NameService" ) {
+ mkdir (NameService, 0777);
+ }
+else {
+ chdir "NameService";
+ opendir(THISDIR, ".");
+ @allfiles = grep(!/^\.\.?$/, readdir(THISDIR));
+ closedir(THISDIR);
+ unlink @allfiles;
+ chdir "..";
+ }
+
+
+# Run server and client for each of the tests. Client uses ior in a
+# file to bootstrap to the server.
+foreach $o (@opts) {
+ name_server ($server_opts[$test_number]);
+
+ print STDERR "\n ".$comments[$test_number];
+
+ client ($o);
+
+ $NS->Kill ();
+
+ ## For some reason, only on Windows XP, we need to
+ ## wait before starting another Naming_Service when
+ ## the mmap persistence option is used
+ if ($^O eq "MSWin32") {
+ sleep(1);
+ }
+
+ $test_number++;
+}
+
+unlink ($file_persistent_ior_file);
+
+chdir "NameService";
+opendir(THISDIR, ".");
+@allfiles = grep(!/^\.\.?$/, readdir(THISDIR));
+closedir(THISDIR);
+unlink @allfiles;
+chdir "..";
+rmdir "NameService";
+
+unlink $iorfile;
+
+exit $status;
diff --git a/TAO/orbsvcs/tests/tests.dsw b/TAO/orbsvcs/tests/tests.dsw
index 6f61a04f7d2..4862842719f 100644
--- a/TAO/orbsvcs/tests/tests.dsw
+++ b/TAO/orbsvcs/tests/tests.dsw
@@ -294,6 +294,18 @@ Package=<4>
###############################################################################
+Project: "Redundant Naming Client"=.\Redundant_Naming\client.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
Project: "Time_Service_Test"=.\Time\Time_Service_Test.dsp - Package Owner=<4>
Package=<5>