implemented continuations to testbed peer start/stop API
authorSree Harsha Totakura <totakura@in.tum.de>
Sun, 9 Sep 2012 13:46:21 +0000 (13:46 +0000)
committerSree Harsha Totakura <totakura@in.tum.de>
Sun, 9 Sep 2012 13:46:21 +0000 (13:46 +0000)
src/testbed/testbed_api.c
src/testbed/testbed_api_peers.c
src/testbed/testbed_api_peers.h

index 665c19486c55cfff2769fde313bd985dbdef117e..d83793ac5d1ee239ff512b134b8cac0205de09f3 100644 (file)
@@ -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;
 }
 
index 86bc6f2e2eddc4a1d8674cc8ed3fe3647b0c5e4c..fef701f919c08e9bc7c6b570da1fd8e46a32402e 100644 (file)
@@ -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 =
index 4996f1012b200967734852e767dcced1b77114f2..357f45e51d6a21a1f480d6aac69d1a95ead623d8 100644 (file)
@@ -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;
  */