fix type error and test cases
[oweals/gnunet.git] / src / set / gnunet-service-set.h
index ab81558834e8a83e3997c106f20e4b386de23c2d..68d8fe81f60a6a75fcffdaa7247765fca3a1ffc8 100644 (file)
@@ -1,6 +1,6 @@
 /*
       This file is part of GNUnet
-      (C) 2013, 2014 Christian Grothoff (and other contributing authors)
+      Copyright (C) 2013, 2014 GNUnet e.V.
 
       GNUnet is free software; you can redistribute it and/or modify
       it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
       You should have received a copy of the GNU General Public License
       along with GNUnet; see the file COPYING.  If not, write to the
-      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-      Boston, MA 02111-1307, USA.
+      Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+      Boston, MA 02110-1301, USA.
 */
 /**
  * @file set/gnunet-service-set.h
@@ -119,6 +119,30 @@ struct OperationSpecification
    * When are elements sent to the client, and which elements are sent?
    */
   enum GNUNET_SET_ResultMode result_mode;
+
+  /**
+   * Always use delta operation instead of sending full sets,
+   * even it it's less efficient.
+   */
+  int force_delta;
+
+  /**
+   * Always send full sets, even if delta operations would
+   * be more efficient.
+   */
+  int force_full;
+
+  /**
+   * #GNUNET_YES to fail operations where Byzantine faults
+   * are suspected
+   */
+  int byzantine;
+
+  /**
+   * Lower bound for the set size, used only when
+   * byzantine mode is enabled.
+   */
+  int byzantine_lower_bound;
 };
 
 
@@ -126,7 +150,7 @@ struct OperationSpecification
  * Signature of functions that create the implementation-specific
  * state for a set supporting a specific operation.
  *
- * @return a set state specific to the supported operation
+ * @return a set state specific to the supported operation, NULL on error
  */
 typedef struct SetState *
 (*CreateImpl) (void);
@@ -211,6 +235,10 @@ typedef void
 (*CancelImpl) (struct Operation *op);
 
 
+typedef struct SetState *
+(*CopyStateImpl) (struct Set *op);
+
+
 /**
  * Dispatch table for a specific set operation.  Every set operation
  * has to implement the callback in this struct.
@@ -261,6 +289,30 @@ struct SetVT
    * Callback for canceling an operation by its ID.
    */
   CancelImpl cancel;
+
+  CopyStateImpl copy_state;
+};
+
+
+/**
+ * MutationEvent gives information about changes
+ * to an element (removal / addition) in a set content.
+ */
+struct MutationEvent
+{
+  /**
+   * First generation affected by this mutation event.
+   *
+   * If @a generation is 0, this mutation event is a list
+   * sentinel element.
+   */
+  unsigned int generation;
+
+  /**
+   * If @a added is #GNUNET_YES, then this is a
+   * `remove` event, otherwise it is an `add` event.
+   */
+  int added;
 };
 
 
@@ -285,22 +337,20 @@ struct ElementEntry
   struct GNUNET_HashCode element_hash;
 
   /**
-   * Generation the element was added by the client.
-   * Operations of earlier generations will not consider the element.
-   */
-  unsigned int generation_added;
-
-  /**
-   * Generation the element was removed by the client.
-   * Operations of later generations will not consider the element.
-   * Only valid if @e removed is #GNUNET_YES.
+   * If @a mutations is not NULL, it contains
+   * a list of mutations, ordered by increasing generation.
+   * The list is terminated by a sentinel event with `generation`
+   * set to 0.
+   *
+   * If @a mutations is NULL, then this element exists in all generations
+   * of the respective set content this element belongs to.
    */
-  unsigned int generation_removed;
+  struct MutationEvent *mutations;
 
   /**
-   * #GNUNET_YES if the element has been removed in some generation.
+   * Number of elements in the array @a mutations.
    */
-  int removed;
+  unsigned int mutations_size;
 
   /**
    * #GNUNET_YES if the element is a remote element, and does not belong
@@ -310,6 +360,9 @@ struct ElementEntry
 };
 
 
+struct Listener;
+
+
 /**
  * Operation context used to execute a set operation.
  */
@@ -323,12 +376,17 @@ struct Operation
   const struct SetVT *vt;
 
   /**
-   * Tunnel to the peer.
+   * Channel to the peer.
    */
   struct GNUNET_CADET_Channel *channel;
 
   /**
-   * Message queue for the tunnel.
+   * Port this operation runs on.
+   */
+  struct Listener *listener;
+
+  /**
+   * Message queue for the channel.
    */
   struct GNUNET_MQ_Handle *mq;
 
