IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Aug 11, 2006, 4:51:50 PM (20 years ago)
Author:
eugene
Message:

working on threaded version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/pcontrol/JobOps.c

    r7917 r8296  
    44Stack *JobPool_Busy;
    55Stack *JobPool_Done;
     6Stack *JobPool_Kill;
    67Stack *JobPool_Exit;
    78Stack *JobPool_Crash;
     
    910void InitJobStacks () {
    1011  JobPool_Pending = InitStack ();
    11   JobPool_Busy = InitStack ();
    12   JobPool_Done = InitStack ();
    13   JobPool_Exit = InitStack ();
    14   JobPool_Crash = InitStack ();
     12  JobPool_Busy    = InitStack ();
     13  JobPool_Done    = InitStack ();
     14  JobPool_Kill    = InitStack ();
     15  JobPool_Exit    = InitStack ();
     16  JobPool_Crash   = InitStack ();
    1517}
    1618
     
    2325    case PCONTROL_JOB_DONE:
    2426      return (JobPool_Done);
     27    case PCONTROL_JOB_KILL:
     28      return (JobPool_Kill);
    2529    case PCONTROL_JOB_EXIT:
    2630      return (JobPool_Exit);
     
    3741Stack *GetJobStackByName (char *name) {
    3842
    39   if (!strcasecmp (name, "pending"))
    40     return (JobPool_Pending);
    41   if (!strcasecmp (name, "busy"))
    42     return (JobPool_Busy);
    43   if (!strcasecmp (name, "done"))
    44     return (JobPool_Done);
    45   if (!strcasecmp (name, "exit"))
    46     return (JobPool_Exit);
    47   if (!strcasecmp (name, "crash"))
    48     return (JobPool_Crash);
     43  if (!strcasecmp (name, "pending")) return (JobPool_Pending);
     44  if (!strcasecmp (name, "busy"))    return (JobPool_Busy);
     45  if (!strcasecmp (name, "done"))    return (JobPool_Done);
     46  if (!strcasecmp (name, "exit"))    return (JobPool_Exit);
     47  if (!strcasecmp (name, "crash"))   return (JobPool_Crash);
    4948  return (NULL);
    5049}
    5150
    52 Job *FindJobStack (IDtype JobID) {
    53 
    54   Job *job;
    55 
    56   job = FindJobPtr (JobID, PCONTROL_JOB_PENDING);
    57   if (job != NULL) return (job);
    58 
    59   job = FindJobPtr (JobID, PCONTROL_JOB_BUSY);
    60   if (job != NULL) return (job);
    61 
    62   job = FindJobPtr (JobID, PCONTROL_JOB_EXIT);
    63   if (job != NULL) return (job);
    64 
    65   job = FindJobPtr (JobID, PCONTROL_JOB_CRASH);
    66   if (job != NULL) return (job);
    67 
    68   job = FindJobPtr (JobID, PCONTROL_JOB_DONE);
    69   if (job != NULL) return (job);
    70 
    71   return (NULL);
    72 }
    73 
    74 /* add job to position in stack */
     51/* add job to position in stack, use StackID as default state */
    7552int PutJob (Job *job, int StackID, int where) {
    7653
     
    8158  if (stack == NULL) return (FALSE);
    8259
    83   /* be default, these are both the same - to override, set state after PutJob */
     60  /* by default, these are both the same - to override, use PutJobSetState */
    8461  job[0].state = StackID;
    8562  job[0].stack = StackID;
    86   stat = PutStack (stack, where, job);
    87   /* status (0, NULL); */
     63  stat = PushStack (stack, where, job, job[0].JobID, job[0].argv[0]);
     64  // XXX need to handle the error conditions, or we drop the host & leak memory
    8865  return (stat);
    8966}
    9067 
     68/* add job to position in stack.  set state to 'state' */
     69int PutJobSetState (Job *job, int StackID, int where, int state) {
     70
     71  int stat;
     72  Stack *stack;
     73
     74  stack = GetJobStack (StackID);
     75  if (stack == NULL) return (FALSE);
     76
     77  /* alternate state specified by user */
     78  job[0].state = state;
     79  job[0].stack = StackID;
     80  stat = PushStack (stack, where, job, job[0].JobID, job[0].argv[0]);
     81  // XXX need to handle the error conditions, or we drop the host & leak memory
     82  return (stat);
     83}
     84 
     85Job *PullJobByID (IDtype JobID, int *StackID) {
     86
     87  Job *job;
     88
     89  *StackID = PCONTROL_JOB_PENDING;
     90  job = PullJobFromStackByID (*StackID, JobID);
     91  if (job != NULL) return (job);
     92
     93  *StackID = PCONTROL_JOB_BUSY;
     94  job = PullJobFromStackByID (*StackID, JobID);
     95  if (job != NULL) return (job);
     96
     97  *StackID = PCONTROL_JOB_EXIT;
     98  job = PullJobFromStackByID (*StackID, JobID);
     99  if (job != NULL) return (job);
     100
     101  *StackID = PCONTROL_JOB_CRASH;
     102  job = PullJobFromStackByID (*StackID, JobID);
     103  if (job != NULL) return (job);
     104
     105  *StackID = PCONTROL_JOB_DONE;
     106  job = PullJobFromStackByID (*StackID, JobID);
     107  if (job != NULL) return (job);
     108
     109  *StackID = PCONTROL_JOB_KILL;
     110  job = PullJobFromStackByID (*StackID, JobID);
     111  if (job != NULL) return (job);
     112
     113  return (NULL);
     114}
     115
    91116/* remove job from position in stack */
    92 Job *GetJob (int StackID, int where) {
     117Job *PullJobFromStackByID (int StackID, int ID) {
    93118
    94119  Job *job;
     
    98123  if (stack == NULL) return (NULL);
    99124
    100   job = GetStack (stack, where);
     125  job = PullStackByID (stack, ID);
    101126  return (job);
    102127}
    103128 
    104 /* return stack position of job */
    105 int FindJob (IDtype JobID, int StackID) {
    106 
    107   int i;
    108   Job *job;
    109   Stack *stack;
    110 
    111   stack = GetJobStack (StackID);
    112   if (stack == NULL) return (-2);
    113 
    114   for (i = 0; i < stack[0].Nobject; i++) {
    115     job = (Job *) stack[0].object[i];
    116     if (job[0].JobID == JobID) {
    117       return (i);
    118     }
    119   }
    120   return (-1);
    121 }
    122 
    123 /* return pointer to job */
    124 Job *FindJobPtr (IDtype JobID, int StackID) {
    125 
    126   int i;
     129/* the Find functions are not thread-safe: DROP */
     130# if (0)
     131Job *FindJobByID (IDtype JobID, int *StackID) {
     132
     133  Job *job;
     134
     135  *StackID = PCONTROL_JOB_PENDING;
     136  job = FindJobInStackByID (*StackID, JobID);
     137  if (job != NULL) return (job);
     138
     139  *StackID = PCONTROL_JOB_BUSY;
     140  job = FindJobInStackByID (*StackID, JobID);
     141  if (job != NULL) return (job);
     142
     143  *StackID = PCONTROL_JOB_EXIT;
     144  job = FindJobInStackByID (*StackID, JobID);
     145  if (job != NULL) return (job);
     146
     147  *StackID = PCONTROL_JOB_CRASH;
     148  job = FindJobInStackByID (*StackID, JobID);
     149  if (job != NULL) return (job);
     150
     151  *StackID = PCONTROL_JOB_DONE;
     152  job = FindJobInStackByID (*StackID, JobID);
     153  if (job != NULL) return (job);
     154
     155  return (NULL);
     156}
     157
     158/* remove job from position in stack */
     159Job *FindJobInStackByID (int StackID, int ID) {
     160
    127161  Job *job;
    128162  Stack *stack;
     
    131165  if (stack == NULL) return (NULL);
    132166
    133   for (i = 0; i < stack[0].Nobject; i++) {
    134     job = (Job *) stack[0].object[i];
    135     if (job[0].JobID == JobID) {
    136       return (job);
    137     }
    138   }
    139   return (NULL);
    140 }
    141 
    142 /* remove job from stack, return pointer */
    143 Job *PullJob (IDtype JobID, int StackID) {
    144  
    145   int N;
    146   Job *job;
    147 
    148   N = FindJob (JobID, StackID);
    149   if (N < 0) return (NULL);
    150 
    151   job = GetJob (StackID, N);
    152   if (job == NULL) {
    153     gprint (GP_ERR, "programming error! job missing from stack\n");
    154     exit (1);
    155   }
     167  job = FindStackByID (stack, ID);
    156168  return (job);
    157169}
     170# endif
    158171
    159172IDtype AddJob (char *hostname, JobMode mode, int timeout, int argc, char **argv) {
    160173
     174  int JobID;
    161175  Job *job;
    162176
     
    175189  InitIOBuffer (&job[0].stderr, 0x1000);
    176190
     191  JobID = job[0].JobID;
    177192  PutJob (job, PCONTROL_JOB_PENDING, STACK_BOTTOM);
    178193  gprint (GP_ERR, "added new job\n");
    179   return (job[0].JobID);
     194  return (JobID);
    180195}
    181196
     
    212227 
    213228  /* remove host from correct stack */
    214   if (PullHost (host[0].HostID, host[0].stack) == NULL) {
     229  XXXX does this step asuume the host is in this stack??
     230  if (PullHostFromStackByID (host[0].stack, host[0].HostID) == NULL) {
    215231    gprint (GP_ERR, "programming error: host is not found in current stack\n");
    216232    exit (2);
     
    218234  return (host);
    219235}
    220 
    221 void LinkJobAndHost (Job *job, Host *host) {
    222 
    223   job[0].host = (struct Host *) host;
    224   host[0].job = (struct Job *) job;
    225 
    226   /* remove job from correct stack */
    227   if (PullJob (job[0].JobID, job[0].stack) == NULL) {
    228     gprint (GP_ERR, "programming error: job is not found in current stack\n");
    229     exit (2);
    230   }
    231 }
Note: See TracChangeset for help on using the changeset viewer.