*/
GNUNET_SCHEDULER_TaskIdentifier ack_task_id;
+ /**
+ * Task scheduled to continue a read operation.
+ */
+ GNUNET_SCHEDULER_TaskIdentifier read_task;
+
/**
* The mesh handle
*/
size_t read_size;
size_t valid_read_size;
- if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN) return;
+ socket->read_task = GNUNET_SCHEDULER_NO_TASK;
+ if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
+ return;
GNUNET_assert (NULL != socket->read_handle);
GNUNET_assert (NULL != socket->read_handle->proc);
else
socket->receive_buffer_boundaries[packet] = 0;
}
-
- GNUNET_SCHEDULER_add_continuation (&call_read_processor_task,
- socket,
- GNUNET_SCHEDULER_REASON_PREREQ_DONE);
+
+ socket->read_task = GNUNET_SCHEDULER_add_now (&call_read_processor_task,
+ socket);
}
{
struct GNUNET_STREAM_Socket *socket = cls;
+ if (socket->read_task != GNUNET_SCHEDULER_NO_TASK)
+ {
+ GNUNET_SCHEDULER_cancel (socket->read_task);
+ socket->read_task = GNUNET_SCHEDULER_NO_TASK;
+ }
GNUNET_assert (NULL != socket->read_handle);
GNUNET_free (socket->read_handle);
{
struct MessageQueue *head;
+ if (socket->read_task != GNUNET_SCHEDULER_NO_TASK)
+ {
+ /* socket closed with read task pending!? */
+ GNUNET_break (0);
+ GNUNET_SCHEDULER_cancel (socket->read_task);
+ socket->read_task = GNUNET_SCHEDULER_NO_TASK;
+ }
+
/* Clear Transmit handles */
if (NULL != socket->transmit_handle)
{
/* if previous copy buffer is still not read call the data processor on it */
if (NULL != socket->copy_buffer)
- GNUNET_SCHEDULER_add_continuation (&call_read_processor_task,
- socket,
- GNUNET_SCHEDULER_REASON_PREREQ_DONE);
+ socket->read_task = GNUNET_SCHEDULER_add_now (&call_read_processor_task,
+ socket);
else
prepare_buffer_for_read (socket);