+churn_cb (void *cls,
+ struct GNUNET_TESTBED_Operation *op,
+ const char *emsg)
+{
+ // FIXME
+ struct OpListEntry *entry = cls;
+
+ GNUNET_TESTBED_operation_done (entry->op);
+ if (NULL != emsg)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to start/stop RPS at a peer\n");
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+ }
+ GNUNET_assert (0 != entry->delta);
+
+ num_peers_online += entry->delta;
+
+ if (0 > entry->delta)
+ { /* Peer hopefully just went offline */
+ if (GNUNET_YES != rps_peers[entry->index].online)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "peer %s was expected to go offline but is still marked as online\n",
+ GNUNET_i2s (rps_peers[entry->index].peer_id));
+ GNUNET_break (0);
+ }
+ else
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "peer %s probably went offline as expected\n",
+ GNUNET_i2s (rps_peers[entry->index].peer_id));
+ }
+ rps_peers[entry->index].online = GNUNET_NO;
+ }
+
+ else if (0 < entry->delta)
+ { /* Peer hopefully just went online */
+ if (GNUNET_NO != rps_peers[entry->index].online)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "peer %s was expected to go online but is still marked as offline\n",
+ GNUNET_i2s (rps_peers[entry->index].peer_id));
+ GNUNET_break (0);
+ }
+ else
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "peer %s probably went online as expected\n",
+ GNUNET_i2s (rps_peers[entry->index].peer_id));
+ if (NULL != cur_test_run.pre_test)
+ {
+ cur_test_run.pre_test (&rps_peers[entry->index],
+ rps_peers[entry->index].rps_handle);
+ schedule_missing_requests (&rps_peers[entry->index]);
+ }
+ }
+ rps_peers[entry->index].online = GNUNET_YES;
+ }
+
+ GNUNET_CONTAINER_DLL_remove (oplist_head, oplist_tail, entry);
+ GNUNET_free (entry);
+ //if (num_peers_in_round[current_round] == peers_running)
+ // run_round ();
+}
+
+static void
+manage_service_wrapper (unsigned int i, unsigned int j, int delta,
+ double prob_go_on_off)