/*
This file is part of GNUnet
- (C) 2008--2013 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2008--2013 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
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.
*/
/**
*/
#define GNUNET_TIME_STD_EXPONENTIAL_BACKOFF_THRESHOLD GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3)
+/**
+ * The size of the buffer we fill before sending out the message
+ */
+#define BUFFER_SIZE GNUNET_SERVER_MAX_MESSAGE_SIZE
/**
* The message queue for sending messages to the controller service
/**
* Task to call the flush completion callback
*/
- GNUNET_SCHEDULER_TaskIdentifier flush_completion_task;
+ struct GNUNET_SCHEDULER_Task * flush_completion_task;
/**
* Task to be executed when flushing takes too long
*/
- GNUNET_SCHEDULER_TaskIdentifier timeout_flush_task;
+ struct GNUNET_SCHEDULER_Task * timeout_flush_task;
};
cancel_timeout_flush (struct GNUNET_TESTBED_LOGGER_Handle *h)
{
GNUNET_SCHEDULER_cancel (h->timeout_flush_task);
- h->timeout_flush_task = GNUNET_SCHEDULER_NO_TASK;
+ h->timeout_flush_task = NULL;
}
* Task to call the flush completion notification
*
* @param cls the logger handle
- * @param tc the scheduler task context
*/
static void
-call_flush_completion (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+call_flush_completion (void *cls)
{
struct GNUNET_TESTBED_LOGGER_Handle *h = cls;
GNUNET_TESTBED_LOGGER_FlushCompletion cb;
void *cb_cls;
size_t bw;
- h->flush_completion_task = GNUNET_SCHEDULER_NO_TASK;
+ h->flush_completion_task = NULL;
bw = h->bwrote;
h->bwrote = 0;
cb = h->cb;
h->cb = NULL;
cb_cls = h->cb_cls;
h->cb_cls = NULL;
- if (GNUNET_SCHEDULER_NO_TASK != h->timeout_flush_task)
+ if (NULL != h->timeout_flush_task)
cancel_timeout_flush (h);
if (NULL != cb)
cb (cb_cls, bw);
static void
trigger_flush_notification (struct GNUNET_TESTBED_LOGGER_Handle *h)
{
- if (GNUNET_SCHEDULER_NO_TASK != h->flush_completion_task)
+ if (NULL != h->flush_completion_task)
GNUNET_SCHEDULER_cancel (h->flush_completion_task);
h->flush_completion_task = GNUNET_SCHEDULER_add_now (&call_flush_completion, h);
}
GNUNET_TESTBED_LOGGER_disconnect (struct GNUNET_TESTBED_LOGGER_Handle *h)
{
struct MessageQueue *mq;
+ unsigned int lost;
- if (GNUNET_SCHEDULER_NO_TASK != h->flush_completion_task)
+ if (NULL != h->flush_completion_task)
GNUNET_SCHEDULER_cancel (h->flush_completion_task);
+ lost = 0;
while (NULL != (mq = h->mq_head))
{
GNUNET_CONTAINER_DLL_remove (h->mq_head, h->mq_tail, mq);
GNUNET_free (mq->msg);
GNUNET_free (mq);
+ lost++;
}
+ if (0 != lost)
+ LOG (GNUNET_ERROR_TYPE_WARNING, "Cleaning up %u unsent logger message[s]\n",
+ lost);
GNUNET_CLIENT_disconnect (h->client);
GNUNET_free (h);
}
GNUNET_assert (0 != size);
GNUNET_assert (NULL != data);
- GNUNET_assert (size < (GNUNET_SERVER_MAX_MESSAGE_SIZE
- - sizeof (struct GNUNET_MessageHeader)));
+ GNUNET_assert (size <= (BUFFER_SIZE - sizeof (struct GNUNET_MessageHeader)));
fit_size = sizeof (struct GNUNET_MessageHeader) + h->bs + size;
- if ( GNUNET_SERVER_MAX_MESSAGE_SIZE < fit_size )
+ if ( BUFFER_SIZE < fit_size )
dispatch_buffer (h);
if (NULL == h->buf)
{
h->buf = GNUNET_malloc (size);
h->bs = size;
memcpy (h->buf, data, size);
- return;
+ goto dispatch_ready;
}
h->buf = GNUNET_realloc (h->buf, h->bs + size);
memcpy (h->buf + h->bs, data, size);
h->bs += size;
- return;
+
+ dispatch_ready:
+ if (BUFFER_SIZE == fit_size)
+ dispatch_buffer (h);
}
* be called with 0 as the amount of data sent.
*
* @param cls the logger handle
- * @param tc scheduler task context
*/
static void
-timeout_flush (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+timeout_flush (void *cls)
{
struct GNUNET_TESTBED_LOGGER_Handle *h = cls;
GNUNET_TESTBED_LOGGER_FlushCompletion cb;
void *cb_cls;
- h->timeout_flush_task = GNUNET_SCHEDULER_NO_TASK;
+ h->timeout_flush_task = NULL;
cb = h->cb;
h->cb = NULL;
cb_cls = h->cb_cls;
h->cb_cls = NULL;
- if (GNUNET_SCHEDULER_NO_TASK != h->flush_completion_task)
+ if (NULL != h->flush_completion_task)
{
GNUNET_SCHEDULER_cancel (h->flush_completion_task);
- h->flush_completion_task = GNUNET_SCHEDULER_NO_TASK;
+ h->flush_completion_task = NULL;
}
if (NULL != cb)
cb (cb_cls, 0);
{
h->cb = cb;
h->cb_cls = cb_cls;
- GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == h->timeout_flush_task);
+ GNUNET_assert (NULL == h->timeout_flush_task);
h->timeout_flush_task =
GNUNET_SCHEDULER_add_delayed (timeout, &timeout_flush, h);
if (NULL == h->buf)
void
GNUNET_TESTBED_LOGGER_flush_cancel (struct GNUNET_TESTBED_LOGGER_Handle *h)
{
- if (GNUNET_SCHEDULER_NO_TASK != h->flush_completion_task)
+ if (NULL != h->flush_completion_task)
{
GNUNET_SCHEDULER_cancel (h->flush_completion_task);
- h->flush_completion_task = GNUNET_SCHEDULER_NO_TASK;
+ h->flush_completion_task = NULL;
}
- if (GNUNET_SCHEDULER_NO_TASK != h->timeout_flush_task)
+ if (NULL != h->timeout_flush_task)
cancel_timeout_flush (h);
h->cb = NULL;
h->cb_cls = NULL;