*/
struct GNUNET_TESTBED_Operation
{
+ /**
+ * Function to call when we have the resources to begin the operation.
+ */
+ OperationStart start;
+
+ /**
+ * Function to call to clean up after the operation (which may or may
+ * not have been started yet).
+ */
+ OperationRelease release;
+
+ /**
+ * Closure for callbacks.
+ */
+ void *cb_cls;
+
// FIXME!
+
+};
+
+
+/**
+ * Queue of operations where we can only support a certain
+ * number of concurrent operations of a particular type.
+ */
+struct OperationQueue
+{
+
+ /**
+ * Maximum number of operationst that can be concurrently
+ * active in this queue.
+ */
+ unsigned int max_active;
+
+ // FIXME!
+
};
+/**
+ * Create an operation queue.
+ *
+ * @param max_active maximum number of operations in this
+ * queue that can be active in parallel at the same time
+ * @return handle to the queue
+ */
+struct OperationQueue *
+GNUNET_TESTBED_operation_queue_create_ (unsigned int max_active)
+{
+ struct OperationQueue *queue;
+
+ queue = GNUNET_malloc (sizeof (struct OperationQueue));
+ queue->max_active = max_active;
+ return queue;
+}
+
+
+/**
+ * Destroy an operation queue. The queue MUST be empty
+ * at this time.
+ *
+ * @param queue queue to destroy
+ */
+void
+GNUNET_TESTBED_operation_queue_destroy_ (struct OperationQueue *queue)
+{
+ GNUNET_break (0);
+ GNUNET_free (queue);
+}
+
+
+/**
+ * Add an operation to a queue. An operation can be in multiple
+ * queues at once. Once all queues permit the operation to become
+ * active, the operation will be activated. The actual activation
+ * will occur in a separate task (thus allowing multiple queue
+ * insertions to be made without having the first one instantly
+ * trigger the operation if the first queue has sufficient
+ * resources).
+ *
+ * @param queue queue to add the operation to
+ * @param operation operation to add to the queue
+ */
+void
+GNUNET_TESTBED_operation_queue_insert_ (struct OperationQueue *queue,
+ struct GNUNET_TESTBED_Operation *operation)
+{
+ GNUNET_break (0);
+}
+
+
+/**
+ * Remove an operation from a queue. This can be because the
+ * oeration was active and has completed (and the resources have
+ * been released), or because the operation was cancelled and
+ * thus scheduling the operation is no longer required.
+ *
+ * @param queue queue to add the operation to
+ * @param operation operation to add to the queue
+ */
+void
+GNUNET_TESTBED_operation_queue_remove_ (struct OperationQueue *queue,
+ struct GNUNET_TESTBED_Operation *operation)
+{
+ GNUNET_break (0);
+}
+
+
+/**
+ * An operation is 'done' (was cancelled or finished); remove
+ * it from the queues and release associated resources.
+ *
+ * @param operation operation that finished
+ */
+static void
+operation_release (struct GNUNET_TESTBED_Operation *operation)
+{
+ // call operation->release, remove from queues
+ GNUNET_break (0);
+}
+
/**
* Cancel a pending operation. Releases all resources
void
GNUNET_TESTBED_operation_cancel (struct GNUNET_TESTBED_Operation *operation)
{
+ // test that operation had not yet generated an event
GNUNET_break (0);
-
+ operation_release (operation);
}
void
GNUNET_TESTBED_operation_done (struct GNUNET_TESTBED_Operation *operation)
{
+ // test that operation was started and had generated an event
GNUNET_break (0);
+ operation_release (operation);
}
#include "gnunet_helper_lib.h"
+/**
+ * Queue of operations where we can only support a certain
+ * number of concurrent operations of a particular type.
+ */
+struct OperationQueue;
+
+
+/**
+ * Create an operation queue.
+ *
+ * @param max_active maximum number of operations in this
+ * queue that can be active in parallel at the same time
+ * @return handle to the queue
+ */
+struct OperationQueue *
+GNUNET_TESTBED_operation_queue_create_ (unsigned int max_active);
+
+
+/**
+ * Destroy an operation queue. The queue MUST be empty
+ * at this time.
+ *
+ * @param queue queue to destroy
+ */
+void
+GNUNET_TESTBED_operation_queue_destroy_ (struct OperationQueue *queue);
+
+
+/**
+ * Add an operation to a queue. An operation can be in multiple
+ * queues at once. Once all queues permit the operation to become
+ * active, the operation will be activated. The actual activation
+ * will occur in a separate task (thus allowing multiple queue
+ * insertions to be made without having the first one instantly
+ * trigger the operation if the first queue has sufficient
+ * resources).
+ *
+ * @param queue queue to add the operation to
+ * @param operation operation to add to the queue
+ */
+void
+GNUNET_TESTBED_operation_queue_insert_ (struct OperationQueue *queue,
+ struct GNUNET_TESTBED_Operation *operation);
+
+
+/**
+ * Remove an operation from a queue. This can be because the
+ * oeration was active and has completed (and the resources have
+ * been released), or because the operation was cancelled and
+ * thus scheduling the operation is no longer required.
+ *
+ * @param queue queue to add the operation to
+ * @param operation operation to add to the queue
+ */
+void
+GNUNET_TESTBED_operation_queue_remove_ (struct OperationQueue *queue,
+ struct GNUNET_TESTBED_Operation *operation);
+
+
+
+/**
+ * Function to call to start an operation once all
+ * queues the operation is part of declare that the
+ * operation can be activated.
+ */
+typedef void (*OperationStart)(void *cls);
+
+
+/**
+ * Function to call to cancel an operation (release all associated
+ * resources). This can be because of a call to
+ * "GNUNET_TESTBED_operation_cancel" (before the operation generated
+ * an event) or AFTER the operation generated an event due to a call
+ * to "GNUNET_TESTBED_operation_done". Thus it is not guaranteed that
+ * a callback to the 'OperationStart' preceeds the call to
+ * 'OperationRelease'. Implementations of this function are expected
+ * to clean up whatever state is in 'cls' and release all resources
+ * associated with the operation.
+ */
+typedef void (*OperationRelease)(void *cls);
+
+
+/**
+ * Create an 'operation' to be performed.
+ *
+ * @param cls closure for the callbacks
+ * @param start function to call to start the operation
+ * @param release function to call to close down the operation
+ * @param ... FIXME
+ * @return handle to the operation
+ */
+struct GNUNET_TESTBED_Operation *
+GNUNET_TESTBED_operation_create_ (void *cls,
+ OperationStart start,
+ OperationRelease release,
+ ...);
+
+
#endif
/* end of testbed_api_operations.h */