Changeset 81c4e6ec in mainline for uspace/srv/sysman/job_queue.c


Ignore:
Timestamp:
2020-07-05T20:46:27Z (4 years ago)
Author:
Matthieu Riolo <matthieu.riolo@…>
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)
Message:

removing adt/array and replace it with adt/list in sysman

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/sysman/job_queue.c

    ra73aaec1 r81c4e6ec  
    103103 * @return error code on fail
    104104 */
    105 static errno_t job_pre_merge(job_t *trunk, job_t *other)
     105static void job_pre_merge(job_t *trunk, job_t *other)
    106106{
    107107        assert(trunk->unit == other->unit);
    108108        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);
    110110        assert(other->merged_into == NULL);
    111111
    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        }
    117118
    118119        // TODO allocate observed object
    119120
    120121        other->merged_into = trunk;
    121 
    122         return EOK;
    123122}
    124123
    125124static void job_finish_merge(job_t *trunk, job_t *other)
    126125{
    127         assert(trunk->blocked_jobs.size >= trunk->blocked_jobs_count);
     126        assert(list_count(&trunk->blocked_jobs) >= trunk->blocked_jobs_count);
    128127        //TODO aggregate merged blocked_jobs
    129         trunk->blocked_jobs_count = other->blocked_jobs.size;
     128        trunk->blocked_jobs_count = list_count(&other->blocked_jobs);
    130129
    131130        /*
     
    144143static void job_undo_merge(job_t *trunk)
    145144{
    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        }
    149154}
    150155
     
    172177
    173178        /* 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;
    176181                job_t *other_job = job->unit->job;
    177182
     
    205210                        // TODO think about other options to merging
    206211                        //      (replacing, cancelling)
    207                         rc = job_pre_merge(other_job, job);
    208                         if (rc != EOK) {
    209                                 break;
    210                         }
     212                        job_pre_merge(other_job, job);
    211213                }
    212214        }
     
    214216        /* Aggregate merged jobs, or rollback any changes in existing jobs */
    215217        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) {
    218221                        continue;
    219222                }
    220223                if (finish_merge) {
    221                         job_finish_merge((*job_it)->merged_into, *job_it);
     224                        job_finish_merge(job->merged_into, job);
    222225                } else {
    223                         job_undo_merge((*job_it)->merged_into);
     226                        job_undo_merge(job->merged_into);
    224227                }
    225228        }
     
    236239         *      in their blocked_jobs array.
    237240         */
    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;
    240243                if (job->merged_into != NULL) {
    241244                        job_del_ref(&job);
     
    255258
    256259        /* 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        }
    258264
    259265        return EOK;
Note: See TracChangeset for help on using the changeset viewer.