{
struct ExpireOperationEntry *entry;
- entry = GNUNET_malloc (sizeof (struct ExpireOperationEntry));
+ entry = GNUNET_new (struct ExpireOperationEntry);
entry->op = op;
- GNUNET_CONTAINER_DLL_insert_tail (exop_head, exop_tail, entry);
+ GNUNET_CONTAINER_DLL_insert_tail (exop_head, exop_tail, entry);
}
{
struct SearchContext *sc = cls;
struct OperationContext *opc = value;
-
+
GNUNET_assert (NULL != opc);
GNUNET_assert (NULL == sc->opc);
if (opc->id != sc->id)
sc.id = id;
sc.opc = NULL;
GNUNET_assert (NULL != c->opc_map);
- if (GNUNET_SYSERR !=
+ if (GNUNET_SYSERR !=
GNUNET_CONTAINER_multihashmap32_get_multiple (c->opc_map, (uint32_t) id,
&opc_search_iterator, &sc))
return NULL;
if (NULL == c->opc_map)
c->opc_map = GNUNET_CONTAINER_multihashmap32_create (256);
GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multihashmap32_put (c->opc_map,
+ GNUNET_CONTAINER_multihashmap32_put (c->opc_map,
(uint32_t) opc->id, opc,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
}
* given controller
*
* @param c the controller
- * @param opc the operation context to remove
+ * @param opc the operation context to remove
*/
void
GNUNET_TESTBED_remove_opc_ (const struct GNUNET_TESTBED_Controller *c,
GNUNET_CONTAINER_multihashmap32_remove (c->opc_map,
(uint32_t) opc->id,
opc));
+ if ( (0 == GNUNET_CONTAINER_multihashmap32_size (c->opc_map))
+ && (NULL != c->opcq_empty_cb) )
+ c->opcq_empty_cb (c->opcq_empty_cls);
}
}
GNUNET_TESTBED_remove_opc_ (opc->c, opc);
opc->state = OPC_STATE_FINISHED;
- exop_insert (event.op);
+ exop_insert (event.op);
if (0 != (c->event_mask & (1L << GNUNET_TESTBED_ET_OPERATION_FINISHED)))
{
if (NULL != c->cc)
GNUNET_assert (NULL != data->peer);
peer = data->peer;
GNUNET_assert (peer->unique_id == ntohl (msg->peer_id));
- peer->state = PS_CREATED;
+ peer->state = TESTBED_PS_CREATED;
GNUNET_TESTBED_peer_register_ (peer);
cb = data->cb;
cls = data->cls;
void *pcc_cls;
struct GNUNET_TESTBED_EventInformation event;
uint64_t op_id;
+ uint64_t mask;
GNUNET_assert (sizeof (struct GNUNET_TESTBED_PeerEventMessage) ==
ntohs (msg->header.size));
switch (event.type)
{
case GNUNET_TESTBED_ET_PEER_START:
- peer->state = PS_STARTED;
+ peer->state = TESTBED_PS_STARTED;
event.details.peer_start.host = peer->host;
event.details.peer_start.peer = peer;
break;
case GNUNET_TESTBED_ET_PEER_STOP:
- peer->state = PS_STOPPED;
+ peer->state = TESTBED_PS_STOPPED;
event.details.peer_stop.peer = peer;
break;
default:
GNUNET_TESTBED_remove_opc_ (opc->c, opc);
opc->state = OPC_STATE_FINISHED;
exop_insert (event.op);
- if (0 !=
- ((GNUNET_TESTBED_ET_PEER_START | GNUNET_TESTBED_ET_PEER_STOP) &
- c->event_mask))
+ mask = 1LL << GNUNET_TESTBED_ET_PEER_START;
+ mask |= 1LL << GNUNET_TESTBED_ET_PEER_STOP;
+ if (0 != (mask & c->event_mask))
{
if (NULL != c->cc)
- c->cc (c->cc_cls, &event);
+ c->cc (c->cc_cls, &event);
if (GNUNET_NO == exop_check (event.op))
return GNUNET_YES;
}
void *cb_cls;
struct GNUNET_TESTBED_EventInformation event;
uint64_t op_id;
+ uint64_t mask;
op_id = GNUNET_ntohll (msg->operation_id);
if (NULL == (opc = find_opc (c, op_id)))
GNUNET_TESTBED_remove_opc_ (opc->c, opc);
opc->state = OPC_STATE_FINISHED;
exop_insert (event.op);
- if (0 !=
- ((GNUNET_TESTBED_ET_CONNECT | GNUNET_TESTBED_ET_DISCONNECT) &
- c->event_mask))
+ mask = 1LL << GNUNET_TESTBED_ET_CONNECT;
+ mask |= 1LL << GNUNET_TESTBED_ET_DISCONNECT;
+ if (0 != (mask & c->event_mask))
{
if (NULL != c->cc)
c->cc (c->cc_cls, &event);
if (GNUNET_NO == exop_check (event.op))
return GNUNET_YES;
- }
+ }
if (NULL != cb)
cb (cb_cls, opc->op, NULL);
/* You could have marked the operation as done by now */
peer = data->peer;
GNUNET_assert (NULL != peer);
GNUNET_assert (ntohl (msg->peer_id) == peer->unique_id);
- pinfo = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_PeerInformation));
- pinfo->pit = data->pit;
+ pinfo = GNUNET_new (struct GNUNET_TESTBED_PeerInformation);
+ pinfo->pit = data->pit;
cb = data->cb;
cb_cls = data->cb_cls;
GNUNET_assert (NULL != cb);
GNUNET_free (data);
- opc->data = NULL;
+ opc->data = NULL;
switch (pinfo->pit)
{
case GNUNET_TESTBED_PIT_IDENTITY:
- pinfo->result.id = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
+ pinfo->result.id = GNUNET_new (struct GNUNET_PeerIdentity);
(void) memcpy (pinfo->result.id, &msg->peer_identity,
sizeof (struct GNUNET_PeerIdentity));
break;
break;
}
opc->data = pinfo;
- GNUNET_TESTBED_remove_opc_ (opc->c, opc);
+ GNUNET_TESTBED_remove_opc_ (opc->c, opc);
opc->state = OPC_STATE_FINISHED;
cb (cb_cls, opc->op, pinfo, NULL);
/* We dont check whether the operation is marked as done here as the
struct OverlayConnectData *data;
data = opc->data;
- data->failed = GNUNET_YES;
+ GNUNET_TESTBED_operation_mark_failed (opc->op);
if (NULL != data->cb)
data->cb (data->cb_cls, opc->op, emsg);
}
case OP_FORWARDED:
GNUNET_assert (0);
case OP_LINK_CONTROLLERS: /* No secondary callback */
- break;
+ break;
case OP_SHUTDOWN_PEERS:
{
struct ShutdownPeersData *data;
{
struct OperationContext *opc;
uint64_t op_id;
+ uint64_t mask;
struct GNUNET_TESTBED_EventInformation event;
op_id = GNUNET_ntohll (msg->operation_id);
}
opc->state = OPC_STATE_FINISHED;
GNUNET_TESTBED_remove_opc_ (opc->c, opc);
- if ((0 != (GNUNET_TESTBED_ET_OPERATION_FINISHED & c->event_mask)) &&
+ mask = 1LL << GNUNET_TESTBED_ET_OPERATION_FINISHED;
+ if ((0 != (mask & c->event_mask)) &&
(NULL != c->cc))
{
opc->data = GNUNET_TESTBED_extract_config_ (&msg->header);
LOG_DEBUG ("Receive timed out or connection to service dropped\n");
return;
}
- status = GNUNET_OK;
msize = ntohs (msg->size);
switch (ntohs (msg->type))
{
msg);
break;
- case GNUNET_MESSAGE_TYPE_TESTBED_PEER_CONFIGURATION:
+ case GNUNET_MESSAGE_TYPE_TESTBED_PEER_INFORMATION:
GNUNET_assert (msize >=
sizeof (struct
GNUNET_TESTBED_PeerConfigurationInformationMessage));
msg);
break;
case GNUNET_MESSAGE_TYPE_TESTBED_LINK_CONTROLLERS_RESULT:
- status =
+ status =
handle_link_controllers_result (c,
(const struct
GNUNET_TESTBED_ControllerLinkResponse
*) msg);
break;
+ case GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS:
+ status =
+ GNUNET_TESTBED_handle_barrier_status_ (c,
+ (const struct
+ GNUNET_TESTBED_BarrierStatusMsg *)
+ msg);
+ break;
default:
GNUNET_assert (0);
}
size = ntohs (msg->size);
GNUNET_assert ((GNUNET_MESSAGE_TYPE_TESTBED_INIT <= type) &&
(GNUNET_MESSAGE_TYPE_TESTBED_MAX > type));
- mq_entry = GNUNET_malloc (sizeof (struct MessageQueue));
+ mq_entry = GNUNET_new (struct MessageQueue);
mq_entry->msg = msg;
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Queueing message of type %u, size %u for sending\n", type,
struct GNUNET_MessageHeader *dup_msg;
uint16_t msize;
- data = GNUNET_malloc (sizeof (struct ForwardedOperationData));
+ data = GNUNET_new (struct ForwardedOperationData);
data->cc = cc;
data->cc_cls = cc_cls;
- opc = GNUNET_malloc (sizeof (struct OperationContext));
+ opc = GNUNET_new (struct OperationContext);
opc->c = controller;
opc->type = OP_FORWARDED;
opc->data = data;
switch (opc->state)
{
case OPC_STATE_INIT:
- GNUNET_free (data->msg);
+ GNUNET_free (data->msg);
break;
case OPC_STATE_STARTED:
GNUNET_TESTBED_remove_opc_ (opc->c, opc);
GNUNET_TESTBED_ControllerCallback cc,
void *cc_cls)
{
- struct GNUNET_TESTBED_Controller *c;
+ struct GNUNET_TESTBED_Controller *controller;
struct GNUNET_TESTBED_InitMessage *msg;
const struct GNUNET_CONFIGURATION_Handle *cfg;
+ const char *controller_hostname;
unsigned long long max_parallel_operations;
unsigned long long max_parallel_service_connections;
unsigned long long max_parallel_topology_config_operations;
GNUNET_break (0);
return NULL;
}
- c = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_Controller));
- c->cc = cc;
- c->cc_cls = cc_cls;
- c->event_mask = event_mask;
- c->cfg = GNUNET_CONFIGURATION_dup (cfg);
- c->client = GNUNET_CLIENT_connect ("testbed", c->cfg);
- if (NULL == c->client)
+ controller = GNUNET_new (struct GNUNET_TESTBED_Controller);
+ controller->cc = cc;
+ controller->cc_cls = cc_cls;
+ controller->event_mask = event_mask;
+ controller->cfg = GNUNET_CONFIGURATION_dup (cfg);
+ controller->client = GNUNET_CLIENT_connect ("testbed", controller->cfg);
+ if (NULL == controller->client)
{
- GNUNET_TESTBED_controller_disconnect (c);
+ GNUNET_TESTBED_controller_disconnect (controller);
return NULL;
}
- GNUNET_TESTBED_mark_host_registered_at_ (host, c);
- c->host = host;
- c->opq_parallel_operations =
- GNUNET_TESTBED_operation_queue_create_ ((unsigned int)
- max_parallel_operations);
- c->opq_parallel_service_connections =
- GNUNET_TESTBED_operation_queue_create_ ((unsigned int)
+ GNUNET_TESTBED_mark_host_registered_at_ (host, controller);
+ controller->host = host;
+ controller->opq_parallel_operations =
+ GNUNET_TESTBED_operation_queue_create_ (OPERATION_QUEUE_TYPE_FIXED,
+ (unsigned int) max_parallel_operations);
+ controller->opq_parallel_service_connections =
+ GNUNET_TESTBED_operation_queue_create_ (OPERATION_QUEUE_TYPE_FIXED,
+ (unsigned int)
max_parallel_service_connections);
- c->opq_parallel_topology_config_operations =
- GNUNET_TESTBED_operation_queue_create_ ((unsigned int)
+ controller->opq_parallel_topology_config_operations =
+ GNUNET_TESTBED_operation_queue_create_ (OPERATION_QUEUE_TYPE_FIXED,
+ (unsigned int)
max_parallel_topology_config_operations);
- msg = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_InitMessage));
+ controller_hostname = GNUNET_TESTBED_host_get_hostname (host);
+ if (NULL == controller_hostname)
+ controller_hostname = "127.0.0.1";
+ msg =
+ GNUNET_malloc (sizeof (struct GNUNET_TESTBED_InitMessage) +
+ strlen (controller_hostname) + 1);
msg->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_INIT);
- msg->header.size = htons (sizeof (struct GNUNET_TESTBED_InitMessage));
+ msg->header.size =
+ htons (sizeof (struct GNUNET_TESTBED_InitMessage) +
+ strlen (controller_hostname) + 1);
msg->host_id = htonl (GNUNET_TESTBED_host_get_id_ (host));
- msg->event_mask = GNUNET_htonll (c->event_mask);
- GNUNET_TESTBED_queue_message_ (c, &msg->header);
- return c;
+ msg->event_mask = GNUNET_htonll (controller->event_mask);
+ strcpy ((char *) &msg[1], controller_hostname);
+ GNUNET_TESTBED_queue_message_ (controller,
+ (struct GNUNET_MessageHeader *) msg);
+ return controller;
}
GNUNET_assert (NULL != opc);
GNUNET_break (0);
- GNUNET_free (opc);
- GNUNET_assert (GNUNET_YES ==
+ GNUNET_assert (GNUNET_YES ==
GNUNET_CONTAINER_multihashmap32_remove (map, key, value));
+ GNUNET_free (opc);
return GNUNET_YES;
}
char *xconfig;
size_t size_;
size_t xsize_;
-
+
config = GNUNET_CONFIGURATION_serialize (cfg, &size_);
xsize_ = GNUNET_TESTBED_compress_config_ (config, size_, &xconfig);
GNUNET_free (config);
uint32_t slave_host_id;
uint32_t delegated_host_id;
uint16_t msg_size;
-
+
GNUNET_assert (GNUNET_YES ==
GNUNET_TESTBED_is_host_registered_ (delegated_host, master));
slave_host_id =
msg->delegated_host_id = htonl (delegated_host_id);
msg->slave_host_id = htonl (slave_host_id);
msg->is_subordinate = (GNUNET_YES == is_subordinate) ? 1 : 0;
- data = GNUNET_malloc (sizeof (struct ControllerLinkData));
+ data = GNUNET_new (struct ControllerLinkData);
data->msg = msg;
data->host_id = delegated_host_id;
- opc = GNUNET_malloc (sizeof (struct OperationContext));
+ opc = GNUNET_new (struct OperationContext);
opc->c = master;
opc->data = data;
opc->type = OP_LINK_CONTROLLERS;
struct OperationContext *opc;
struct GetSlaveConfigData *data;
- data = GNUNET_malloc (sizeof (struct GetSlaveConfigData));
+ data = GNUNET_new (struct GetSlaveConfigData);
data->slave_id = slave_host_id;
- opc = GNUNET_malloc (sizeof (struct OperationContext));
+ opc = GNUNET_new (struct OperationContext);
opc->state = OPC_STATE_INIT;
opc->c = master;
opc->id = GNUNET_TESTBED_get_next_op_id (master);
/**
- * 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 (!).
+ * This function is used to signal that the event information (struct
+ * GNUNET_TESTBED_EventInformation) from an operation has been fully processed
+ * i.e. if the event callback is ever called for this operation. If the event
+ * callback for this operation has not yet been called, calling this function
+ * cancels the operation, frees its resources and ensures the no event is
+ * generated with respect to this operation. Note that however cancelling an
+ * operation does NOT guarantee that the operation will be fully undone (or that
+ * nothing ever happened).
+ *
+ * This function MUST be called for every operation to fully remove the
+ * operation from the operation queue. After calling this function, if
+ * operation is completed and its event information is of type
+ * GNUNET_TESTBED_ET_OPERATION_FINISHED, the 'op_result' becomes invalid (!).
+
+ * If the operation is generated from GNUNET_TESTBED_service_connect() then
+ * calling this function on such as operation calls the disconnect adapter if
+ * the connect adapter was ever called.
*
- * @param operation operation to signal completion for
+ * @param operation operation to signal completion or cancellation
*/
void
GNUNET_TESTBED_operation_done (struct GNUNET_TESTBED_Operation *operation)
/**
* Generates configuration by uncompressing configuration in given message. The
* given message should be of the following types:
- * GNUNET_MESSAGE_TYPE_TESTBED_PEER_CONFIGURATION,
+ * GNUNET_MESSAGE_TYPE_TESTBED_PEER_INFORMATION,
* GNUNET_MESSAGE_TYPE_TESTBED_SLAVE_CONFIGURATION,
* GNUNET_MESSAGE_TYPE_TESTBED_ADD_HOST,
* GNUNET_MESSAGE_TYPE_TESTBED_LINK_CONTROLLERS,
switch (ntohs (msg->type))
{
- case GNUNET_MESSAGE_TYPE_TESTBED_PEER_CONFIGURATION:
+ case GNUNET_MESSAGE_TYPE_TESTBED_PEER_INFORMATION:
{
const struct GNUNET_TESTBED_PeerConfigurationInformationMessage *imsg;
{
const struct GNUNET_TESTBED_AddHostMessage *imsg;
uint16_t osize;
-
+
imsg = (const struct GNUNET_TESTBED_AddHostMessage *) msg;
data_len = (uLong) ntohs (imsg->config_size);
osize = sizeof (struct GNUNET_TESTBED_AddHostMessage) +
- ntohs (imsg->username_length) + ntohs (imsg->hostname_length);
+ ntohs (imsg->username_length) + ntohs (imsg->hostname_length);
xdata_len = ntohs (imsg->header.size) - osize;
xdata = (const Bytef *) ((const void *) imsg + osize);
}
case GNUNET_MESSAGE_TYPE_TESTBED_LINK_CONTROLLERS_RESULT:
{
const struct GNUNET_TESTBED_ControllerLinkResponse *imsg;
-
+
imsg = (const struct GNUNET_TESTBED_ControllerLinkResponse *) msg;
data_len = ntohs (imsg->config_size);
- xdata_len = ntohs (imsg->header.size) -
+ xdata_len = ntohs (imsg->header.size) -
sizeof (const struct GNUNET_TESTBED_ControllerLinkResponse);
xdata = (const Bytef *) &imsg[1];
}
struct GNUNET_TESTBED_ShutdownPeersMessage *msg;
opc->state = OPC_STATE_STARTED;
- msg = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_ShutdownPeersMessage));
- msg->header.size =
+ msg = GNUNET_new (struct GNUNET_TESTBED_ShutdownPeersMessage);
+ msg->header.size =
htons (sizeof (struct GNUNET_TESTBED_ShutdownPeersMessage));
msg->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_SHUTDOWN_PEERS);
msg->operation_id = GNUNET_htonll (opc->id);
if (0 != GNUNET_CONTAINER_multihashmap32_size (c->opc_map))
return NULL;
- data = GNUNET_malloc (sizeof (struct ShutdownPeersData));
+ data = GNUNET_new (struct ShutdownPeersData);
data->cb = cb;
data->cb_cls = cb_cls;
- opc = GNUNET_malloc (sizeof (struct OperationContext));
+ opc = GNUNET_new (struct OperationContext);
opc->c = c;
opc->op_cls = op_cls;
opc->data = data;
opc->id = GNUNET_TESTBED_get_next_op_id (c);
opc->type = OP_SHUTDOWN_PEERS;
- opc->state = OPC_STATE_INIT;
+ opc->state = OPC_STATE_INIT;
opc->op = GNUNET_TESTBED_operation_create_ (opc, &opstart_shutdown_peers,
&oprelease_shutdown_peers);
GNUNET_TESTBED_operation_queue_insert_ (opc->c->opq_parallel_operations,
}
+/**
+ * Return the index of the peer inside of the total peer array,
+ * aka. the peer's "unique ID".
+ *
+ * @param peer Peer handle.
+ *
+ * @return The peer's unique ID.
+ */
+uint32_t
+GNUNET_TESTBED_get_index (const struct GNUNET_TESTBED_Peer *peer)
+{
+ return peer->unique_id;
+}
+
/* end of testbed_api.c */