aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorharsha <harsha@140774ce-b5e7-0310-ab8b-a85725594a96>2012-07-31 15:29:32 +0000
committerharsha <harsha@140774ce-b5e7-0310-ab8b-a85725594a96>2012-07-31 15:29:32 +0000
commita757672fefb91ee5f1c5af4b8cc1b2fed27702b4 (patch)
treefde9fe16f606ffbbce44a14b7edc32f2235dc401
parent823634976826e5fc681efb2dcc0f543ec06d4308 (diff)
peer destroy with new operations handling
git-svn-id: https://gnunet.org/svn/gnunet@23020 140774ce-b5e7-0310-ab8b-a85725594a96
-rw-r--r--src/testbed/testbed_api.c32
-rw-r--r--src/testbed/testbed_api_peers.c75
-rw-r--r--src/testbed/testbed_api_peers.h23
3 files changed, 66 insertions, 64 deletions
diff --git a/src/testbed/testbed_api.c b/src/testbed/testbed_api.c
index de64b3b49c..cb71808824 100644
--- a/src/testbed/testbed_api.c
+++ b/src/testbed/testbed_api.c
@@ -224,18 +224,18 @@ handle_opsuccess (struct GNUNET_TESTBED_Controller *c,
const struct
GNUNET_TESTBED_GenericOperationSuccessEventMessage *msg)
{
- struct GNUNET_TESTBED_Operation *op;
+ struct OperationContext *opc;
struct GNUNET_TESTBED_EventInformation *event;
uint64_t op_id;
op_id = GNUNET_ntohll (msg->operation_id);
LOG_DEBUG ("Operation %ul successful\n", op_id);
- for (op = c->op_head; NULL != op; op = op->next)
+ for (opc = c->ocq_head; NULL != opc; opc = opc->next)
{
- if (op->operation_id == op_id)
+ if (opc->id == op_id)
break;
}
- if (NULL == op)
+ if (NULL == opc)
{
LOG_DEBUG ("Operation not found\n");
return GNUNET_YES;
@@ -245,37 +245,29 @@ handle_opsuccess (struct GNUNET_TESTBED_Controller *c,
event = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_EventInformation));
if (NULL != event)
event->type = GNUNET_TESTBED_ET_OPERATION_FINISHED;
- switch (op->type)
+ switch (opc->type)
{
case OP_PEER_DESTROY:
{
- struct PeerDestroyData *data;
+ struct GNUNET_TESTBED_Peer *peer;
if (NULL != event)
{
- event->details.operation_finished.operation = op;
+ event->details.operation_finished.operation = opc->op;
event->details.operation_finished.op_cls = NULL;
event->details.operation_finished.emsg = NULL;
event->details.operation_finished.pit = GNUNET_TESTBED_PIT_GENERIC;
event->details.operation_finished.op_result.generic = NULL;
}
- data = (struct PeerDestroyData *) op->data;
- if (NULL != data->peer->details)
- {
- if (NULL != data->peer->details->cfg)
- GNUNET_CONFIGURATION_destroy (data->peer->details->cfg);
- //PEER_DETAILS
- }
- GNUNET_free (data->peer);
- GNUNET_free (data);
- op->data = NULL;
+ peer = opc->data;
+ GNUNET_free (peer);
+ opc->data = NULL;
//PEERDESTROYDATA
}
break;
default:
GNUNET_assert (0);
}
- GNUNET_CONTAINER_DLL_remove (c->op_head, c->op_tail, op);
if (NULL != event)
{
if (NULL != c->cc)
@@ -1354,8 +1346,8 @@ GNUNET_TESTBED_operation_done (struct GNUNET_TESTBED_Operation *operation)
GNUNET_TESTBED_operation_release_ (operation);
return;
case OP_PEER_DESTROY:
- GNUNET_free_non_null (operation->data);
- break;
+ GNUNET_TESTBED_operation_release_ (operation);
+ return;
case OP_PEER_START:
case OP_PEER_STOP:
break;
diff --git a/src/testbed/testbed_api_peers.c b/src/testbed/testbed_api_peers.c
index 3ecb383259..4f9fa768c8 100644
--- a/src/testbed/testbed_api_peers.c
+++ b/src/testbed/testbed_api_peers.c
@@ -91,6 +91,48 @@ oprelease_peer_create (void *cls)
/**
+ * Function to called when a peer destroy operation is ready
+ *
+ * @param cls the closure from GNUNET_TESTBED_operation_create_()
+ */
+static void
+opstart_peer_destroy (void *cls)
+{
+ struct OperationContext *opc = cls;
+ struct GNUNET_TESTBED_Peer *peer;
+ struct GNUNET_TESTBED_PeerDestroyMessage *msg;
+
+ GNUNET_assert (OP_PEER_DESTROY == opc->type);
+ peer = opc->data;
+ GNUNET_assert (NULL != peer);
+ msg = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_PeerDestroyMessage));
+ msg->header.size = htons (sizeof (struct GNUNET_TESTBED_PeerDestroyMessage));
+ msg->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_DESTROYPEER);
+ msg->peer_id = htonl (peer->unique_id);
+ msg->operation_id = GNUNET_htonll (opc->id);
+ GNUNET_CONTAINER_DLL_insert_tail (opc->c->ocq_head,
+ opc->c->ocq_tail, opc);
+ GNUNET_TESTBED_queue_message_ (peer->controller,
+ (struct GNUNET_MessageHeader *) msg);
+}
+
+
+/**
+ * Callback which will be called when peer_create type operation is released
+ *
+ * @param cls the closure from GNUNET_TESTBED_operation_create_()
+ */
+static void
+oprelease_peer_destroy (void *cls)
+{
+ struct OperationContext *opc = cls;
+
+ GNUNET_CONTAINER_DLL_remove (opc->c->ocq_head, opc->c->ocq_tail, opc);
+ GNUNET_free (opc);
+}
+
+
+/**
* Lookup a peer by ID.
*
* @param id global peer ID assigned to the peer
@@ -347,27 +389,18 @@ GNUNET_TESTBED_peer_update_configuration (struct GNUNET_TESTBED_Peer *peer,
struct GNUNET_TESTBED_Operation *
GNUNET_TESTBED_peer_destroy (struct GNUNET_TESTBED_Peer *peer)
{
- struct GNUNET_TESTBED_Operation *op;
- struct PeerDestroyData *data;
- struct GNUNET_TESTBED_PeerDestroyMessage *msg;
-
- data = GNUNET_malloc (sizeof (struct PeerDestroyData));
- data->peer = peer;
- op = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_Operation));
- op->operation_id = peer->controller->operation_counter++;
- op->controller = peer->controller;
- op->type = OP_PEER_DESTROY;
- op->data = data;
- msg = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_PeerDestroyMessage));
- msg->header.size = htons (sizeof (struct GNUNET_TESTBED_PeerDestroyMessage));
- msg->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_DESTROYPEER);
- msg->peer_id = htonl (peer->unique_id);
- msg->operation_id = GNUNET_htonll (op->operation_id);
- GNUNET_CONTAINER_DLL_insert_tail (peer->controller->op_head,
- peer->controller->op_tail, op);
- GNUNET_TESTBED_queue_message_ (peer->controller,
- (struct GNUNET_MessageHeader *) msg);
- return op;
+ struct OperationContext *opc;
+
+ opc = GNUNET_malloc (sizeof (struct OperationContext));
+ opc->data = peer;
+ opc->c = peer->controller;
+ opc->id = peer->controller->operation_counter++;
+ opc->type = OP_PEER_DESTROY;
+ opc->op = GNUNET_TESTBED_operation_create_ (opc, &opstart_peer_destroy,
+ &oprelease_peer_destroy);
+ GNUNET_TESTBED_operation_queue_insert_ (opc->c->opq_peer_create,
+ opc->op);
+ return opc->op;
}
diff --git a/src/testbed/testbed_api_peers.h b/src/testbed/testbed_api_peers.h
index e7c1e91365..72c1c1b58f 100644
--- a/src/testbed/testbed_api_peers.h
+++ b/src/testbed/testbed_api_peers.h
@@ -31,23 +31,6 @@
/**
- * Details about a peer; kept in a separate struct to avoid bloating
- * memory consumption everywhere...
- */
-struct PeerDetails
-{
- /**
- * Configuration of the peer; NULL if we are not sure what the peer's correct
- * configuration actually is; non-NULL if this peer is controlled by this
- * process.
- */
- struct GNUNET_CONFIGURATION_Handle *cfg;
-
- //PEER_DETAILS
-};
-
-
-/**
* Enumeration of possible states a peer could be in
*/
enum PeerState
@@ -92,12 +75,6 @@ struct GNUNET_TESTBED_Peer
struct GNUNET_TESTBED_Host *host;
/**
- * Internals of the peer for the controlling process; NULL if
- * this process is not controlling this peer.
- */
- struct PeerDetails *details;
-
- /**
* Globally unique ID of the peer.
*/
uint32_t unique_id;