X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fserver_nc.c;h=1cf3df8bdc6966b38867b7186eefa283ed45e344;hb=0ea8e006d5f5ef84e31e000607bd24a23f8fc1ed;hp=9b6eefe1fc8a87fd65d9ec4f5baf1312c7d13c06;hpb=1fb0d6c5f735da2f8feb0d3f39bc27a1ff8e2723;p=oweals%2Fgnunet.git diff --git a/src/util/server_nc.c b/src/util/server_nc.c index 9b6eefe1f..1cf3df8bd 100644 --- a/src/util/server_nc.c +++ b/src/util/server_nc.c @@ -33,6 +33,8 @@ #include "gnunet_time_lib.h" +#define DEBUG_SERVER_NC GNUNET_NO + /** * Entry in list of messages pending to be transmitted. */ @@ -146,6 +148,11 @@ handle_client_disconnect (void *cls, struct ClientList *prev; struct PendingMessageList *pml; + if (client == NULL) + { + nc->server = NULL; + return; + } prev = NULL; pos = nc->clients; while (NULL != pos) @@ -167,6 +174,11 @@ handle_client_disconnect (void *cls, GNUNET_free (pml); } GNUNET_SERVER_client_drop (client); + if (pos->th != NULL) + { + GNUNET_CONNECTION_notify_transmit_ready_cancel (pos->th); + pos->th = NULL; + } GNUNET_free (pos); } @@ -210,8 +222,8 @@ GNUNET_SERVER_notification_context_destroy (struct GNUNET_SERVER_NotificationCon while (NULL != (pos = nc->clients)) { nc->clients = pos->next; - GNUNET_SERVER_receive_done (pos->client, GNUNET_NO); GNUNET_SERVER_client_drop (pos->client); + GNUNET_SERVER_receive_done (pos->client, GNUNET_NO); while (NULL != (pml = pos->pending_head)) { pos->pending_head = pml->next; @@ -219,9 +231,10 @@ GNUNET_SERVER_notification_context_destroy (struct GNUNET_SERVER_NotificationCon } GNUNET_free (pos); } - GNUNET_SERVER_disconnect_notify_cancel (nc->server, - &handle_client_disconnect, - nc); + if (nc->server != NULL) + GNUNET_SERVER_disconnect_notify_cancel (nc->server, + &handle_client_disconnect, + nc); GNUNET_free (nc); } @@ -278,12 +291,18 @@ transmit_message (void *cls, while (cl->pending_head != NULL) { pml = cl->pending_head; - cl->pending_head = pml->next; - if (pml->next == NULL) - cl->pending_tail = NULL; msize = ntohs (pml->msg->size); if (size < msize) break; + cl->pending_head = pml->next; + if (pml->next == NULL) + cl->pending_tail = NULL; +#if DEBUG_SERVER_NC + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Copying message of type %u and size %u from pending queue to transmission buffer\n", + ntohs (pml->msg->type), + msize); +#endif memcpy (&cbuf[ret], pml->msg, msize); ret += msize; size -= msize; @@ -319,7 +338,14 @@ do_unicast (struct GNUNET_SERVER_NotificationContext *nc, if ( (client->num_pending > nc->queue_length) && (GNUNET_YES == can_drop) ) - return; /* drop! */ + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Dropping message of type %u and size %u due to full queue (%u entries)\n", + ntohs (msg->type), + ntohs (msg->size), + (unsigned int) nc->queue_length); + return; /* drop! */ + } if (client->num_pending > nc->queue_length) { /* FIXME: consider checking for other messages in the @@ -329,7 +355,14 @@ do_unicast (struct GNUNET_SERVER_NotificationContext *nc, size = ntohs (msg->size); pml = GNUNET_malloc (sizeof (struct PendingMessageList) + size); pml->msg = (const struct GNUNET_MessageHeader*) &pml[1]; - pml->can_drop = can_drop; + pml->can_drop = can_drop; +#if DEBUG_SERVER_NC + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Adding message of type %u and size %u to pending queue (which has %u entries)\n", + ntohs (msg->type), + ntohs (msg->size), + (unsigned int) nc->queue_length); +#endif memcpy (&pml[1], msg, size); /* append */ if (client->pending_tail != NULL)