X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fset%2Fgnunet-service-set.h;h=bc3052f02ed6dda644a72018df3ead84afb495cc;hb=4dcb414e2faabc800577c25dec3b63e3ceaaa84b;hp=b92eb47ff1bb61cbfd9b75d3bc6c160ced2e13ee;hpb=82f034f771b4fd8e18c61487f4bd239e0e200408;p=oweals%2Fgnunet.git diff --git a/src/set/gnunet-service-set.h b/src/set/gnunet-service-set.h index b92eb47ff..bc3052f02 100644 --- a/src/set/gnunet-service-set.h +++ b/src/set/gnunet-service-set.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet - (C) 2013 Christian Grothoff (and other contributing authors) + Copyright (C) 2013, 2014 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,10 +14,9 @@ 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 * @brief common components for the implementation the different set operations @@ -166,13 +165,27 @@ typedef void /** - * Signature of functions that implement the creation of set operations - * (currently "evaluate" and "accept"). + * Signature of functions that implement accepting a set operation. + * + * @param op operation that is created by accepting the operation, + * should be initialized by the implementation + */ +typedef void +(*OpAcceptImpl) (struct Operation *op); + + +/** + * Signature of functions that implement starting the evaluation of + * set operations. * - * @param op operation that is created, should be initialized by the implementation + * @param op operation that is created, should be initialized to + * begin the evaluation + * @param opaque_context message to be transmitted to the listener + * to convince him to accept, may be NULL */ typedef void -(*OpCreateImpl) (struct Operation *op); +(*OpEvaluateImpl) (struct Operation *op, + const struct GNUNET_MessageHeader *opaque_context); /** @@ -198,6 +211,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. @@ -222,12 +239,12 @@ struct SetVT /** * Callback for accepting a set operation request */ - OpCreateImpl accept; + OpAcceptImpl accept; /** * Callback for starting evaluation with a remote peer. */ - OpCreateImpl evaluate; + OpEvaluateImpl evaluate; /** * Callback for destruction of the set state. @@ -248,6 +265,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; }; @@ -272,22 +313,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,12 +349,12 @@ struct Operation const struct SetVT *vt; /** - * Tunnel to the peer. + * Channel to the peer. */ struct GNUNET_CADET_Channel *channel; /** - * Message queue for the tunnel. + * Message queue for the channel. */ struct GNUNET_MQ_Handle *mq; @@ -327,7 +366,9 @@ struct Operation struct OperationSpecification *spec; /** - * Operation-specific operation state. + * Operation-specific operation state. Note that the exact + * type depends on this being a union or intersection operation + * (and thus on @e vt). */ struct OperationState *state; @@ -341,6 +382,25 @@ struct Operation */ struct Operation *prev; + /** + * The identity of the requesting peer. Needs to + * be stored here as the op spec might not have been created yet. + */ + struct GNUNET_PeerIdentity peer; + + /** + * Timeout task, if the incoming peer has not been accepted + * after the timeout, it will be disconnected. + */ + struct GNUNET_SCHEDULER_Task *timeout_task; + + /** + * Unique request id for the request from a remote peer, sent to the + * client, which will accept or reject the request. Set to '0' iff + * the request has not been suggested yet. + */ + uint32_t suggest_id; + /** * #GNUNET_YES if this is not a "real" set operation yet, and we still * need to wait for the other peer to give us more details. @@ -354,10 +414,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.) + */ + 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. */ - int keep; + struct GNUNET_MessageHeader *mutation_message; }; @@ -408,11 +539,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. */ @@ -425,15 +551,41 @@ 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 */ enum GNUNET_SET_OperationType operation; + /** + * Each @e iter is assigned a unique number, so that the client + * can distinguish iterations. + */ + 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; }; @@ -444,9 +596,11 @@ struct Set * operations per set. * * @param op operation to destroy + * @param gc #GNUNET_YES to perform garbage collection on the set */ void -_GSS_operation_destroy (struct Operation *op); +_GSS_operation_destroy (struct Operation *op, + int gc); /** @@ -467,4 +621,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