@@ -366,7 +424,7 @@ struct Operation
    * Timeout task, if the incoming peer has not been accepted
    * after the timeout, it will be disconnected.
    */
-  GNUNET_SCHEDULER_TaskIdentifier timeout_task;
+  struct GNUNET_SCHEDULER_Task *timeout_task;
 
   /**
    * Unique request id for the request from a remote peer, sent to the
@@ -388,10 +446,81 @@ struct Operation
   unsigned int generation_created;
 
   /**
-   * Set to #GNUNET_YES if the set service should not free the
-   * operation, as it is still needed (e.g. in some scheduled task).
+   * Incremented whenever (during shutdown) some component still
+   * needs to do something with this before the operation is freed.
+   * (Used as a reference counter, but only during termination.)
    */
-  int keep;
+  unsigned int keep;
+};
+
+
+/**
+ * SetContent stores the actual set elements,
+ * which may be shared by multiple generations derived
+ * from one set.
+ */
+struct SetContent
+{
+  /**
+   * Number of references to the content.
+   */
+  unsigned int refcount;
+
+  /**
+   * Maps `struct GNUNET_HashCode *` to `struct ElementEntry *`.
+   */
+  struct GNUNET_CONTAINER_MultiHashMap *elements;
+
+  unsigned int latest_generation;
+
+  /**
+   * Mutations requested by the client that we're
+   * unable to execute right now because we're iterating
+   * over the underlying hash map of elements.
+   */
+  struct PendingMutation *pending_mutations_head;
+
+  /**
+   * Mutations requested by the client that we're
+   * unable to execute right now because we're iterating
+   * over the underlying hash map of elements.
+   */
+  struct PendingMutation *pending_mutations_tail;
+
+  /**
+   * Number of concurrently active iterators.
+   */
+  int iterator_count;
+};
+
+
+struct GenerationRange
+{
+  /**
+   * First generation that is excluded.
+   */
+  unsigned int start;
+
+  /**
+   * Generation after the last excluded generation.
+   */
+  unsigned int end;
+};
+
+
+struct PendingMutation
+{
+  struct PendingMutation *prev;
+  struct PendingMutation *next;
+
+  struct Set *set;
+
+  /**
+   * Message that describes the desired mutation.
+   * May only be a #GNUNET_MESSAGE_TYPE_SET_ADD or
+   * #GNUNET_MESSAGE_TYPE_SET_REMOVE.
+   */
+  struct GNUNET_MessageHeader *mutation_message;
 };
 
 
@@ -415,7 +544,7 @@ struct Set
    * Client that owns the set.  Only one client may own a set,
    * and there can only be one set per client.
    */
-  struct GNUNET_SERVER_Client *client;
+  struct GNUNET_SERVICE_Client *client;
 
   /**
    * Message queue for the client.
@@ -442,11 +571,6 @@ struct Set
    */
   struct GNUNET_CONTAINER_MultiHashMapIterator *iter;
 
-  /**
-   * Maps `struct GNUNET_HashCode *` to `struct ElementEntry *`.
-   */
-  struct GNUNET_CONTAINER_MultiHashMap *elements;
-
   /**
    * Evaluate operations are held in a linked list.
    */
@@ -459,10 +583,20 @@ struct Set
 
   /**
    * Current generation, that is, number of previously executed
-   * operations on this set
+   * operations and lazy copies on the underlying set content.
    */
   unsigned int current_generation;
 
+  /**
+   * List of generations we have to exclude, due to lazy copies.
+   */
+  struct GenerationRange *excluded_generations;
+
+  /**
+   * Number of elements in array @a excluded_generations.
+   */
+  unsigned int excluded_generations_size;
+
   /**
    * Type of operation supported for this set
    */
@@ -474,9 +608,22 @@ struct Set
    */
   uint16_t iteration_id;
 
+  /**
+   * Generation we're currently iteration over.
+   */
+  unsigned int iter_generation;
+
+  /**
+   * Content, possibly shared by multiple sets,
+   * and thus reference counted.
+   */
+  struct SetContent *content;
 };
 
 
+extern struct GNUNET_STATISTICS_Handle *_GSS_statistics;
+
+
 /**
  * Destroy the given operation.  Call the implementation-specific
  * cancel function of the operation.  Disconnects from the remote
@@ -509,4 +656,13 @@ const struct SetVT *
 _GSS_intersection_vt (void);
 
 
+int
+_GSS_is_element_of_set (struct ElementEntry *ee,
+                        struct Set *set);
+
+int
+_GSS_is_element_of_operation (struct ElementEntry *ee,
+                              struct Operation *op);
+
+
 #endif