diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-08-01 08:14:24 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-08-01 08:14:24 +0000 |
commit | 5c6533b2479a7ca8f1ab310c421ddb8ff474f98a (patch) | |
tree | 511792ba6355a1e93509713acd11802a8ec2406a /src/experimentation | |
parent | 3fca357b7e64eba79c6806468978f9b3f60a6bfc (diff) | |
download | gnunet-5c6533b2479a7ca8f1ab310c421ddb8ff474f98a.tar.gz gnunet-5c6533b2479a7ca8f1ab310c421ddb8ff474f98a.zip |
docu and additional queue
Diffstat (limited to 'src/experimentation')
-rw-r--r-- | src/experimentation/gnunet-daemon-experimentation_scheduler.c | 49 |
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 | |||
34 | enum ExperimentState | 46 | enum 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 | ||
53 | struct ScheduledExperiment *list_head; | 70 | struct ScheduledExperiment *waiting_head; |
54 | struct ScheduledExperiment *list_tail; | 71 | struct ScheduledExperiment *waiting_tail; |
72 | |||
73 | struct ScheduledExperiment *running_head; | ||
74 | struct ScheduledExperiment *running_tail; | ||
55 | 75 | ||
56 | static unsigned int experiments_scheduled; | 76 | static unsigned int experiments_scheduled; |
77 | static unsigned int experiments_running; | ||
57 | static unsigned int experiments_requested; | 78 | static unsigned int experiments_requested; |
58 | 79 | ||
59 | static void | 80 | static 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 */ |