Changeset ed5367b in mainline for uspace/srv/sysman/job_closure.c


Ignore:
Timestamp:
2019-08-07T10:01:13Z (6 years ago)
Author:
Matthieu Riolo <matthieu.riolo@…>
Children:
a097c50
Parents:
68ae40a
git-author:
Michal Koutný <xm.koutny+hos@…> (2015-11-05 01:52:07)
git-committer:
Matthieu Riolo <matthieu.riolo@…> (2019-08-07 10:01:13)
Message:

sysman: Implement stopping units

Currently fails service monitoring because of taskman flawed event flags.
However, job closure works well.

File:
1 edited

Legend:

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

    r68ae40a red5367b  
    3939
    4040/** Struct describes how to traverse units graph */
    41 typedef struct {
     41struct bfs_ops;
     42typedef struct bfs_ops bfs_ops_t;
     43
     44struct bfs_ops {
    4245        enum {
    4346                BFS_FORWARD,  /**< Follow oriented edges */
     
    4649
    4750        /** Visit a unit via edge
    48          * unit, incoming edge, user data
     51         * unit, incoming edge, traversing ops, user data
    4952         * return result of visit (error stops further traversal)
    5053         */
    51         int (* visit)(unit_t *, unit_edge_t *, void *);
     54        int (* visit)(unit_t *, unit_edge_t *, bfs_ops_t *, void *);
    5255
    5356        /** Clean units remaining in BFS queue after error */
    54         void (* clean)(unit_t *, void *);
    55 } bfs_ops_t;
     57        void (* clean)(unit_t *, bfs_ops_t *, void *);
     58};
    5659
    5760/*
     
    8386 * @return EOK on success
    8487 */
    85 static int start_visit(unit_t *u, unit_edge_t *e, void *arg)
     88static int visit_propagate_job(unit_t *u, unit_edge_t *e, bfs_ops_t *ops,
     89    void *arg)
    8690{
    8791        int rc = EOK;
     
    99103        }
    100104
    101         job_t *job = e->input->bfs_data;
     105        job_t *job = (ops->direction == BFS_FORWARD) ?
     106            e->input->bfs_data :
     107            e->output->bfs_data;
     108
    102109        assert(job != NULL);
    103110
     
    129136}
    130137
    131 static void traverse_clean(unit_t *u, void *arg)
     138static void traverse_clean(unit_t *u, bfs_ops_t *ops, void *arg)
    132139{
    133140        job_t *job = u->bfs_data;
     
    144151        unit_t *unit = origin;
    145152
    146         rc = ops->visit(unit, NULL, arg);
     153        rc = ops->visit(unit, NULL, ops, arg);
    147154        if (rc != EOK) {
    148155                goto finish;
     
    164171                                list_append(&u->bfs_link, &units_fifo);
    165172                        }
    166                         rc = ops->visit(u, e, arg);
     173                        rc = ops->visit(u, e, ops, arg);
    167174                        if (rc != EOK) {
    168175                                goto finish;
     
    175182                                list_append(&u->bfs_link, &units_fifo);
    176183                        }
    177                         rc = ops->visit(u, e, arg);
     184                        rc = ops->visit(u, e, ops, arg);
    178185                        if (rc != EOK) {
    179186                                goto finish;
     
    187194        list_foreach_safe(units_fifo, cur_link, next_link) {
    188195                unit_t *u = list_get_instance(cur_link, unit_t, bfs_link);
    189                 ops->clean(u, arg);
     196                ops->clean(u, ops, arg);
    190197                list_remove(cur_link);
    191198        }
     
    227234
    228235        static bfs_ops_t ops = {
    229                 .direction = BFS_FORWARD,
    230                 .visit = start_visit,
    231236                .clean = traverse_clean,
     237                .visit = visit_propagate_job
    232238        };
     239
     240        switch (main_job->target_state) {
     241        case STATE_STARTED:
     242                ops.direction = BFS_FORWARD;
     243                break;
     244        case STATE_STOPPED:
     245                ops.direction = BFS_BACKWARD;
     246                break;
     247        default:
     248                assert(false);
     249        }
     250
    233251        int rc = dyn_array_append(job_closure, job_t *, main_job);
    234252        if (rc != EOK) {
Note: See TracChangeset for help on using the changeset viewer.