00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <blackboard/local.h>
00025 #include <blackboard/bbconfig.h>
00026 #include <blackboard/internal/message_manager.h>
00027 #include <blackboard/internal/memory_manager.h>
00028 #include <blackboard/internal/interface_manager.h>
00029 #include <blackboard/internal/notifier.h>
00030 #include <blackboard/net/handler.h>
00031
00032
00033 #include <utils/ipc/shm.h>
00034 #include <blackboard/shmem/header.h>
00035 #include <blackboard/shmem/lister.h>
00036
00037 #include <string>
00038 #include <cstring>
00039
00040 namespace fawkes {
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 LocalBlackBoard::LocalBlackBoard(size_t memsize,
00058 const char *magic_token, bool master)
00059 {
00060 __memmgr = new BlackBoardMemoryManager(memsize, BLACKBOARD_VERSION, master);
00061
00062 __notifier = new BlackBoardNotifier();
00063 __msgmgr = new BlackBoardMessageManager(__notifier);
00064 __im = new BlackBoardInterfaceManager(__memmgr, __msgmgr, __notifier);
00065
00066 __msgmgr->set_interface_manager(__im);
00067
00068 __nethandler = NULL;
00069 }
00070
00071
00072
00073
00074
00075 LocalBlackBoard::LocalBlackBoard(size_t memsize)
00076 {
00077 __memmgr = new BlackBoardMemoryManager(memsize);
00078
00079 __notifier = new BlackBoardNotifier();
00080 __msgmgr = new BlackBoardMessageManager(__notifier);
00081 __im = new BlackBoardInterfaceManager(__memmgr, __msgmgr, __notifier);
00082
00083 __msgmgr->set_interface_manager(__im);
00084
00085 __nethandler = NULL;
00086 }
00087
00088
00089
00090 LocalBlackBoard::~LocalBlackBoard()
00091 {
00092 if ( __nethandler ) {
00093 __nethandler->cancel();
00094 __nethandler->join();
00095 delete __nethandler;
00096 }
00097 delete __im;
00098 delete __msgmgr;
00099 delete __memmgr;
00100 delete __notifier;
00101 }
00102
00103
00104 Interface *
00105 LocalBlackBoard::open_for_reading(const char *type, const char *identifier)
00106 {
00107 try {
00108 return __im->open_for_reading(type, identifier);
00109 } catch (Exception &e) {
00110 throw;
00111 }
00112 }
00113
00114
00115 Interface *
00116 LocalBlackBoard::open_for_writing(const char *type, const char *identifier)
00117 {
00118 try {
00119 return __im->open_for_writing(type, identifier);
00120 } catch (Exception &e) {
00121 throw;
00122 }
00123 }
00124
00125
00126 std::list<Interface *>
00127 LocalBlackBoard::open_multiple_for_reading(const char *type, const char *id_pattern)
00128 {
00129 try {
00130 return __im->open_multiple_for_reading(type, id_pattern);
00131 } catch (Exception &e) {
00132 throw;
00133 }
00134 }
00135
00136
00137 void
00138 LocalBlackBoard::close(Interface *interface)
00139 {
00140 __im->close(interface);
00141 }
00142
00143
00144 InterfaceInfoList *
00145 LocalBlackBoard::list_all()
00146 {
00147 return __im->list_all();
00148 }
00149
00150
00151 bool
00152 LocalBlackBoard::is_alive() const throw()
00153 {
00154 return true;
00155 }
00156
00157
00158 bool
00159 LocalBlackBoard::try_aliveness_restore() throw()
00160 {
00161 return true;
00162 }
00163
00164 void
00165 LocalBlackBoard::register_listener(BlackBoardInterfaceListener *listener, unsigned int flags)
00166 {
00167 __notifier->register_listener(listener, flags);
00168 }
00169
00170
00171 void
00172 LocalBlackBoard::unregister_listener(BlackBoardInterfaceListener *listener)
00173 {
00174 __notifier->unregister_listener(listener);
00175 }
00176
00177
00178 void
00179 LocalBlackBoard::register_observer(BlackBoardInterfaceObserver *observer, unsigned int flags)
00180 {
00181 __notifier->register_observer(observer, flags);
00182 }
00183
00184
00185 void
00186 LocalBlackBoard::unregister_observer(BlackBoardInterfaceObserver *observer)
00187 {
00188 __notifier->unregister_observer(observer);
00189 }
00190
00191
00192
00193
00194
00195
00196
00197
00198 void
00199 LocalBlackBoard::cleanup(const char *magic_token, bool use_lister)
00200 {
00201 BlackBoardSharedMemoryHeader *bbsh = new BlackBoardSharedMemoryHeader( BLACKBOARD_VERSION );
00202 BlackBoardSharedMemoryLister *bblister = NULL;
00203 if ( use_lister ) {
00204 bblister = new BlackBoardSharedMemoryLister();
00205 }
00206 SharedMemory::erase_orphaned(magic_token, bbsh, bblister);
00207 delete bblister;
00208 delete bbsh;
00209 }
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219 const BlackBoardMemoryManager *
00220 LocalBlackBoard::memory_manager() const
00221 {
00222 return __memmgr;
00223 }
00224
00225
00226
00227
00228
00229
00230 void
00231 LocalBlackBoard::start_nethandler(FawkesNetworkHub *hub)
00232 {
00233 if ( __nethandler ) {
00234 throw Exception("BlackBoardNetworkHandler already started");
00235 }
00236 __nethandler = new BlackBoardNetworkHandler(this, hub);
00237 __nethandler->start();
00238 }
00239
00240 }