[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r22788 - in gnunet/src: include testbed
From: |
gnunet |
Subject: |
[GNUnet-SVN] r22788 - in gnunet/src: include testbed |
Date: |
Fri, 20 Jul 2012 14:02:27 +0200 |
Author: harsha
Date: 2012-07-20 14:02:27 +0200 (Fri, 20 Jul 2012)
New Revision: 22788
Modified:
gnunet/src/include/gnunet_testbed_service.h
gnunet/src/testbed/
gnunet/src/testbed/gnunet-service-testbed.c
gnunet/src/testbed/test_testbed_api.c
gnunet/src/testbed/test_testbed_api_2peers.c
gnunet/src/testbed/testbed.h
gnunet/src/testbed/testbed_api.c
gnunet/src/testbed/testbed_api.h
gnunet/src/testbed/testbed_api_peers.c
gnunet/src/testbed/testbed_api_peers.h
Log:
peer create callback
Modified: gnunet/src/include/gnunet_testbed_service.h
===================================================================
--- gnunet/src/include/gnunet_testbed_service.h 2012-07-20 11:16:52 UTC (rev
22787)
+++ gnunet/src/include/gnunet_testbed_service.h 2012-07-20 12:02:27 UTC (rev
22788)
@@ -612,10 +612,24 @@
const char *sxcfg,
size_t sxcfg_size,
size_t scfg_size,
- int is_subordinate);
+ int is_subordinate);
/**
+ * Functions of this signature are called when a peer has been successfully
+ * created
+ *
+ * @param cls the closure from GNUNET_TESTBED_peer_create()
+ * @param peer the handle for the created peer; NULL on any error during
+ * creation
+ * @param emsg NULL if peer is not NULL; else MAY contain the error description
+ */
+typedef void (*GNUNET_TESTBED_PeerCreateCallback) (void *cls,
+ struct GNUNET_TESTBED_Peer
*peer,
+ const char *emsg);
+
+
+/**
* Create the given peer at the specified host using the given
* controller. If the given controller is not running on the target
* host, it should find or create a controller at the target host and
@@ -639,12 +653,16 @@
* @param controller controller process to use
* @param host host to run the peer on
* @param cfg configuration to use for the peer
- * @return handle to the peer (actual startup will happen asynchronously)
+ * @param cb the callback to call when the peer has been created
+ * @param cls the closure to the above callback
+ * @return the operation handle
*/
-struct GNUNET_TESTBED_Peer *
+struct GNUNET_TESTBED_Operation *
GNUNET_TESTBED_peer_create (struct GNUNET_TESTBED_Controller *controller,
struct GNUNET_TESTBED_Host *host,
- const struct GNUNET_CONFIGURATION_Handle *cfg);
+ const struct GNUNET_CONFIGURATION_Handle *cfg,
+ GNUNET_TESTBED_PeerCreateCallback cb,
+ void *cls);
/**
Property changes on: gnunet/src/testbed
___________________________________________________________________
Modified: svn:ignore
- Makefile.in
Makefile
.deps
gnunet-service-testbed
gnunet-testbed-helper
testbed.conf
test_testbed_api_hosts
test_testbed_api
test_gnunet_testbed_helper
+ Makefile.in
Makefile
.deps
gnunet-service-testbed
gnunet-testbed-helper
testbed.conf
test_testbed_api_hosts
test_testbed_api
test_testbed_api_2peers
test_gnunet_testbed_helper
Modified: gnunet/src/testbed/gnunet-service-testbed.c
===================================================================
--- gnunet/src/testbed/gnunet-service-testbed.c 2012-07-20 11:16:52 UTC (rev
22787)
+++ gnunet/src/testbed/gnunet-service-testbed.c 2012-07-20 12:02:27 UTC (rev
22788)
@@ -1157,6 +1157,7 @@
const struct GNUNET_MessageHeader *message)
{
const struct GNUNET_TESTBED_PeerCreateMessage *msg;
+ struct GNUNET_TESTBED_PeerCreateSuccessEventMessage *reply;
struct GNUNET_CONFIGURATION_Handle *cfg;
char *config;
size_t dest_size;
@@ -1224,6 +1225,12 @@
return;
}
peer_list_add (peer);
+ reply = GNUNET_malloc (sizeof (struct
GNUNET_TESTBED_PeerCreateSuccessEventMessage));
+ reply->header.size = htons (sizeof (struct
GNUNET_TESTBED_PeerCreateSuccessEventMessage));
+ reply->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_PEERCREATESUCCESS);
+ reply->peer_id = msg->peer_id;
+ reply->operation_id = msg->operation_id;
+ queue_message (client, &reply->header);
GNUNET_SERVER_receive_done (client, GNUNET_OK);
return;
}
@@ -1284,6 +1291,7 @@
reply->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_GENERICOPSUCCESS);
reply->header.size = htons (reply_size);
reply->operation_id = msg->operation_id;
+ reply->event_type = htonl (GNUNET_TESTBED_ET_OPERATION_FINISHED);
queue_message (client, &reply->header);
GNUNET_SERVER_receive_done (client, GNUNET_OK);
}
@@ -1302,7 +1310,7 @@
const struct GNUNET_MessageHeader *message)
{
const struct GNUNET_TESTBED_PeerStartMessage *msg;
- struct GNUNET_TESTBED_PeerCreateSuccessEventMessage *reply;
+ struct GNUNET_TESTBED_PeerEventMessage *reply;
uint32_t peer_id;
msg = (const struct GNUNET_TESTBED_PeerStartMessage *) message;
@@ -1316,10 +1324,19 @@
GNUNET_SERVER_receive_done (client, GNUNET_OK);
return;
}
- reply = GNUNET_malloc (sizeof (struct
GNUNET_TESTBED_PeerCreateSuccessEventMessage));
- reply->header.size = htons (sizeof (struct
GNUNET_TESTBED_PeerCreateSuccessEventMessage));
- reply->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_PEERCREATESUCCESS);
- reply->peer_id = htonl (peer_id);
+ if (GNUNET_OK != GNUNET_TESTING_peer_start (peer_list[peer_id]->peer))
+ {
+ /* FIXME: return FAILURE message */
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_OK);
+ return;
+ }
+ reply = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_PeerEventMessage));
+ reply->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_PEEREVENT);
+ reply->header.size = htons (sizeof (struct GNUNET_TESTBED_PeerEventMessage));
+ reply->event_type = htonl (GNUNET_TESTBED_ET_PEER_START);
+ reply->host_id = htonl (master_context->host_id);
+ reply->peer_id = msg->peer_id;
reply->operation_id = msg->operation_id;
queue_message (client, &reply->header);
GNUNET_SERVER_receive_done (client, GNUNET_OK);
@@ -1339,7 +1356,7 @@
const struct GNUNET_MessageHeader *message)
{
const struct GNUNET_TESTBED_PeerStopMessage *msg;
- struct GNUNET_TESTBED_GenericOperationSuccessEventMessage *reply;
+ struct GNUNET_TESTBED_PeerEventMessage *reply;
uint32_t peer_id;
msg = (const struct GNUNET_TESTBED_PeerStopMessage *) message;
@@ -1357,11 +1374,13 @@
GNUNET_SERVER_receive_done (client, GNUNET_OK);
return;
}
- reply = GNUNET_malloc (sizeof (struct
GNUNET_TESTBED_GenericOperationSuccessEventMessage));
- reply->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_GENERICOPSUCCESS);
- reply->header.size = htons (sizeof (struct
GNUNET_TESTBED_GenericOperationSuccessEventMessage));
+ reply = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_PeerEventMessage));
+ reply->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_PEEREVENT);
+ reply->header.size = htons (sizeof (struct GNUNET_TESTBED_PeerEventMessage));
+ reply->event_type = htonl (GNUNET_TESTBED_ET_PEER_STOP);
+ reply->host_id = htonl (master_context->host_id);
+ reply->peer_id = msg->peer_id;
reply->operation_id = msg->operation_id;
- reply->event_type = htonl (GNUNET_TESTBED_ET_PEER_STOP);
queue_message (client, &reply->header);
GNUNET_SERVER_receive_done (client, GNUNET_OK);
}
Modified: gnunet/src/testbed/test_testbed_api.c
===================================================================
--- gnunet/src/testbed/test_testbed_api.c 2012-07-20 11:16:52 UTC (rev
22787)
+++ gnunet/src/testbed/test_testbed_api.c 2012-07-20 12:02:27 UTC (rev
22788)
@@ -153,6 +153,30 @@
/**
+ * Functions of this signature are called when a peer has been successfully
+ * created
+ *
+ * @param cls the closure from GNUNET_TESTBED_peer_create()
+ * @param peer the handle for the created peer; NULL on any error during
+ * creation
+ * @param emsg NULL if peer is not NULL; else MAY contain the error description
+ */
+static void
+peer_create_cb (void *cls,
+ struct GNUNET_TESTBED_Peer *peer, const char *emsg)
+{
+ struct GNUNET_TESTBED_Peer **peer_ptr;
+
+ peer_ptr = cls;
+ GNUNET_assert (NULL != peer);
+ GNUNET_assert (NULL != peer_ptr);
+ *peer_ptr = peer;
+ operation = GNUNET_TESTBED_peer_destroy (peer);
+ GNUNET_assert (NULL != operation);
+}
+
+
+/**
* Callback which will be called to after a host registration succeeded or
failed
*
* @param cls the host which has been registered
@@ -163,9 +187,7 @@
{
GNUNET_assert (cls == neighbour);
reg_handle = NULL;
- peer = GNUNET_TESTBED_peer_create (controller, host, cfg);
- GNUNET_assert (NULL != peer);
- operation = GNUNET_TESTBED_peer_destroy (peer);
+ operation = GNUNET_TESTBED_peer_create (controller, host, cfg,
&peer_create_cb, &peer);
GNUNET_assert (NULL != operation);
}
Modified: gnunet/src/testbed/test_testbed_api_2peers.c
===================================================================
--- gnunet/src/testbed/test_testbed_api_2peers.c 2012-07-20 11:16:52 UTC
(rev 22787)
+++ gnunet/src/testbed/test_testbed_api_2peers.c 2012-07-20 12:02:27 UTC
(rev 22788)
@@ -154,6 +154,30 @@
/**
+ * Functions of this signature are called when a peer has been successfully
+ * created
+ *
+ * @param cls the closure from GNUNET_TESTBED_peer_create()
+ * @param peer the handle for the created peer; NULL on any error during
+ * creation
+ * @param emsg NULL if peer is not NULL; else MAY contain the error description
+ */
+static void
+peer_create_cb (void *cls,
+ struct GNUNET_TESTBED_Peer *peer, const char *emsg)
+{
+ struct GNUNET_TESTBED_Peer **peer_ptr;
+
+ peer_ptr = cls;
+ GNUNET_assert (NULL != peer);
+ GNUNET_assert (NULL != peer_ptr);
+ *peer_ptr = peer;
+ operation = GNUNET_TESTBED_peer_destroy (peer);
+ GNUNET_assert (NULL != operation);
+}
+
+
+/**
* Callback which will be called to after a host registration succeeded or
failed
*
* @param cls the host which has been registered
@@ -164,9 +188,7 @@
{
GNUNET_assert (cls == neighbour);
reg_handle = NULL;
- peer = GNUNET_TESTBED_peer_create (controller, host, cfg);
- GNUNET_assert (NULL != peer);
- operation = GNUNET_TESTBED_peer_destroy (peer);
+ operation = GNUNET_TESTBED_peer_create (controller, host, cfg,
&peer_create_cb, &peer);
GNUNET_assert (NULL != operation);
}
Modified: gnunet/src/testbed/testbed.h
===================================================================
--- gnunet/src/testbed/testbed.h 2012-07-20 11:16:52 UTC (rev 22787)
+++ gnunet/src/testbed/testbed.h 2012-07-20 12:02:27 UTC (rev 22788)
@@ -198,6 +198,11 @@
struct GNUNET_MessageHeader header;
/**
+ * Unique operation id
+ */
+ uint64_t operation_id GNUNET_PACKED;
+
+ /**
* On which host should the peer be started?
*/
uint32_t host_id GNUNET_PACKED;
Modified: gnunet/src/testbed/testbed_api.c
===================================================================
--- gnunet/src/testbed/testbed_api.c 2012-07-20 11:16:52 UTC (rev 22787)
+++ gnunet/src/testbed/testbed_api.c 2012-07-20 12:02:27 UTC (rev 22788)
@@ -300,7 +300,10 @@
GNUNET_TESTBED_PeerCreateSuccessEventMessage *msg)
{
struct GNUNET_TESTBED_Operation *op;
+ struct PeerCreateData *data;
struct GNUNET_TESTBED_Peer *peer;
+ GNUNET_TESTBED_PeerCreateCallback cb;
+ void *cls;
uint64_t op_id;
GNUNET_assert (sizeof (struct GNUNET_TESTBED_PeerCreateSuccessEventMessage)
@@ -311,21 +314,24 @@
if (op->operation_id == op_id)
break;
}
- GNUNET_assert (NULL != op);
- peer = op->data;
- GNUNET_assert (NULL != peer);
- GNUNET_assert (peer->unique_id == ntohl (msg->peer_id));
- if (0 != (c->event_mask & (1L << GNUNET_TESTBED_ET_PEER_START)))
+ if (NULL == op)
{
- struct GNUNET_TESTBED_EventInformation info;
-
- info.details.peer_start.host = peer->host;
- info.details.peer_start.peer = peer;
- if (NULL != c->cc)
- c->cc (c->cc_cls, &info);
+ LOG_DEBUG ("Operation not found\n");
+ return GNUNET_YES;
}
+ GNUNET_assert (OP_PEER_CREATE == op->type);
+ GNUNET_assert (NULL != op->data);
+ data = op->data;
+ GNUNET_assert (NULL != data->peer);
+ peer = data->peer;
+ GNUNET_assert (peer->unique_id == ntohl (msg->peer_id));
+ cb = data->cb;
+ cls = data->cls;
GNUNET_CONTAINER_DLL_remove (c->op_head, c->op_tail, op);
+ GNUNET_free (data);
GNUNET_free (op);
+ if (NULL != cb)
+ cb (cls, peer, NULL);
return GNUNET_YES;
}
Modified: gnunet/src/testbed/testbed_api.h
===================================================================
--- gnunet/src/testbed/testbed_api.h 2012-07-20 11:16:52 UTC (rev 22787)
+++ gnunet/src/testbed/testbed_api.h 2012-07-20 12:02:27 UTC (rev 22788)
@@ -34,6 +34,11 @@
enum OperationType
{
/**
+ * Peer create operation
+ */
+ OP_PEER_CREATE,
+
+ /**
* Peer start operation
*/
OP_PEER_START,
Modified: gnunet/src/testbed/testbed_api_peers.c
===================================================================
--- gnunet/src/testbed/testbed_api_peers.c 2012-07-20 11:16:52 UTC (rev
22787)
+++ gnunet/src/testbed/testbed_api_peers.c 2012-07-20 12:02:27 UTC (rev
22788)
@@ -72,15 +72,21 @@
* @param controller controller process to use
* @param host host to run the peer on
* @param cfg configuration to use for the peer
- * @return handle to the peer (actual startup will happen asynchronously)
+ * @param cb the callback to call when the peer has been created
+ * @param cls the closure to the above callback
+ * @return the operation handle
*/
-struct GNUNET_TESTBED_Peer *
+struct GNUNET_TESTBED_Operation *
GNUNET_TESTBED_peer_create_with_id_ (uint32_t unique_id,
struct GNUNET_TESTBED_Controller
*controller,
struct GNUNET_TESTBED_Host *host,
- const struct GNUNET_CONFIGURATION_Handle
*cfg)
+ const struct GNUNET_CONFIGURATION_Handle
*cfg,
+ GNUNET_TESTBED_PeerCreateCallback cb,
+ void *cls)
{
struct GNUNET_TESTBED_Peer *peer;
+ struct PeerCreateData *data;
+ struct GNUNET_TESTBED_Operation *op;
struct GNUNET_TESTBED_PeerCreateMessage *msg;
char *config;
char *xconfig;
@@ -92,6 +98,14 @@
peer->controller = controller;
peer->host = host;
peer->unique_id = unique_id;
+ data = GNUNET_malloc (sizeof (struct PeerCreateData));
+ data->cb = cb;
+ data->cls = cls;
+ data->peer = peer;
+ op = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_Operation));
+ op->operation_id = controller->operation_counter++;
+ op->type = OP_PEER_CREATE;
+ op->data = data;
config = GNUNET_CONFIGURATION_serialize (cfg, &c_size);
xc_size = GNUNET_TESTBED_compress_config_ (config, c_size, &xconfig);
GNUNET_free (config);
@@ -100,12 +114,15 @@
memmove (&msg[1], msg, xc_size); /* Move the compressed config */
msg->header.size = htons (msize);
msg->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_CREATEPEER);
+ msg->operation_id = GNUNET_htonll (op->operation_id);
msg->host_id = htonl (GNUNET_TESTBED_host_get_id_ (peer->host));
msg->peer_id = htonl (peer->unique_id);
msg->config_size = htonl (c_size);
+ GNUNET_CONTAINER_DLL_insert_tail (peer->controller->op_head,
+ peer->controller->op_tail, op);
GNUNET_TESTBED_queue_message_ (controller,
(struct GNUNET_MessageHeader *) msg);
- return peer;
+ return op;
}
@@ -133,19 +150,24 @@
* @param controller controller process to use
* @param host host to run the peer on
* @param cfg configuration to use for the peer
- * @return handle to the peer (actual startup will happen asynchronously)
+ * @param cb the callback to call when the peer has been created
+ * @param cls the closure to the above callback
+ * @return the operation handle
*/
-struct GNUNET_TESTBED_Peer *
+struct GNUNET_TESTBED_Operation *
GNUNET_TESTBED_peer_create (struct GNUNET_TESTBED_Controller *controller,
struct GNUNET_TESTBED_Host *host,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
+ const struct GNUNET_CONFIGURATION_Handle *cfg,
+ GNUNET_TESTBED_PeerCreateCallback cb,
+ void *cls)
{
static uint32_t id_gen;
return GNUNET_TESTBED_peer_create_with_id_ (++id_gen,
controller,
host,
- cfg);
+ cfg,
+ cb, cls);
}
Modified: gnunet/src/testbed/testbed_api_peers.h
===================================================================
--- gnunet/src/testbed/testbed_api_peers.h 2012-07-20 11:16:52 UTC (rev
22787)
+++ gnunet/src/testbed/testbed_api_peers.h 2012-07-20 12:02:27 UTC (rev
22788)
@@ -79,6 +79,29 @@
/**
+ * Data for the OperationType OP_PEER_CREATE
+ */
+struct PeerCreateData
+{
+ /**
+ * THe call back to call when we receive peer create success message
+ */
+ GNUNET_TESTBED_PeerCreateCallback cb;
+
+ /**
+ * The closure for the above callback
+ */
+ void *cls;
+
+ /**
+ * The peer structure to return when we get success message
+ */
+ struct GNUNET_TESTBED_Peer *peer;
+
+};
+
+
+/**
* Data for the OperationType OP_PEER_DESTROY;
*/
struct PeerDestroyData
@@ -119,13 +142,17 @@
* @param controller controller process to use
* @param host host to run the peer on
* @param cfg configuration to use for the peer
- * @return handle to the peer (actual startup will happen asynchronously)
+ * @param cb the callback to call when the peer has been created
+ * @param cls the closure to the above callback
+ * @return the operation handle
*/
-struct GNUNET_TESTBED_Peer *
+struct GNUNET_TESTBED_Operation *
GNUNET_TESTBED_peer_create_with_id_ (uint32_t unique_id,
- struct GNUNET_TESTBED_Controller
*controller,
+ struct GNUNET_TESTBED_Controller
*controller,
struct GNUNET_TESTBED_Host *host,
- const struct GNUNET_CONFIGURATION_Handle
*cfg);
+ const struct GNUNET_CONFIGURATION_Handle
*cfg,
+ GNUNET_TESTBED_PeerCreateCallback cb,
+ void *cls);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r22788 - in gnunet/src: include testbed,
gnunet <=