Changeset 4684 for trunk/Ohana/src/opihi/pantasks/TaskOps.c
- Timestamp:
- Jul 31, 2005, 8:04:11 AM (21 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/opihi/pantasks/TaskOps.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/pantasks/TaskOps.c
r4603 r4684 1 # include "opihi.h"2 1 # include "scheduler.h" 3 2 4 static char dot[] = "."; 5 6 static Task *tasks; 7 static int Ntasks; 8 static int NTASKS; 9 10 static char *TaskName = dot; 11 12 static int CurrentTask = 0; 13 14 /* provide a mechanism to loop over the list of tasks */ 15 Task *NextTask () { 16 17 Task *task; 18 19 if (CurrentTask >= Ntasks) { 20 CurrentTask = 0; 21 return (NULL); 22 } 23 24 task = &tasks[CurrentTask]; 25 CurrentTask ++; 26 return (task); 27 } 28 3 static Task **tasks; 4 static int Ntasks; 5 static int NTASKS; 6 7 /* counter marking task being visited by the run loop */ 8 static int ActiveTask; 9 10 /* temporary holder for a new task */ 11 static Task *NewTask = NULL; 12 13 /* set up the task list system */ 29 14 void InitTasks () { 30 15 NTASKS = 20; 31 16 Ntasks = 0; 32 ALLOCATE (tasks, Task, NTASKS); 33 TaskName = dot; 34 } 17 ALLOCATE (tasks, Task *, NTASKS); 18 ActiveTask = -1; 19 } 20 21 /* provide a mechanism to loop over the list of tasks */ 22 Task *NextTask () { 23 24 Task *task; 25 26 /* move to the next task and return it */ 27 ActiveTask ++; 28 if (ActiveTask < 0) ActiveTask = 0; 29 if (ActiveTask >= Ntasks) { 30 ActiveTask = -1; 31 return (NULL); 32 } 33 task = tasks[ActiveTask]; 34 return (task); 35 } 36 37 /* return task with given name */ 38 Task *FindTask (char *name) { 39 40 int i; 41 42 /* try for an exact match first */ 43 for (i = 0; i < Ntasks; i++) { 44 if (!strcmp (tasks[i][0].name, name)) { 45 return (tasks[i]); 46 } 47 } 48 return (NULL); 49 } 35 50 36 51 /* list known tasks */ 37 void ListTasks ( ) {52 void ListTasks (int verbose) { 38 53 39 54 int i, valid; 40 55 56 if (Ntasks == 0) { 57 fprintf (stderr, "no defined tasks\n"); 58 return; 59 } 60 61 fprintf (stderr, "Task Status\n"); 62 fprintf (stderr, " name Njobs command\n"); 41 63 for (i = 0; i < Ntasks; i++) { 42 valid = CheckTimeRanges (tasks[i] .ranges, tasks[i].Nranges);64 valid = CheckTimeRanges (tasks[i][0].ranges, tasks[i][0].Nranges); 43 65 if (valid) { 44 66 fprintf (stderr, "+ "); … … 46 68 fprintf (stderr, "- "); 47 69 } 48 fprintf (stderr, "%-15s %4d %20s\n", tasks[i].name, tasks[i].Njobs, tasks[i].argv[0]); 70 fprintf (stderr, "%-15s %4d %-20s\n", tasks[i][0].name, tasks[i][0].Njobs, tasks[i][0].argv[0]); 71 if (verbose) { 72 fprintf (stderr, " spawn period: %f, polling period: %f, timeout period: %f\n", 73 tasks[i][0].poll_period, tasks[i][0].poll_period, tasks[i][0].poll_period); 74 if (tasks[i][0].host != NULL) { 75 if (tasks[i][0].host_required) { 76 fprintf (stderr, " host %s (required)\n", tasks[i][0].host); 77 } else { 78 fprintf (stderr, " host %s (desired)\n", tasks[i][0].host); 79 } 80 } else { 81 fprintf (stderr, " task runs locally\n"); 82 } 83 } 49 84 } 50 85 return; … … 94 129 } 95 130 96 /* return task with given name*/97 Task *FindTask (char *name) {98 131 /* make a new named task */ 132 int FreeTask (Task *task) { 133 99 134 int i; 100 135 101 /* try for an exact match first */ 102 for (i = 0; i < Ntasks; i++) { 103 if (!strcmp (tasks[i].name, name)) { 104 return (&tasks[i]); 105 } 106 } 107 return (NULL); 108 } 136 if (task == NULL) return (FALSE); 137 138 if (task[0].name != NULL) free (task[0].name); 139 if (task[0].host != NULL) free (task[0].host); 140 if (task[0].argv != NULL) { 141 for (i = 0; i < task[0].argc; i++) { 142 free (task[0].argv[i]); 143 } 144 free (task[0].argv); 145 } 146 if (task[0].exec != NULL) { 147 FreeMacro (task[0].exec); 148 free (task[0].exec); 149 } 150 if (task[0].crash != NULL) { 151 FreeMacro (task[0].crash); 152 free (task[0].crash); 153 } 154 if (task[0].timeout != NULL) { 155 FreeMacro (task[0].timeout); 156 free (task[0].timeout); 157 } 158 for (i = 0; i < task[0].Nexit; i++) { 159 if (task[0].exit[i] != NULL) { 160 FreeMacro (task[0].exit[i]); 161 } 162 free (task[0].exit[i]); 163 } 164 free (task[0].exit); 165 166 if (task[0].ranges != NULL) { 167 free (task[0].ranges); 168 } 169 return (TRUE); 170 } 171 172 /**** new task functions ***/ 109 173 110 174 /* make a new named task */ 111 175 Task *CreateTask (char *name) { 112 176 113 tasks[Ntasks].name = strcreate (name);; 114 115 tasks[Ntasks].host = NULL; 116 tasks[Ntasks].host_required = FALSE; 117 118 tasks[Ntasks].argc = 0; 119 tasks[Ntasks].argv = NULL; 120 121 tasks[Ntasks].exec = NULL; 122 tasks[Ntasks].crash = NULL; 123 tasks[Ntasks].timeout = NULL; 124 125 tasks[Ntasks].Nexit = 0; 126 tasks[Ntasks].NEXIT = 10; 127 ALLOCATE (tasks[Ntasks].exit, Macro *, tasks[Ntasks].NEXIT); 177 ALLOCATE (NewTask, Task, 1); 178 179 NewTask[0].name = strcreate (name);; 180 181 NewTask[0].host = NULL; 182 NewTask[0].host_required = FALSE; 183 184 NewTask[0].argc = 0; 185 NewTask[0].argv = NULL; 186 187 NewTask[0].exec = NULL; 188 NewTask[0].crash = NULL; 189 NewTask[0].timeout = NULL; 190 191 NewTask[0].Nexit = 0; 192 NewTask[0].NEXIT = 10; 193 ALLOCATE (NewTask[0].exit, Macro *, NewTask[0].NEXIT); 128 194 /* don't free tasks[0].exit, keep at least 1 allocated */ 129 195 130 tasks[Ntasks].exec_period = 1.0;131 tasks[Ntasks].poll_period = 1.0;132 tasks[Ntasks].timeout_period = 1.0;133 134 tasks[Ntasks].Nranges = 0;135 ALLOCATE ( tasks[Ntasks].ranges, TimeRange, 1);196 NewTask[0].exec_period = 1.0; 197 NewTask[0].poll_period = 1.0; 198 NewTask[0].timeout_period = 1.0; 199 200 NewTask[0].Nranges = 0; 201 ALLOCATE (NewTask[0].ranges, TimeRange, 1); 136 202 137 203 /* init task timer (is reset by 'run') */ 138 gettimeofday (&tasks[Ntasks].last, (void *) NULL); 139 tasks[Ntasks].Njobs = 0; 140 tasks[Ntasks].Nmax = 0; /* default value means 'no limit' */ 141 204 gettimeofday (&NewTask[0].last, (void *) NULL); 205 NewTask[0].Njobs = 0; 206 NewTask[0].Nmax = 0; /* default value means 'no limit' */ 207 208 return (NewTask); 209 } 210 211 int ValidateTask (Task *task) { 212 213 if (task[0].argc == 0) { 214 fprintf (stderr, "task command not defined\n"); 215 return (FALSE); 216 } 217 if (task[0].argv == NULL) { 218 fprintf (stderr, "task command arguments not defined (programming error)\n"); 219 return (FALSE); 220 } 221 return (TRUE); 222 } 223 224 int RegisterNewTask () { 225 226 int N; 227 228 N = Ntasks; 142 229 Ntasks ++; 143 230 if (Ntasks == NTASKS) { 144 231 NTASKS += 20; 145 REALLOCATE (tasks, Task, NTASKS); 146 } 147 return (&tasks[Ntasks-1]); 148 } 149 150 void SetCurrentTask (char *name) { 151 TaskName = name; 152 } 153 154 char *GetCurrentTask () { 155 return (TaskName); 156 } 232 REALLOCATE (tasks, Task *, NTASKS); 233 } 234 tasks[N] = NewTask; 235 NewTask = NULL; 236 return (TRUE); 237 } 238 239 int DeleteNewTask () { 240 if (NewTask != NULL) { 241 FreeTask (NewTask); 242 free (NewTask); 243 NewTask = NULL; 244 } 245 return (TRUE); 246 } 247 248 Task *GetNewTask () { 249 return (NewTask); 250 } 251 252 /*** task timer functions ***/ 157 253 158 254 double GetTaskTimer (struct timeval start) {
Note:
See TracChangeset
for help on using the changeset viewer.
