diff options
Diffstat (limited to 'src/testbed/testbed_api_operations.c')
-rw-r--r-- | src/testbed/testbed_api_operations.c | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/src/testbed/testbed_api_operations.c b/src/testbed/testbed_api_operations.c new file mode 100644 index 0000000..c98998b --- /dev/null +++ b/src/testbed/testbed_api_operations.c @@ -0,0 +1,194 @@ +/* + This file is part of GNUnet + (C) 2008--2012 Christian Grothoff (and other contributing authors) + + GNUnet is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3, or (at your + option) any later version. + + GNUnet is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + 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. + */ + +/** + * @file testbed/testbed_api_operations.c + * @brief functions to manage operation queues + * @author Christian Grothoff + */ +#include "platform.h" +#include "testbed_api_operations.h" + + +/** + * Opaque handle to an abstract operation to be executed by the testing framework. + */ +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 + * of the operation and will ensure that no event + * is generated for the operation. Does NOT guarantee + * that the operation will be fully undone (or that + * nothing ever happened). + * + * @param operation operation to cancel + */ +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); +} + + +/** + * Signal that the information from an operation has been fully + * processed. This function MUST be called for each event + * of type 'operation_finished' to fully remove the operation + * from the operation queue. After calling this function, the + * 'op_result' becomes invalid (!). + * + * @param operation operation to signal completion for + */ +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); +} + + + +/* end of testbed_api_operations.c */ |