aboutsummaryrefslogtreecommitdiff
path: root/src/experimentation
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-08-01 08:14:24 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-08-01 08:14:24 +0000
commit5c6533b2479a7ca8f1ab310c421ddb8ff474f98a (patch)
tree511792ba6355a1e93509713acd11802a8ec2406a /src/experimentation
parent3fca357b7e64eba79c6806468978f9b3f60a6bfc (diff)
downloadgnunet-5c6533b2479a7ca8f1ab310c421ddb8ff474f98a.tar.gz
gnunet-5c6533b2479a7ca8f1ab310c421ddb8ff474f98a.zip
docu and additional queue
Diffstat (limited to 'src/experimentation')
-rw-r--r--src/experimentation/gnunet-daemon-experimentation_scheduler.c49
1 files changed, 43 insertions, 6 deletions
diff --git a/src/experimentation/gnunet-daemon-experimentation_scheduler.c b/src/experimentation/gnunet-daemon-experimentation_scheduler.c
index 5d2a51438..eb438fa96 100644
--- a/src/experimentation/gnunet-daemon-experimentation_scheduler.c
+++ b/src/experimentation/gnunet-daemon-experimentation_scheduler.c
@@ -31,12 +31,29 @@
31#include "gnunet_statistics_service.h" 31#include "gnunet_statistics_service.h"
32#include "gnunet-daemon-experimentation.h" 32#include "gnunet-daemon-experimentation.h"
33 33
34/**
35 * An experiment is added during startup as not running NOT_RUNNING
36 *
37 * The scheduler then decides to schedule it and sends a request to the
38 * remote peer, if core cannot send since it is busy we wait for some time
39 * and change state to BUSY, if we can send we change to REQUESTED and wait
40 * for remote peers ACK.
41 *
42 * When we receive an ACK we change to STARTED and when scheduler decides that
43 * the experiment is finished we change to STOPPED.
44 */
45
34enum ExperimentState 46enum ExperimentState
35{ 47{
48 /* Experiment is added and waiting to be executed */
36 NOT_RUNNING, 49 NOT_RUNNING,
50 /* Cannot send request to remote peer, core is busy*/
37 BUSY, 51 BUSY,
52 /* We requested experiment and wait for remote peer to ACK */
38 REQUESTED, 53 REQUESTED,
54 /* Experiment is running */
39 STARTED, 55 STARTED,
56 /* Experiment is done */
40 STOPPED 57 STOPPED
41}; 58};
42 59
@@ -50,10 +67,14 @@ struct ScheduledExperiment {
50 GNUNET_SCHEDULER_TaskIdentifier task; 67 GNUNET_SCHEDULER_TaskIdentifier task;
51}; 68};
52 69
53struct ScheduledExperiment *list_head; 70struct ScheduledExperiment *waiting_head;
54struct ScheduledExperiment *list_tail; 71struct ScheduledExperiment *waiting_tail;
72
73struct ScheduledExperiment *running_head;
74struct ScheduledExperiment *running_tail;
55 75
56static unsigned int experiments_scheduled; 76static unsigned int experiments_scheduled;
77static unsigned int experiments_running;
57static unsigned int experiments_requested; 78static unsigned int experiments_requested;
58 79
59static void 80static void
@@ -65,7 +86,7 @@ request_timeout (void *cls,const struct GNUNET_SCHEDULER_TaskContext* tc)
65 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Peer `%s' did not respond to request for experiment `%s'\n", 86 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Peer `%s' did not respond to request for experiment `%s'\n",
66 GNUNET_i2s (&se->n->id), se->e->name); 87 GNUNET_i2s (&se->n->id), se->e->name);
67 88
68 GNUNET_CONTAINER_DLL_remove (list_head, list_tail, se); 89 GNUNET_CONTAINER_DLL_remove (waiting_head, waiting_tail, se);
69 GNUNET_free (se); 90 GNUNET_free (se);
70 91
71 /* Remove experiment */ 92 /* Remove experiment */
@@ -184,7 +205,7 @@ GNUNET_EXPERIMENTATION_scheduler_add (struct Node *n, struct Experiment *e)
184 else 205 else
185 se->task = GNUNET_SCHEDULER_add_delayed (start, &start_experiment, se); 206 se->task = GNUNET_SCHEDULER_add_delayed (start, &start_experiment, se);
186 207
187 GNUNET_CONTAINER_DLL_insert (list_head, list_tail, se); 208 GNUNET_CONTAINER_DLL_insert (waiting_head, waiting_tail, se);
188 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Added experiment `%s' for node to be scheduled\n", 209 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Added experiment `%s' for node to be scheduled\n",
189 e->name, GNUNET_i2s(&se->n->id)); 210 e->name, GNUNET_i2s(&se->n->id));
190 experiments_scheduled ++; 211 experiments_scheduled ++;
@@ -211,11 +232,11 @@ GNUNET_EXPERIMENTATION_scheduler_stop ()
211 struct ScheduledExperiment *cur; 232 struct ScheduledExperiment *cur;
212 struct ScheduledExperiment *next; 233 struct ScheduledExperiment *next;
213 234
214 next = list_head; 235 next = waiting_head;
215 while (NULL != (cur = next)) 236 while (NULL != (cur = next))
216 { 237 {
217 next = cur->next; 238 next = cur->next;
218 GNUNET_CONTAINER_DLL_remove (list_head, list_tail, cur); 239 GNUNET_CONTAINER_DLL_remove (waiting_head, waiting_tail, cur);
219 if (GNUNET_SCHEDULER_NO_TASK != cur->task) 240 if (GNUNET_SCHEDULER_NO_TASK != cur->task)
220 { 241 {
221 GNUNET_SCHEDULER_cancel (cur->task); 242 GNUNET_SCHEDULER_cancel (cur->task);
@@ -226,6 +247,22 @@ GNUNET_EXPERIMENTATION_scheduler_stop ()
226 experiments_scheduled --; 247 experiments_scheduled --;
227 GNUNET_STATISTICS_set (GSE_stats, "# experiments scheduled", experiments_scheduled, GNUNET_NO); 248 GNUNET_STATISTICS_set (GSE_stats, "# experiments scheduled", experiments_scheduled, GNUNET_NO);
228 } 249 }
250
251 next = running_head;
252 while (NULL != (cur = next))
253 {
254 next = cur->next;
255 GNUNET_CONTAINER_DLL_remove (running_head, running_tail, cur);
256 if (GNUNET_SCHEDULER_NO_TASK != cur->task)
257 {
258 GNUNET_SCHEDULER_cancel (cur->task);
259 cur->task = GNUNET_SCHEDULER_NO_TASK;
260 }
261 GNUNET_free (cur);
262 GNUNET_assert (experiments_running > 0);
263 experiments_running --;
264 GNUNET_STATISTICS_set (GSE_stats, "# experiments running", experiments_running, GNUNET_NO);
265 }
229} 266}
230 267
231/* end of gnunet-daemon-experimentation_scheduler.c */ 268/* end of gnunet-daemon-experimentation_scheduler.c */