added vsignal todo
[strongswan.git] / src / charon / bus / bus.h
index 974d460..6138c25 100644 (file)
@@ -39,14 +39,18 @@ typedef struct bus_t bus_t;
  *
  * Signaling is for different purporses. First, it allows debugging via
  * "debugging signal messages", sencondly, it allows to follow certain
- * mechanisms currently going on in the daemon. As we are multithreaded, 
- * and of multiple transactions are involved, it's not possible to follow
+ * mechanisms currently going on in the daemon. As we are multithreaded,
+ * and multiple transactions are involved, it's not possible to follow
  * one connection setup without further infrastructure. These infrastructure
  * is provided by the bus and the signals the daemon emits to the bus.
  *
  * There are different scenarios to follow these signals, but all have
  * the same scheme. First, a START signal is emitted to indicate the daemon
- * has started to 
+ * has started to do something. After a start signal, a SUCCESS or a FAILED
+ * signal of the same type follows. This allows to track the operation. Any
+ * Debug signal betwee a START and a SUCCESS/FAILED belongs to that operation
+ * if the IKE_SA is the same. The thread may change, as multiple threads
+ * may be involved in a complex scenario.
  *
  * @ingroup bus
  */
@@ -224,6 +228,8 @@ struct bus_listener_t {
         * an additional informational or error message with a printf() like
         * variable argument list. This is in the va_list form, as forwarding
         * a "..." parameters to functions is not (cleanly) possible.
+        * The implementing signal function returns TRUE to stay registered
+        * to the bus, or FALSE to unregister itself.
         *
         * @param this          listener
         * @param singal        kind of the signal (up, down, rekeyed, ...)
@@ -232,8 +238,9 @@ struct bus_listener_t {
         * @param ike_sa        IKE_SA associated to the event
         * @param format        printf() style format string
         * @param args          vprintf() style va_list argument list
+        " @return                      TRUE to stay registered, FALSE to unregister
         */
-       void (*signal) (bus_listener_t *this, signal_t signal, level_t level,
+       bool (*signal) (bus_listener_t *this, signal_t signal, level_t level,
                                        int thread, ike_sa_t *ike_sa, char* format, va_list args);
 };
 
@@ -244,7 +251,9 @@ struct bus_listener_t {
  * in receiving event signals registers at the bus. Any signals sent to
  * are delivered to all registered listeners.
  * To deliver signals to threads, the blocking listen() call may be used
- * to wait for a signal.
+ * to wait for a signal. However, passive listeners should be preferred,
+ * as listening actively requires some synchronization overhead as data
+ * must be passed from the raising thread to the listening thread.
  *
  * @ingroup bus
  */
@@ -263,6 +272,14 @@ struct bus_t {
        void (*add_listener) (bus_t *this, bus_listener_t *listener);
        
        /**
+        * @brief Unregister a listener from the bus.
+        *
+        * @param this          bus
+        * @param listener      listener to unregister.
+        */
+       void (*remove_listener) (bus_t *this, bus_listener_t *listener);
+       
+       /**
         * @brief Listen actively on the bus.
         *
         * As we are fully multithreaded, we must provide a mechanism
@@ -272,6 +289,9 @@ struct bus_t {
         * it processes a signal, registration is required. This is done through
         * the set_listen_state() method, see below.
         *
+        * The listen() function is (has) a thread cancellation point, so you might
+        * want to register cleanup handlers.
+        *
         * @param this          bus
         * @param level         verbosity level of the signal
         * @param thread        receives thread number emitted the signal
@@ -290,7 +310,7 @@ struct bus_t {
         * must register themself to the bus before starting to listen(). When
         * a signal occurs, the emitter waits until all threads with listen_state
         * TRUE are waiting in the listen() method to process the signal.
-        * It is important that a thread with liste_state TRUE calls listen()
+        * It is important that a thread with listen_state TRUE calls listen()
         * periodically, or sets it's listening state to FALSE; otherwise
         * all signal emitting threads get blocked on the bus.
         *
@@ -335,6 +355,10 @@ struct bus_t {
         *
         * Same as bus_t.signal(), but uses va_list argument list.
         *
+        * @todo Improve performace of vsignal implementation. This method is
+        * called extensively and therefore shouldn't allocate heap memory or
+        * do other expensive tasks!
+        *
         * @param this          bus
         * @param singal        kind of the signal (up, down, rekeyed, ...)
         * @param level         verbosity level of the signal