diff options
author | seibel_r <seibel_r@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2003-06-23 17:44:25 +0000 |
---|---|---|
committer | seibel_r <seibel_r@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2003-06-23 17:44:25 +0000 |
commit | 2d1efbf998bc5f43f34b9821a19ea440694395bb (patch) | |
tree | f7d7d383738372346a70d107bf4efa105a9f3280 | |
parent | 6b234b1478ad31c1056c82cf2cb4f3d87904566c (diff) | |
download | ATCD-2d1efbf998bc5f43f34b9821a19ea440694395bb.tar.gz |
Mon Jun 23 12:38:54 2003 Rich Seibel <seibel_r@ociweb.com>
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>
|