diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.cpp | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.cpp b/TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.cpp new file mode 100644 index 00000000000..65389ef7c35 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.cpp @@ -0,0 +1,234 @@ +// $Id$ + +#include "orbsvcs/Notify/Standard_Event_Persistence.h" +#include "orbsvcs/Notify/Persistent_File_Allocator.h" +#include "tao/debug.h" +#include "ace/Dynamic_Service.h" +#include "ace/OS_NS_strings.h" + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +namespace TAO_Notify +{ + +Standard_Event_Persistence::Standard_Event_Persistence () + : filename_ (ACE_TEXT ("__PERSISTENT_EVENT__.DB")) + , block_size_ (512) + , factory_ (0) +{ +} + +Standard_Event_Persistence::~Standard_Event_Persistence () +{ +} + +// get the current factory, creating it if necessary +Event_Persistence_Factory * +Standard_Event_Persistence::get_factory () +{ + //@@todo guard? ; doublecheck? + if (this->factory_ == 0) + { + ACE_NEW_NORETURN ( + this->factory_, + Standard_Event_Persistence_Factory () + ); + if (this->factory_ != 0) + { + if (!this->factory_->open (this->filename_.c_str ())) + { + this->factory_ = 0; + } + } + } + return this->factory_; +} + +// release the current factory so a new one can be created +void +Standard_Event_Persistence::reset () +{ + delete this->factory_; + this->factory_ = 0; +} + +int +Standard_Event_Persistence::init (int argc, ACE_TCHAR *argv[]) +{ + int result = 0; + bool verbose = false; + for (int narg = 0; narg < argc; ++narg) + { + ACE_TCHAR * av = argv[narg]; + if (ACE_OS::strcasecmp (av, ACE_TEXT ("-v")) == 0) + { + verbose = true; + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%P|%t) Standard_Event_Persistence: -verbose\n") + )); + } + else if (ACE_OS::strcasecmp (av, ACE_TEXT ("-file_path")) == 0 && narg + 1 < argc) + { + this->filename_ = argv[narg + 1]; + if (TAO_debug_level > 0 || verbose) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%P|%t) Standard_Event_Persistence: Setting -file_path: %s\n"), + this->filename_.c_str () + )); + } + narg += 1; + } + else if (ACE_OS::strcasecmp (av, ACE_TEXT ("-block_size")) == 0 && narg + 1 < argc) + { + this->block_size_ = ACE_OS::atoi(argv[narg + 1]); + if (TAO_debug_level > 0 || verbose) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%P|%t) Standard_Event_Persistence: Setting -block_size: %d\n"), + this->block_size_ + )); + } + narg += 1; + } + else + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("(%P|%t) Unknown parameter to Standard Event Persistence: %s\n"), + argv[narg] + )); + result = -1; + } + } + return result; +} + +int +Standard_Event_Persistence::fini () +{ + delete this->factory_; + this->factory_ = 0; + return 0; +} + +Standard_Event_Persistence_Factory::Standard_Event_Persistence_Factory () + : allocator_() + , root_(this) + , psb_(0) + , serial_number_(ROUTING_SLIP_ROOT_SERIAL_NUMBER + 1) + , is_reloading_ (false) +{ +} + +bool +Standard_Event_Persistence_Factory::open (const ACE_TCHAR* filename, + ACE_UINT32 block_size) +{ + bool result = false; + if (allocator_.open (filename, block_size)) + { + this->is_reloading_ = this->root_.load(ROUTING_SLIP_ROOT_BLOCK_NUMBER, ROUTING_SLIP_ROOT_SERIAL_NUMBER); + if (! this->is_reloading_) + { + ACE_ASSERT (this->psb_ == 0); +// this->psb_ = this->allocator_.allocate(); + this->root_.store_root(); + } + result = true; + } + return result; +} + +Standard_Event_Persistence_Factory::~Standard_Event_Persistence_Factory() +{ + if (TAO_debug_level > 0) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%P|%t) Standard_Event_Persistence_Factory::~Standard_Event_Persistence_Factory\n") + )); + } + this->root_.release_all (); + delete this->psb_; + this->psb_ = 0; + this->allocator_.shutdown(); +} + +Routing_Slip_Persistence_Manager* +Standard_Event_Persistence_Factory::create_routing_slip_persistence_manager( + Persistent_Callback* callback) +{ + Routing_Slip_Persistence_Manager* rspm = 0; + ACE_NEW_RETURN(rspm, Routing_Slip_Persistence_Manager(this), rspm); + rspm->set_callback(callback); + return rspm; +} + +Routing_Slip_Persistence_Manager * +Standard_Event_Persistence_Factory::first_reload_manager() +{ + Routing_Slip_Persistence_Manager * result = 0; + if (this->is_reloading_) + { + result = this->root_.load_next(); + } + return result; +} + +void +Standard_Event_Persistence_Factory::done_reloading( + Persistent_Storage_Block * next_psb, + ACE_UINT64 current_serial_number) +{ + ACE_ASSERT (this->psb_ == 0); + this->psb_ = next_psb; + this->serial_number_ = current_serial_number; + this->is_reloading_ = false; +} + +void +Standard_Event_Persistence_Factory::preallocate_next_record( + ACE_UINT64& current_serial_number, + Persistent_Storage_Block*& current_psb, + ACE_UINT64& next_serial_number, + ACE_UINT32& next_block_number) +{ + // return current serial number and + // a psb containing current record number + current_serial_number = this->serial_number_; + this->psb_->set_allocator_owns(false); // give up ownership + this->psb_->set_sync(); + current_psb = this->psb_; + this->get_preallocated_pointer (next_serial_number, next_block_number); +} + +void +Standard_Event_Persistence_Factory::get_preallocated_pointer( + ACE_UINT64& next_serial_number, + ACE_UINT32& next_block_number) +{ + ++this->serial_number_; + this->psb_ = this->allocator_.allocate(); + + next_serial_number = this->serial_number_; + next_block_number = this->psb_->block_number(); +} + +Persistent_File_Allocator* +Standard_Event_Persistence_Factory::allocator() +{ + return &this->allocator_; +} + +Routing_Slip_Persistence_Manager & +Standard_Event_Persistence_Factory::root() +{ + return this->root_; +} + +} // End TAO_Notify_Namespace + +TAO_END_VERSIONED_NAMESPACE_DECL + +ACE_FACTORY_NAMESPACE_DEFINE (TAO_Notify_Serv, + TAO_Notify_Standard_Event_Persistence, + TAO_Notify::Standard_Event_Persistence) |