From e418b158990b8368d4577edc17c75683bb9e087c Mon Sep 17 00:00:00 2001 From: Sree Harsha Totakura Date: Sun, 9 Sep 2012 13:46:21 +0000 Subject: [PATCH] implemented continuations to testbed peer start/stop API --- src/testbed/testbed_api.c | 12 +++++++++++- src/testbed/testbed_api_peers.c | 34 ++++++++++++++++++++++++++------- src/testbed/testbed_api_peers.h | 23 ++++++++++++++++++++++ 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/testbed/testbed_api.c b/src/testbed/testbed_api.c index 665c19486..d83793ac5 100644 --- a/src/testbed/testbed_api.c +++ b/src/testbed/testbed_api.c @@ -410,6 +410,9 @@ handle_peer_event (struct GNUNET_TESTBED_Controller *c, { struct OperationContext *opc; struct GNUNET_TESTBED_Peer *peer; + struct PeerEventData *data; + GNUNET_TESTBED_PeerChurnCallback pcc; + void *pcc_cls; struct GNUNET_TESTBED_EventInformation event; uint64_t op_id; @@ -434,7 +437,9 @@ handle_peer_event (struct GNUNET_TESTBED_Controller *c, return GNUNET_YES; } GNUNET_assert ((OP_PEER_START == opc->type) || (OP_PEER_STOP == opc->type)); - peer = opc->data; + data = opc->data; + GNUNET_assert (NULL != data); + peer = data->peer; GNUNET_assert (NULL != peer); event.type = (enum GNUNET_TESTBED_EventType) ntohl (msg->event_type); switch (event.type) @@ -451,6 +456,9 @@ handle_peer_event (struct GNUNET_TESTBED_Controller *c, default: GNUNET_assert (0); /* We should never reach this state */ } + pcc = data->pcc; + pcc_cls = data->pcc_cls; + GNUNET_free (data); GNUNET_CONTAINER_DLL_remove (opc->c->ocq_head, opc->c->ocq_tail, opc); opc->state = OPC_STATE_FINISHED; if (0 != @@ -460,6 +468,8 @@ handle_peer_event (struct GNUNET_TESTBED_Controller *c, if (NULL != c->cc) c->cc (c->cc_cls, &event); } + if (NULL != pcc) + pcc (pcc_cls, NULL); return GNUNET_YES; } diff --git a/src/testbed/testbed_api_peers.c b/src/testbed/testbed_api_peers.c index 86bc6f2e2..fef701f91 100644 --- a/src/testbed/testbed_api_peers.c +++ b/src/testbed/testbed_api_peers.c @@ -146,11 +146,14 @@ opstart_peer_start (void *cls) { struct OperationContext *opc = cls; struct GNUNET_TESTBED_PeerStartMessage *msg; + struct PeerEventData *data; struct GNUNET_TESTBED_Peer *peer; GNUNET_assert (OP_PEER_START == opc->type); GNUNET_assert (NULL != opc->data); - peer = opc->data; + data = opc->data; + GNUNET_assert (NULL != data->peer); + peer = data->peer; GNUNET_assert ((PS_CREATED == peer->state) || (PS_STOPPED == peer->state)); opc->state = OPC_STATE_STARTED; msg = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_PeerStartMessage)); @@ -174,7 +177,10 @@ oprelease_peer_start (void *cls) struct OperationContext *opc = cls; if (OPC_STATE_FINISHED != opc->state) + { + GNUNET_free (opc->data); GNUNET_CONTAINER_DLL_remove (opc->c->ocq_head, opc->c->ocq_tail, opc); + } GNUNET_free (opc); } @@ -189,10 +195,13 @@ opstart_peer_stop (void *cls) { struct OperationContext *opc = cls; struct GNUNET_TESTBED_PeerStopMessage *msg; + struct PeerEventData *data; struct GNUNET_TESTBED_Peer *peer; GNUNET_assert (NULL != opc->data); - peer = opc->data; + data = opc->data; + GNUNET_assert (NULL != data->peer); + peer = data->peer; GNUNET_assert (PS_STARTED == peer->state); opc->state = OPC_STATE_STARTED; msg = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_PeerStopMessage)); @@ -216,7 +225,10 @@ oprelease_peer_stop (void *cls) struct OperationContext *opc = cls; if (OPC_STATE_FINISHED != opc->state) + { + GNUNET_free (opc->data); GNUNET_CONTAINER_DLL_remove (opc->c->ocq_head, opc->c->ocq_tail, opc); + } GNUNET_free (opc); } @@ -493,11 +505,15 @@ GNUNET_TESTBED_peer_start (struct GNUNET_TESTBED_Peer *peer, void *pcc_cls) { struct OperationContext *opc; + struct PeerEventData *data; - // FIXME: keep and call pcc! + data = GNUNET_malloc (sizeof (struct PeerEventData)); + data->peer = peer; + data->pcc = pcc; + data->pcc_cls = pcc_cls; opc = GNUNET_malloc (sizeof (struct OperationContext)); opc->c = peer->controller; - opc->data = peer; + opc->data = data; opc->id = opc->c->operation_counter++; opc->type = OP_PEER_START; opc->op = @@ -525,11 +541,15 @@ GNUNET_TESTBED_peer_stop (struct GNUNET_TESTBED_Peer *peer, void *pcc_cls) { struct OperationContext *opc; - - // FIXME: keep and call pcc! + struct PeerEventData *data; + + data = GNUNET_malloc (sizeof (struct PeerEventData)); + data->peer = peer; + data->pcc = pcc; + data->pcc_cls = pcc_cls; opc = GNUNET_malloc (sizeof (struct OperationContext)); opc->c = peer->controller; - opc->data = peer; + opc->data = data; opc->id = opc->c->operation_counter++; opc->type = OP_PEER_STOP; opc->op = diff --git a/src/testbed/testbed_api_peers.h b/src/testbed/testbed_api_peers.h index 4996f1012..357f45e51 100644 --- a/src/testbed/testbed_api_peers.h +++ b/src/testbed/testbed_api_peers.h @@ -121,6 +121,29 @@ struct PeerCreateData }; +/** + * Data for OperationType OP_PEER_START and OP_PEER_STOP + */ +struct PeerEventData +{ + /** + * The handle of the peer to start + */ + struct GNUNET_TESTBED_Peer *peer; + + /** + * The Peer churn callback to call when this operation is completed + */ + GNUNET_TESTBED_PeerChurnCallback pcc; + + /** + * Closure for the above callback + */ + void *pcc_cls; + +}; + + /** * Data for the OperationType OP_PEER_DESTROY; */ -- 2.25.1