IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jul 31, 2005, 8:04:11 AM (21 years ago)
Author:
eugene
Message:

task/job list cleanup, fixing kill/delete

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/pantasks/TaskOps.c

    r4603 r4684  
    1 # include "opihi.h"
    21# include "scheduler.h"
    32
    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 
     3static Task **tasks;
     4static int    Ntasks;
     5static int    NTASKS;
     6
     7/* counter marking task being visited by the run loop */
     8static int   ActiveTask;
     9
     10/* temporary holder for a new task */
     11static Task *NewTask = NULL;
     12
     13/* set up the task list system */
    2914void InitTasks () {
    3015  NTASKS = 20;
    3116  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 */
     22Task *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 */
     38Task *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
    3550
    3651/* list known tasks */
    37 void ListTasks () {
     52void ListTasks (int verbose) {
    3853
    3954  int i, valid;
    4055
     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");
    4163  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);
    4365    if (valid) {
    4466      fprintf (stderr, "+ ");
     
    4668      fprintf (stderr, "- ");
    4769    }
    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    }
    4984  }
    5085  return;
     
    94129}
    95130
    96 /* return task with given name */
    97 Task *FindTask (char *name) {
    98 
     131/* make a new named task */
     132int FreeTask (Task *task) {
     133 
    99134  int i;
    100135
    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 ***/
    109173
    110174/* make a new named task */
    111175Task *CreateTask (char *name) {
    112176 
    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);
    128194  /* don't free tasks[0].exit, keep at least 1 allocated */
    129195
    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);
    136202
    137203  /* 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
     211int 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
     224int RegisterNewTask () {
     225 
     226  int N;
     227
     228  N = Ntasks;
    142229  Ntasks ++;
    143230  if (Ntasks == NTASKS) {
    144231    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
     239int DeleteNewTask () {
     240  if (NewTask != NULL) {
     241    FreeTask (NewTask);
     242    free (NewTask);
     243    NewTask = NULL;
     244  }
     245  return (TRUE);
     246}
     247
     248Task *GetNewTask () {
     249  return (NewTask);
     250}
     251
     252/*** task timer functions ***/
    157253
    158254double GetTaskTimer (struct timeval start) {
Note: See TracChangeset for help on using the changeset viewer.