Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef ROUTING_SLIP_PERSISTENCE_MANAGER_H
00018 #define ROUTING_SLIP_PERSISTENCE_MANAGER_H
00019 #include "ace/pre.h"
00020
00021 #include "orbsvcs/Notify/notify_serv_export.h"
00022
00023 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00024 #pragma once
00025 #endif
00026
00027 #include "tao/Versioned_Namespace.h"
00028 #include "tao/orbconf.h"
00029 #include "ace/Message_Block.h"
00030 #include "ace/Synch_T.h"
00031 #include "ace/Containers_T.h"
00032
00033 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00034
00035 namespace TAO_Notify
00036 {
00037
00038 class Standard_Event_Persistence_Factory;
00039 class Persistent_File_Allocator;
00040 class Persistent_Storage_Block;
00041 class Persistent_Callback;
00042
00043
00044
00045
00046
00047
00048
00049
00050 class TAO_Notify_Serv_Export Routing_Slip_Persistence_Manager
00051 {
00052 public:
00053
00054 typedef ACE_UINT64 Block_Serial_Number;
00055
00056 typedef ACE_UINT32 Block_Number;
00057
00058 typedef ACE_UINT16 Block_Size;
00059
00060 typedef ACE_UINT16 Block_Type;
00061
00062
00063 Routing_Slip_Persistence_Manager(Standard_Event_Persistence_Factory* factory);
00064
00065
00066 ~Routing_Slip_Persistence_Manager();
00067
00068
00069 void set_callback(Persistent_Callback* callback);
00070
00071
00072 bool store(const ACE_Message_Block& event,
00073 const ACE_Message_Block& routing_slip);
00074
00075
00076
00077
00078
00079
00080 bool update(const ACE_Message_Block& routing_slip);
00081
00082
00083
00084 bool remove();
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 bool reload(ACE_Message_Block*& event, ACE_Message_Block*&routing_slip);
00096
00097
00098
00099
00100
00101
00102 Routing_Slip_Persistence_Manager * load_next ();
00103
00104
00105
00106
00107
00108
00109 bool store_root();
00110
00111
00112
00113
00114 bool load(Block_Number block_number, Block_Serial_Number expected_serial_number);
00115
00116
00117 bool is_root () const;
00118
00119
00120 void release_all ();
00121
00122 private:
00123
00124
00125
00126 class Block_Header
00127 {
00128 public:
00129 enum Header_Type {
00130 BT_Routing_Slip,
00131 BT_Event,
00132 BT_Overflow
00133 };
00134
00135 Block_Header(Header_Type type);
00136 virtual ~Block_Header (void);
00137 virtual size_t extract_header(Persistent_Storage_Block& psb,
00138 size_t offset = 0);
00139 virtual size_t put_header(Persistent_Storage_Block& psb,
00140 size_t offset = 0);
00141
00142 public:
00143
00144 Block_Serial_Number serial_number;
00145
00146 Block_Number next_overflow;
00147
00148 Block_Type header_type;
00149
00150 Block_Size data_size;
00151 };
00152
00153
00154
00155
00156 class Routing_Slip_Header : public Block_Header
00157 {
00158 public:
00159 Routing_Slip_Header();
00160 virtual size_t extract_header(Persistent_Storage_Block& psb,
00161 size_t offset = 0);
00162 virtual size_t put_header(Persistent_Storage_Block& psb,
00163 size_t offset = 0);
00164
00165 public:
00166
00167 Block_Number next_routing_slip_block;
00168
00169 Block_Serial_Number next_serial_number;
00170 Block_Number event_block;
00171 };
00172
00173
00174
00175
00176 class Event_Header : public Block_Header
00177 {
00178 public:
00179 Event_Header ();
00180 };
00181
00182
00183
00184
00185
00186
00187 class Overflow_Header : public Block_Header
00188 {
00189 public:
00190 Overflow_Header ();
00191 };
00192
00193 bool store_i(const ACE_Message_Block& event,
00194 const ACE_Message_Block& routing_slip);
00195
00196 bool update_i(const ACE_Message_Block& routing_slip);
00197
00198 bool store_event(const ACE_Message_Block& event);
00199
00200
00201
00202 size_t fill_block(Persistent_Storage_Block& psb,
00203 size_t offset_into_block, const ACE_Message_Block* data,
00204 size_t offset_into_msg);
00205 size_t fill_block(Persistent_Storage_Block& psb,
00206 size_t offset_into_block, unsigned char* data,
00207 size_t data_size);
00208
00209
00210 bool build_chain(
00211 Persistent_Storage_Block* first_block,
00212 Block_Header& first_header,
00213 ACE_Unbounded_Stack<size_t>& allocated_blocks,
00214 const ACE_Message_Block& data);
00215
00216
00217 bool reload_chain(Persistent_Storage_Block* first_block,
00218 Block_Header& first_header,
00219 ACE_Unbounded_Stack<size_t>& allocated_blocks,
00220 ACE_Message_Block* amb,
00221 ACE_UINT64 expected_serial_number);
00222
00223
00224 bool update_next_manager(Routing_Slip_Persistence_Manager* next);
00225
00226
00227 bool persisted();
00228
00229
00230 size_t write_first_routing_slip_block(bool prepare_only = false);
00231
00232
00233 void dllist_push_back();
00234
00235 void insert_before (Routing_Slip_Persistence_Manager * node);
00236
00237
00238 void remove_from_dllist();
00239
00240 private:
00241 TAO_SYNCH_MUTEX lock_;
00242 bool removed_;
00243 ACE_UINT64 serial_number_;
00244 Persistent_File_Allocator* allocator_;
00245 Standard_Event_Persistence_Factory* factory_;
00246 Event_Header event_header_;
00247 Routing_Slip_Header routing_slip_header_;
00248 Persistent_Storage_Block* first_event_block_;
00249 Persistent_Storage_Block* first_routing_slip_block_;
00250
00251 Routing_Slip_Persistence_Manager* prev_manager_;
00252 Routing_Slip_Persistence_Manager* next_manager_;
00253 ACE_Unbounded_Stack<size_t> allocated_event_blocks_;
00254 ACE_Unbounded_Stack<size_t> allocated_routing_slip_blocks_;
00255 Persistent_Callback* callback_;
00256
00257
00258 ACE_Message_Block * event_mb_;
00259 ACE_Message_Block * routing_slip_mb_;
00260 };
00261
00262 }
00263
00264 TAO_END_VERSIONED_NAMESPACE_DECL
00265
00266 #include "ace/post.h"
00267 #endif