Fawkes API Fawkes Development Version
|
00001 00002 /*************************************************************************** 00003 * notifier.h - BlackBoard notifier 00004 * 00005 * Created: Mon Mar 03 23:25:57 2008 00006 * Copyright 2006-2008 Tim Niemueller [www.niemueller.de] 00007 * 00008 ****************************************************************************/ 00009 00010 /* This program is free software; you can redistribute it and/or modify 00011 * it under the terms of the GNU General Public License as published by 00012 * the Free Software Foundation; either version 2 of the License, or 00013 * (at your option) any later version. A runtime exception applies to 00014 * this software (see LICENSE.GPL_WRE file mentioned below for details). 00015 * 00016 * This program is distributed in the hope that it will be useful, 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 * GNU Library General Public License for more details. 00020 * 00021 * Read the full text in the LICENSE.GPL_WRE file in the doc directory. 00022 */ 00023 00024 #ifndef __BLACKBOARD_NOTIFIER_H_ 00025 #define __BLACKBOARD_NOTIFIER_H_ 00026 00027 #include <blackboard/interface_listener.h> 00028 #include <blackboard/interface_observer.h> 00029 00030 #include <core/utils/rwlock_map.h> 00031 00032 #include <list> 00033 #include <string> 00034 #include <utility> 00035 00036 namespace fawkes { 00037 00038 class Interface; 00039 class Message; 00040 class Mutex; 00041 class WaitCondition; 00042 00043 class BlackBoardNotifier 00044 { 00045 public: 00046 BlackBoardNotifier(); 00047 virtual ~BlackBoardNotifier(); 00048 00049 void register_listener(BlackBoardInterfaceListener *listener, unsigned int flags); 00050 void unregister_listener(BlackBoardInterfaceListener *listener); 00051 00052 void register_observer(BlackBoardInterfaceObserver *observer, unsigned int flags); 00053 void unregister_observer(BlackBoardInterfaceObserver *observer); 00054 00055 void notify_of_data_change(const Interface *interface); 00056 bool notify_of_message_received(const Interface *interface, Message *message); 00057 void notify_of_interface_created(const char *type, const char *id) throw(); 00058 void notify_of_interface_destroyed(const char *type, const char *id) throw(); 00059 void notify_of_writer_added(const Interface *interface, 00060 unsigned int event_instance_serial) throw(); 00061 void notify_of_writer_removed(const Interface *interface, 00062 unsigned int event_instance_serial) throw(); 00063 void notify_of_reader_added(const Interface *interface, 00064 unsigned int event_instance_serial) throw(); 00065 void notify_of_reader_removed(const Interface *interface, 00066 unsigned int event_instance_serial) throw(); 00067 00068 private: 00069 typedef std::list< BlackBoardInterfaceListener * > BBilList; 00070 typedef std::map< std::string, BBilList > BBilMap; 00071 00072 typedef std::pair< bool, BlackBoardInterfaceListener *> BBilQueueEntry; 00073 typedef std::list< BBilQueueEntry > BBilQueue; 00074 00075 typedef std::map< std::string, BlackBoardInterfaceListener * > BBilMessageLockMap; 00076 typedef std::map< std::string, BlackBoardInterfaceListener * >::iterator BBilMessageLockMapIterator; 00077 00078 typedef std::pair<BlackBoardInterfaceObserver *, std::list<std::string> > BBioPair; 00079 typedef std::list< BBioPair> BBioList; 00080 typedef std::map< std::string, BBioList > BBioMap; 00081 00082 // Type to observer, add flags, 0 to remove 00083 typedef std::pair< unsigned int, BlackBoardInterfaceObserver *> BBioQueueEntry; 00084 typedef std::list< BBioQueueEntry > BBioQueue; 00085 00086 typedef BBilList::iterator BBilListIterator; 00087 typedef BBilMap::iterator BBilMapIterator; 00088 00089 typedef BBioList::iterator BBioListIterator; 00090 typedef BBioMap::iterator BBioMapIterator; 00091 00092 void add_listener(BlackBoardInterfaceListener *listener, 00093 BlackBoardInterfaceListener::InterfaceLockMap *im, 00094 BBilMap &ilmap); 00095 00096 void remove_listener(BlackBoardInterfaceListener *listener, 00097 Mutex *mutex, unsigned int events, 00098 BBilQueue &queue, BBilMap &ilmap); 00099 void remove_listener(BBilMap &ifmap, BlackBoardInterfaceListener *listener); 00100 void remove_message_listener(BlackBoardInterfaceListener *listener); 00101 void remove_message_listener_map(BlackBoardInterfaceListener *listener); 00102 00103 void add_observer(BlackBoardInterfaceObserver *observer, 00104 BlackBoardInterfaceObserver::ObservedInterfaceLockMap *its, 00105 BBioMap &bbiomap); 00106 00107 void remove_observer(BBioMap &iomap, BlackBoardInterfaceObserver *observer); 00108 00109 void process_writer_queue(); 00110 void process_reader_queue(); 00111 void process_data_queue(); 00112 void process_bbio_queue(); 00113 00114 BBilMap __bbil_data; 00115 BBilMap __bbil_reader; 00116 BBilMap __bbil_writer; 00117 BBilMessageLockMap __bbil_messages; 00118 00119 Mutex *__bbil_unregister_mutex; 00120 WaitCondition *__bbil_unregister_waitcond; 00121 BBilQueue __bbil_unregister_queue; 00122 00123 Mutex *__bbil_writer_mutex; 00124 WaitCondition *__bbil_writer_waitcond; 00125 unsigned int __bbil_writer_events; 00126 BBilQueue __bbil_writer_queue; 00127 00128 Mutex *__bbil_reader_mutex; 00129 WaitCondition *__bbil_reader_waitcond; 00130 unsigned int __bbil_reader_events; 00131 BBilQueue __bbil_reader_queue; 00132 00133 Mutex *__bbil_data_mutex; 00134 WaitCondition *__bbil_data_waitcond; 00135 unsigned int __bbil_data_events; 00136 BBilQueue __bbil_data_queue; 00137 00138 Mutex *__bbil_messages_mutex; 00139 WaitCondition *__bbil_messages_waitcond; 00140 unsigned int __bbil_messages_events; 00141 BBilQueue __bbil_messages_queue; 00142 00143 BBioMap __bbio_created; 00144 BBioMap __bbio_destroyed; 00145 00146 Mutex *__bbio_mutex; 00147 WaitCondition *__bbio_waitcond; 00148 unsigned int __bbio_events; 00149 BBioQueue __bbio_queue; 00150 00151 }; 00152 00153 } // end namespace fawkes 00154 00155 #endif