Index: experimental/c_salt/notification_center.h |
diff --git a/experimental/c_salt/notification_center.h b/experimental/c_salt/notification_center.h |
deleted file mode 100644 |
index 8dcf4ab67948205e1b2b811a196fb8cd5fa20c80..0000000000000000000000000000000000000000 |
--- a/experimental/c_salt/notification_center.h |
+++ /dev/null |
@@ -1,156 +0,0 @@ |
-// Copyright 2010 The Ginsu Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can |
-// be found in the LICENSE file. |
- |
-#ifndef C_SALT_NOTIFICATION_CENTER_H_ |
-#define C_SALT_NOTIFICATION_CENTER_H_ |
- |
-#include <pthread.h> |
- |
-#include <cstddef> |
-#include <map> |
-#include <string> |
- |
-#include "boost/noncopyable.hpp" |
-#include "boost/function.hpp" |
-#include "boost/signals2.hpp" |
-#include "c_salt/instance.h" |
-#include "c_salt/notification_ptrs.h" |
- |
-namespace c_salt { |
-// NotificationCenter is a simple mechanism for broadcasting notifications |
-// within a process. |
-// Objects register with the NotificationCenter as subscribers of notifications |
-// using string identifiers to specify the notification of interest. |
-// Subscribers must subsequently remove themselves if they go out of scope |
-// before the NotificationCenter is deleted, or there will be dangling |
-// references. |
-class NotificationCenter : public boost::noncopyable { |
- public: |
- static const char* const kAnonymousPublisherName; |
- |
- // Return the common NotificationCenter used by |instance|. c_salt objects |
- // that post notifications all post to the DefaultCenter. This call is |
- // mutex locked. |
- static NotificationCenter* DefaultCenter(const c_salt::Instance& instance); |
- |
- NotificationCenter(); |
- virtual ~NotificationCenter(); |
- |
- // Add a subscriber with its method to invoke. The subscriber doesn't have |
- // to be created in the same thread as the NotificationCenter. When a |
- // notification gets published, however, the handler for the notification is |
- // called from the publisher's thread. The |subscriber| gets a copy of the |
- // Notification data when |handler| is called, which can in turn be copied |
- // to another thread. If |publisher_name| is the enpty string, then |
- // |subscriber| will receive notifications named |notification_name| from |
- // any publisher. Otherwise, it will only receive notifications from |
- // calls to PublishNotification() when |publisher_name| matches. |
- // Returns |true| on success. |
- template <typename SubscriberType> |
- bool AddSubscriber(const std::string& notification_name, |
- SubscriberType* subscriber, |
- void (SubscriberType::*handler)(const Notification&), |
- const std::string& publisher_name) { |
- return AddSubscriberImpl(notification_name, |
- CreateSubscriberId(subscriber), |
- boost::bind(handler, subscriber, _1), |
- publisher_name); |
- } |
- |
- // Remove a subscriber from all notifications in the dispatch table. |
- // Returns |true| on success. |
- template <typename SubscriberType> |
- bool RemoveSubscriber(SubscriberType* subscriber) { |
- return RemoveSubscriberImpl(CreateSubscriberId(subscriber)); |
- } |
- |
- // Remove a subscriber from the specified notification. Returns |true| on |
- // success. |
- template <typename SubscriberType> |
- bool RemoveSubscriberFromNotification( |
- SubscriberType* subscriber, |
- const std::string& notification_name) { |
- return RemoveSubscriberFromNotificationImpl(CreateSubscriberId(subscriber), |
- notification_name); |
- } |
- // Remove all subscribers from a specified notification and then remove the |
- // notification. Future calls to PostNotification() to |notification_name| |
- // will have no effect. Returns |true| on success. |
- bool RemoveNotification(const std::string& notification_name); |
- |
- // Publish a notification to be dispatched, specifying notification-specific |
- // data. Publishing all happens on a single thread, all subscribers are |
- // signaled on the calling thread. To further process a notification on |
- // another thread you have to do the inter-thread communication yourself. |
- // Returns |true| on success. |
- bool PublishNotification(const std::string& notification_name, |
- const Notification& notification, |
- const std::string& publisher_name); |
- |
- private: |
- typedef boost::signals2::signal<void(const Notification&)> NotificationSignal; |
- typedef boost::shared_ptr<NotificationSignal> SharedNotificationSignal; |
- // Map publisher ids to a set of boost::signals. This map is used when |
- // publishing a notification. Note that boost::signals2::signal<> has no |
- // copy ctor, so this dictionary has to use shared_ptrs. |
- typedef std::map<std::string, SharedNotificationSignal> PublisherSignalDict; |
- typedef std::map<uint64_t, std::vector<boost::signals2::connection> > |
- ConnectionDict; |
- |
- // A small helper class that holds the signal and the function which gets |
- // fired during PublishNotification(). A notification is published by firing |
- // a signal; there are two possible signals, one that is always fired which |
- // publishes a notification to subscribers of any publisher, and then another |
- // signal which is fired only if the publisher's id exists in the publisher |
- // ==> signal dictionary. In this way, every subscriber that wants |
- // notifications from either any publisher or from a specific publisher will |
- // get notified. Each NotificationSlot also holds a dictionary which maps |
- // subscriber_id ==> vector<connections>. This is done to support the |
- // RemoveSubscriber(SubscriberType) and to support disconnection of a |
- // boost::signals2::signal without relying on the peculiar equality semantics |
- // of boost::function in boost::signals. |
- struct NotificationSlot { |
- // Dtor disconnects all the signals in |connections_|. Assumes that any |
- // necessary mutex locking has been done by the caller. |
- ~NotificationSlot(); |
- |
- // Disconnect all the signals connected to the subscriber represented by |
- // this NotificationSlot. Assumes that any necessary mutex locking has |
- // been done by the caller. |
- void DisconnectSubscriber(uint64_t subscriber_id); |
- void DisconnectAll(const ConnectionDict::iterator& conn_iter); |
- |
- // This signal set is fired every time PublishNotification() is called, |
- // and will notify all subscribers to any publisher. |
- NotificationSignal any_publisher_signal_; |
- // Fire the signal set from this dictionary that matches |publisher_id_|. |
- PublisherSignalDict publisher_signals_; |
- ConnectionDict connections_; |
- }; |
- typedef boost::shared_ptr<NotificationSlot> SharedNotificationSlot; |
- typedef std::map<std::string, SharedNotificationSlot> NotificationDict; |
- |
- // Return a unique hash id for |subscriber|. This function has to return a |
- // unique id for each subscriber. |
- template <typename SubscriberType> |
- uint64_t CreateSubscriberId(SubscriberType* subscriber) const { |
- return reinterpret_cast<uint64_t>(subscriber); |
- } |
- |
- // The implementation behind the template methods. |
- bool AddSubscriberImpl( |
- const std::string& notification_name, |
- uint64_t subscriber_id, |
- boost::function<void(const Notification&)> subscriber_functor, |
- const std::string& publisher_name); |
- bool RemoveSubscriberImpl(uint64_t subscriber_id); |
- bool RemoveSubscriberFromNotificationImpl( |
- uint64_t subscriber_id, |
- const std::string& notification_name); |
- |
- mutable pthread_mutex_t mutex_; |
- NotificationDict notifications_; |
-}; |
-} // namespace c_salt |
-#endif // C_SALT_NOTIFICATION_CENTER_H_ |