X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fset%2Fgnunet-service-set.h;h=9e1ffd01ad9a4d6434004ce92389dbb67038daf8;hb=5b32752cd7b02adcb8e6fec7798637638c6f63a0;hp=c226611ffaac37b9e04badc305f3abcc73ac38d9;hpb=44bb721ef043f99e97d60231438b9e71104d99d7;p=oweals%2Fgnunet.git diff --git a/src/set/gnunet-service-set.h b/src/set/gnunet-service-set.h index c226611ff..9e1ffd01a 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, 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 @@ -126,7 +126,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); @@ -165,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, should be initialized by the implementation + * @param op operation that is created by accepting the operation, + * should be initialized by the implementation */ typedef void -(*OpCreateImpl) (struct Operation *op); +(*OpAcceptImpl) (struct Operation *op); + + +/** + * Signature of functions that implement starting the evaluation of + * set operations. + * + * @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 +(*OpEvaluateImpl) (struct Operation *op, + const struct GNUNET_MessageHeader *opaque_context); /** @@ -197,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. @@ -221,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. @@ -247,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; }; @@ -271,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 @@ -296,6 +336,9 @@ struct ElementEntry }; +struct Listener; + + /** * Operation context used to execute a set operation. */ @@ -309,12 +352,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; @@ -326,7 +374,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; @@ -340,6 +390,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. @@ -353,10 +422,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 keep; + 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; }; @@ -407,11 +547,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. */ @@ -424,18 +559,47 @@ 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; }; +extern struct GNUNET_STATISTICS_Handle *_GSS_statistics; + + /** * Destroy the given operation. Call the implementation-specific * cancel function of the operation. Disconnects from the remote @@ -468,4 +632,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