Changeset 81c4e6ec in mainline for uspace/srv/sysman/job_queue.c
- Timestamp:
- 2020-07-05T20:46:27Z (5 years ago)
- Parents:
- a73aaec1
- git-author:
- Matthieu Riolo <matthieu.riolo@…> (2020-07-05 20:37:10)
- git-committer:
- Matthieu Riolo <matthieu.riolo@…> (2020-07-05 20:46:27)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/sysman/job_queue.c
ra73aaec1 r81c4e6ec 103 103 * @return error code on fail 104 104 */ 105 static errno_tjob_pre_merge(job_t *trunk, job_t *other)105 static void job_pre_merge(job_t *trunk, job_t *other) 106 106 { 107 107 assert(trunk->unit == other->unit); 108 108 assert(trunk->target_state == other->target_state); 109 assert( trunk->blocked_jobs.size== trunk->blocked_jobs_count);109 assert(list_count(&trunk->blocked_jobs) == trunk->blocked_jobs_count); 110 110 assert(other->merged_into == NULL); 111 111 112 errno_t rc = array_concat(&trunk->blocked_jobs, &other->blocked_jobs); 113 if (rc != EOK) { 114 return rc; 115 } 116 array_clear(&other->blocked_jobs); 112 list_concat(&trunk->blocked_jobs, &other->blocked_jobs); 113 114 while (!list_empty(&other->blocked_jobs)) { 115 job_link_t *job_link = list_pop(&other->blocked_jobs, job_link_t, link); 116 free(job_link); 117 } 117 118 118 119 // TODO allocate observed object 119 120 120 121 other->merged_into = trunk; 121 122 return EOK;123 122 } 124 123 125 124 static void job_finish_merge(job_t *trunk, job_t *other) 126 125 { 127 assert( trunk->blocked_jobs.size>= trunk->blocked_jobs_count);126 assert(list_count(&trunk->blocked_jobs) >= trunk->blocked_jobs_count); 128 127 //TODO aggregate merged blocked_jobs 129 trunk->blocked_jobs_count = other->blocked_jobs.size;128 trunk->blocked_jobs_count = list_count(&other->blocked_jobs); 130 129 131 130 /* … … 144 143 static void job_undo_merge(job_t *trunk) 145 144 { 146 assert(trunk->blocked_jobs.size >= trunk->blocked_jobs_count); 147 array_clear_range(&trunk->blocked_jobs, 148 trunk->blocked_jobs_count, trunk->blocked_jobs.size); 145 unsigned long count = list_count(&trunk->blocked_jobs); 146 assert(count >= trunk->blocked_jobs_count); 147 148 while (count-- > 0) { 149 link_t *last_link = list_last(&trunk->blocked_jobs); 150 job_link_t *job_link = list_get_instance(last_link, job_link_t, link); 151 list_remove(last_link); 152 free(job_link); 153 } 149 154 } 150 155 … … 172 177 173 178 /* Check consistency with existing jobs. */ 174 array_foreach(*closure, job_t *, job_it) {175 job_t *job = *job_it;179 list_foreach(*closure, link, job_link_t, job_it) { 180 job_t *job = job_it->job; 176 181 job_t *other_job = job->unit->job; 177 182 … … 205 210 // TODO think about other options to merging 206 211 // (replacing, cancelling) 207 rc = job_pre_merge(other_job, job); 208 if (rc != EOK) { 209 break; 210 } 212 job_pre_merge(other_job, job); 211 213 } 212 214 } … … 214 216 /* Aggregate merged jobs, or rollback any changes in existing jobs */ 215 217 bool finish_merge = (rc == EOK) && !has_error; 216 array_foreach(*closure, job_t *, job_it) { 217 if ((*job_it)->merged_into == NULL) { 218 list_foreach(*closure, link, job_link_t, job_it) { 219 job_t *job = job_it->job; 220 if (job->merged_into == NULL) { 218 221 continue; 219 222 } 220 223 if (finish_merge) { 221 job_finish_merge( (*job_it)->merged_into, *job_it);224 job_finish_merge(job->merged_into, job); 222 225 } else { 223 job_undo_merge( (*job_it)->merged_into);226 job_undo_merge(job->merged_into); 224 227 } 225 228 } … … 236 239 * in their blocked_jobs array. 237 240 */ 238 array_foreach(*closure, job_t *, job_it) {239 job_t *job = (*job_it);241 list_foreach(*closure, link, job_link_t, job_it) { 242 job_t *job = job_it->job; 240 243 if (job->merged_into != NULL) { 241 244 job_del_ref(&job); … … 255 258 256 259 /* We've stolen references from the closure, so erase it */ 257 array_clear(closure); 260 while (!list_empty(closure)) { 261 job_link_t *job_link = list_pop(closure, job_link_t, link); 262 free(job_link); 263 } 258 264 259 265 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.