Changeset 4684 for trunk/Ohana/src/opihi/pantasks/JobOps.c
- Timestamp:
- Jul 31, 2005, 8:04:11 AM (21 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/opihi/pantasks/JobOps.c (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/pantasks/JobOps.c
r4450 r4684 1 1 # include "scheduler.h" 2 2 3 # define MAX_N_JOBS 1000 4 static char *JobIDList;5 static int JobIDPtr = 0;3 static Job **jobs; 4 static int Njobs; 5 static int NJOBS; 6 6 7 static char dot[] = "."; 7 /* counter marking job being visited by the run loop */ 8 static int ActiveJob; 8 9 9 static Job *jobs; 10 static int Njobs; 11 static int NJOBS; 12 13 static char *JobName = dot; 14 static int CurrentJob = 0; 10 /* set up the jobs list */ 11 void InitJobs () { 12 NJOBS = 20; 13 Njobs = 0; 14 ALLOCATE (jobs, Job *, NJOBS); 15 ActiveJob = -1; 16 } 15 17 16 18 /* provide a mechanism to loop over the list of jobs */ … … 19 21 Job *job; 20 22 21 if (CurrentJob >= Njobs) { 22 CurrentJob = 0; 23 ActiveJob ++; 24 if (ActiveJob < 0) ActiveJob = 0; 25 if (ActiveJob >= Njobs) { 26 ActiveJob = -1; 23 27 return (NULL); 24 28 } 25 26 job = &jobs[CurrentJob]; 27 CurrentJob ++; 29 job = jobs[ActiveJob]; 28 30 return (job); 29 }30 31 void InitJobs () {32 NJOBS = 20;33 Njobs = 0;34 ALLOCATE (jobs, Job, NJOBS);35 JobName = dot;36 37 ALLOCATE (JobIDList, char, MAX_N_JOBS);38 bzero (JobIDList, MAX_N_JOBS*sizeof(char));39 }40 41 /* return next unique ID, recycle every MAX_N_JOBS */42 int NextJobID () {43 44 int Ntry;45 46 JobIDPtr ++;47 if (JobIDPtr >= MAX_N_JOBS) JobIDPtr = 0;48 49 Ntry = 0;50 while (JobIDList[JobIDPtr]) {51 Ntry ++;52 JobIDPtr ++;53 if (JobIDPtr >= MAX_N_JOBS) JobIDPtr = 0;54 if (Ntry == MAX_N_JOBS) return (-1);55 }56 JobIDList[JobIDPtr] = TRUE;57 return (JobIDPtr);58 }59 60 /* list known jobs */61 void ListJobs () {62 63 int i;64 65 for (i = 0; i < Njobs; i++) {66 fprintf (stderr, "%d: %-15s %5d %20s (%x)\n", Njobs, jobs[i].task[0].name, jobs[i].JobID, jobs[i].argv[0], jobs[i].argv);67 }68 return;69 31 } 70 32 … … 76 38 /* return job with matching JobID */ 77 39 for (i = 0; i < Njobs; i++) { 78 if (jobs[i] .JobID == JobID) {79 return ( &jobs[i]);40 if (jobs[i][0].JobID == JobID) { 41 return (jobs[i]); 80 42 } 81 43 } … … 83 45 } 84 46 47 /* list known jobs */ 48 void ListJobs () { 49 50 int i; 51 52 if (Njobs == 0) { 53 fprintf (stderr, "no defined jobs\n"); 54 return; 55 } 56 57 for (i = 0; i < Njobs; i++) { 58 fprintf (stderr, "%d: %-15s %5d %20s (%x)\n", Njobs, jobs[i][0].task[0].name, jobs[i][0].JobID, jobs[i][0].argv[0], jobs[i][0].argv); 59 } 60 return; 61 } 62 85 63 /* make a new job from a task */ 86 64 Job *CreateJob (Task *task) { 87 65 88 66 int i; 67 Job *job; 68 69 ALLOCATE (job, Job, 1); 89 70 90 job s[Njobs].JobID = NextJobID ();91 job s[Njobs].pid = 0;92 job s[Njobs].mode = JOB_LOCAL;71 job[0].JobID = NextJobID (); 72 job[0].pid = 0; 73 job[0].mode = JOB_LOCAL; 93 74 if (task[0].host != NULL) { 94 job s[Njobs].mode = JOB_CONTROLLER;75 job[0].mode = JOB_CONTROLLER; 95 76 } 96 77 … … 99 80 * we allocate one extra element, with value 0 to be passed to execvp 100 81 */ 101 job s[Njobs].argc = task[0].argc;102 ALLOCATE (job s[Njobs].argv, char *, MAX (task[0].argc + 1, 1));82 job[0].argc = task[0].argc; 83 ALLOCATE (job[0].argv, char *, MAX (task[0].argc + 1, 1)); 103 84 for (i = 0; i < task[0].argc; i++) { 104 job s[Njobs].argv[i] = strcreate (task[0].argv[i]);85 job[0].argv[i] = strcreate (task[0].argv[i]); 105 86 } 106 job s[Njobs].argv[i] = 0;87 job[0].argv[i] = 0; 107 88 108 89 /* other data from the task is needed by the job … … 111 92 be applied to the existing jobs */ 112 93 113 job s[Njobs].task = task;94 job[0].task = task; 114 95 115 96 /* if we decide we need to be able to dynamically set task qualities … … 117 98 entries to these quantites in the job structure */ 118 99 100 jobs[Njobs] = job; 119 101 Njobs ++; 120 102 if (Njobs == NJOBS) { 121 103 NJOBS += 20; 122 REALLOCATE (jobs, Job , NJOBS);104 REALLOCATE (jobs, Job *, NJOBS); 123 105 } 124 return ( &jobs[Njobs-1]);106 return (jobs[Njobs-1]); 125 107 } 126 108 … … 130 112 131 113 if (job == NULL) return; 132 133 if ((job[0].JobID >= 0) || (job[0].JobID < MAX_N_JOBS)) { 134 JobIDList[job[0].JobID] = FALSE; 135 } 114 115 FreeJobID (job[0].JobID); 136 116 137 117 for (i = 0; i < job[0].argc; i++) { … … 142 122 } 143 123 144 void SetCurrentJob (char *name) { 145 JobName = name; 146 } 147 148 char *GetCurrentJob () { 149 return (JobName); 150 } 151 124 /** are we deleting the active job?? **/ 152 125 int DeleteJob (Job *job) { 153 126 … … 156 129 Nm = -1; 157 130 for (i = 0; i < Njobs; i++) { 158 if (job == &jobs[i]) {131 if (job == jobs[i]) { 159 132 Nm = i; 160 133 break; … … 166 139 } 167 140 168 FreeJob ( &jobs[Nm]);141 FreeJob (jobs[Nm]); 169 142 for (i = Nm + 1; i < Njobs; i++) 170 143 jobs[i - 1] = jobs[i]; 171 144 Njobs --; 172 145 173 CurrentJob --; 174 CurrentJob = MAX (CurrentJob, 0); 175 146 /* adjust active job number */ 147 if (ActiveJob >= Nm) { 148 ActiveJob --; 149 } 176 150 return (TRUE); 177 151 }
Note:
See TracChangeset
for help on using the changeset viewer.
