X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fset%2Fgnunet-service-set.c;h=e9555928a2ece493d0025b1a64c3bc3751227038;hb=29e6158507a0758192075ac6ece7ba8e75ddc49a;hp=986f52982e20b6bc0f4b66b92cfea99e802a81f1;hpb=a11e17158609766f29c40de6daecf5ce02b38e6c;p=oweals%2Fgnunet.git diff --git a/src/set/gnunet-service-set.c b/src/set/gnunet-service-set.c index 986f52982..e9555928a 100644 --- a/src/set/gnunet-service-set.c +++ b/src/set/gnunet-service-set.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet - Copyright (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 @@ -25,6 +25,7 @@ */ #include "gnunet-service-set.h" #include "gnunet-service-set_protocol.h" +#include "gnunet_statistics_service.h" /** * How long do we hold on to an incoming channel if there is @@ -137,6 +138,11 @@ static uint32_t lazy_copy_cookie = 1; */ static uint32_t suggest_id = 1; +/** + * Statistics handle. + */ +struct GNUNET_STATISTICS_Handle *_GSS_statistics; + /** * Get set that is owned by the given client, if any. @@ -821,13 +827,13 @@ execute_add (struct Set *set, msg = (const struct GNUNET_SET_ElementMessage *) m; el.size = ntohs (m->size) - sizeof *msg; + el.data = &msg[1]; + el.element_type = ntohs (msg->element_type); + GNUNET_SET_element_hash (&el, &hash); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Client inserts element of size %u\n", + "Client inserts element %s of size %u\n", + GNUNET_h2s (&hash), el.size); - el.data = &msg[1]; - GNUNET_CRYPTO_hash (el.data, - el.size, - &hash); ee = GNUNET_CONTAINER_multihashmap_get (set->content->elements, &hash); @@ -840,6 +846,7 @@ execute_add (struct Set *set, el.data, el.size); ee->element.data = &ee[1]; + ee->element.element_type = el.element_type; ee->remote = GNUNET_NO; ee->mutations = NULL; ee->mutations_size = 0; @@ -885,9 +892,8 @@ execute_remove (struct Set *set, "Client removes element of size %u\n", el.size); el.data = &msg[1]; - GNUNET_CRYPTO_hash (el.data, - el.size, - &hash); + el.element_type = ntohs (msg->element_type); + GNUNET_SET_element_hash (&el, &hash); ee = GNUNET_CONTAINER_multihashmap_get (set->content->elements, &hash); if (NULL == ee) @@ -969,7 +975,7 @@ again: GNUNET_CONTAINER_multihashmap_iterator_destroy (set->iter); set->iter = NULL; set->iteration_id++; - + GNUNET_assert (set->content->iterator_count > 0); set->content->iterator_count -= 1; @@ -1009,7 +1015,7 @@ again: memcpy (&msg[1], ee->element.data, ee->element.size); - msg->element_type = ee->element.element_type; + msg->element_type = htons (ee->element.element_type); msg->iteration_id = htons (set->iteration_id); } GNUNET_MQ_send (set->client_mq, ev); @@ -1107,6 +1113,13 @@ handle_client_create_set (void *cls, } set->operation = ntohl (msg->operation); set->state = set->vt->create (); + if (NULL == set->state) + { + /* initialization failed (i.e. out of memory) */ + GNUNET_free (set); + GNUNET_SERVER_client_disconnect (client); + return; + } set->content = GNUNET_new (struct SetContent); set->content->refcount = 1; set->content->elements = GNUNET_CONTAINER_multihashmap_create (1, GNUNET_YES); @@ -1491,7 +1504,7 @@ handle_client_copy_lazy_connect (void *cls, { found = GNUNET_YES; break; - } + } } if (GNUNET_NO == found) @@ -1700,8 +1713,7 @@ handle_client_accept (void *cls, * @param tc context information (why was this task triggered now) */ static void -shutdown_task (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +shutdown_task (void *cls) { while (NULL != incoming_head) incoming_destroy (incoming_head); @@ -1717,6 +1729,7 @@ shutdown_task (void *cls, GNUNET_CADET_disconnect (cadet); cadet = NULL; } + GNUNET_STATISTICS_destroy (_GSS_statistics, GNUNET_YES); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "handled shutdown request\n"); } @@ -1733,13 +1746,14 @@ shutdown_task (void *cls, * @param tc context information (why was this task triggered now) */ static void -incoming_timeout_cb (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +incoming_timeout_cb (void *cls) { struct Operation *incoming = cls; + const struct GNUNET_SCHEDULER_TaskContext *tc; incoming->timeout_task = NULL; GNUNET_assert (GNUNET_YES == incoming->is_incoming); + tc = GNUNET_SCHEDULER_get_task_context (); if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) return; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -1974,6 +1988,7 @@ run (void *cls, { &dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENT_REQUESTS, 0}, { &dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_UNION_P2P_DONE, 0}, { &dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_UNION_P2P_SE, 0}, + { &dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_UNION_P2P_SEC, 0}, { &dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_ELEMENT_INFO, 0}, { &dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF, 0}, { &dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_DONE, 0}, @@ -1988,6 +2003,7 @@ run (void *cls, &handle_client_disconnect, NULL); GNUNET_SERVER_add_handlers (server, server_handlers); + _GSS_statistics = GNUNET_STATISTICS_create ("set", cfg); cadet = GNUNET_CADET_connect (cfg, NULL, &channel_new_cb, &channel_end_cb,