Changeset 72c8f77 in mainline for uspace/srv/sysman/sysman.c


Ignore:
Timestamp:
2019-08-06T18:30:29Z (6 years ago)
Author:
Matthieu Riolo <matthieu.riolo@…>
Children:
63a3276
Parents:
c2d50c8
git-author:
Michal Koutný <xm.koutny+hos@…> (2015-05-26 16:15:58)
git-committer:
Matthieu Riolo <matthieu.riolo@…> (2019-08-06 18:30:29)
Message:

sysman: Separate job closure creation and its enqueuing

  • added merge job operation
  • created test that failed with previous implementation of job closure
File:
1 edited

Legend:

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

    rc2d50c8 r72c8f77  
    6969static fibril_condvar_t observed_objects_cv;
    7070
    71 /* Hash table functions */
     71/*
     72 * Hash table functions
     73 */
    7274static size_t observed_objects_ht_hash(const ht_link_t *item)
    7375{
     
    100102};
    101103
     104/*
     105 * Static functions
     106 */
     107
     108static observed_object_t *observed_object_create(void *object)
     109{
     110        observed_object_t *result = malloc(sizeof(observed_object_t));
     111        if (result) {
     112                result->object = object;
     113                list_initialize(&result->callbacks);
     114                hash_table_insert(&observed_objects, &result->ht_link);
     115        }
     116        return result;
     117}
     118
     119static void observed_object_destroy(observed_object_t **ptr_observed_object)
     120{
     121        observed_object_t *observed_object = *ptr_observed_object;
     122        if (observed_object == NULL) {
     123                return;
     124        }
     125
     126        ht_link_t *item = &observed_object->ht_link;
     127        hash_table_remove_item(&observed_objects, item);
     128        free(observed_object);
     129        *ptr_observed_object = NULL;
     130}
     131
    102132static void notify_observers(void *object)
    103133{
     
    116146                free(callback);
    117147        }
     148
     149        observed_object_destroy(&observed_object);
    118150}
    119151
     
    174206    callback_handler_t callback, void *callback_arg)
    175207{
    176         job_t *job;
    177 
    178         if (unit->job != NULL) {
    179                 assert(unit->job->state != JOB_UNQUEUED);
    180 
    181                 if (unit->job->target_state != target_state) {
    182                         return EBUSY;
    183                 }
    184                 job = unit->job;
    185         } else {
    186                 job = job_create(unit, target_state);
    187                 if (job == NULL) {
    188                         return ENOMEM;
    189                 }
    190                 /* Reference in unit is enough */
    191                 job_del_ref(&job);
     208        job_t *job = job_create(unit, target_state);
     209        if (job == NULL) {
     210                return ENOMEM;
    192211        }
    193212
     
    197216        }
    198217
    199         if (job->state == JOB_UNQUEUED) {
    200                 job_add_ref(job);
    201                 sysman_raise_event(&sysman_event_job_process, job);
    202         }
     218        /* Pass reference to event */
     219        sysman_raise_event(&sysman_event_job_process, job);
    203220
    204221        return EOK;
     
    242259 *
    243260 * TODO no one handles return value, it's quite fatal to lack memory for
    244  *      callbacks...  @return EOK on success
     261 *      callbacks...
     262 *
     263 * @return EOK on success
    245264 * @return ENOMEM
    246265 */
     
    253272
    254273        if (ht_link == NULL) {
    255                 observed_object = malloc(sizeof(observed_object_t));
    256                 if (observed_object == NULL) {
     274                new_observed_object = observed_object_create(object);
     275                if (new_observed_object == NULL) {
    257276                        rc = ENOMEM;
    258277                        goto fail;
    259278                }
    260                 new_observed_object = observed_object;
    261 
    262                 observed_object->object = object;
    263                 list_initialize(&observed_object->callbacks);
    264                 hash_table_insert(&observed_objects, &observed_object->ht_link);
     279                observed_object = new_observed_object;
    265280        } else {
    266281                observed_object =
     
    284299}
    285300
     301int sysman_move_observers(void *src_object, void *dst_object)
     302{
     303        ht_link_t *src_link = hash_table_find(&observed_objects, &src_object);
     304        if (src_link == NULL) {
     305                return EOK;
     306        }
     307
     308        ht_link_t *dst_link = hash_table_find(&observed_objects, &dst_object);
     309        observed_object_t *dst_observed_object;
     310        if (dst_link == NULL) {
     311                dst_observed_object = observed_object_create(dst_object);
     312                if (dst_observed_object == NULL) {
     313                        return ENOMEM;
     314                }
     315        } else {
     316                dst_observed_object =
     317                    hash_table_get_inst(dst_link, observed_object_t, ht_link);
     318        }
     319
     320        observed_object_t *src_observed_object =
     321            hash_table_get_inst(src_link, observed_object_t, ht_link);
     322
     323        list_concat(&dst_observed_object->callbacks,
     324            &src_observed_object->callbacks);
     325        observed_object_destroy(&src_observed_object);
     326
     327        return EOK;
     328}
     329
     330
    286331/*
    287332 * Event handlers
     
    293338        job_t *job = data;
    294339        dyn_array_t job_closure;
    295         dyn_array_initialize(&job_closure, job_ptr_t);
     340        dyn_array_initialize(&job_closure, job_t *);
    296341
    297342        int rc = job_create_closure(job, &job_closure);
     
    306351         * otherwise, we still have the reference.
    307352         */
    308         rc = job_queue_add_jobs(&job_closure);
     353        rc = job_queue_add_closure(&job_closure);
    309354        if (rc != EOK) {
    310355                goto fail;
     
    321366        job_del_ref(&job);
    322367
    323         dyn_array_foreach(job_closure, job_ptr_t, closure_job) {
     368        dyn_array_foreach(job_closure, job_t *, closure_job) {
    324369                job_del_ref(&(*closure_job));
    325370        }
Note: See TracChangeset for help on using the changeset viewer.