Changeset ed5367b in mainline for uspace/srv/sysman/job_closure.c
- Timestamp:
- 2019-08-07T10:01:13Z (6 years ago)
- 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/sysman/job_closure.c
r68ae40a red5367b 39 39 40 40 /** Struct describes how to traverse units graph */ 41 typedef struct { 41 struct bfs_ops; 42 typedef struct bfs_ops bfs_ops_t; 43 44 struct bfs_ops { 42 45 enum { 43 46 BFS_FORWARD, /**< Follow oriented edges */ … … 46 49 47 50 /** Visit a unit via edge 48 * unit, incoming edge, user data51 * unit, incoming edge, traversing ops, user data 49 52 * return result of visit (error stops further traversal) 50 53 */ 51 int (* visit)(unit_t *, unit_edge_t *, void *);54 int (* visit)(unit_t *, unit_edge_t *, bfs_ops_t *, void *); 52 55 53 56 /** 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 }; 56 59 57 60 /* … … 83 86 * @return EOK on success 84 87 */ 85 static int start_visit(unit_t *u, unit_edge_t *e, void *arg) 88 static int visit_propagate_job(unit_t *u, unit_edge_t *e, bfs_ops_t *ops, 89 void *arg) 86 90 { 87 91 int rc = EOK; … … 99 103 } 100 104 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 102 109 assert(job != NULL); 103 110 … … 129 136 } 130 137 131 static void traverse_clean(unit_t *u, void *arg)138 static void traverse_clean(unit_t *u, bfs_ops_t *ops, void *arg) 132 139 { 133 140 job_t *job = u->bfs_data; … … 144 151 unit_t *unit = origin; 145 152 146 rc = ops->visit(unit, NULL, arg);153 rc = ops->visit(unit, NULL, ops, arg); 147 154 if (rc != EOK) { 148 155 goto finish; … … 164 171 list_append(&u->bfs_link, &units_fifo); 165 172 } 166 rc = ops->visit(u, e, arg);173 rc = ops->visit(u, e, ops, arg); 167 174 if (rc != EOK) { 168 175 goto finish; … … 175 182 list_append(&u->bfs_link, &units_fifo); 176 183 } 177 rc = ops->visit(u, e, arg);184 rc = ops->visit(u, e, ops, arg); 178 185 if (rc != EOK) { 179 186 goto finish; … … 187 194 list_foreach_safe(units_fifo, cur_link, next_link) { 188 195 unit_t *u = list_get_instance(cur_link, unit_t, bfs_link); 189 ops->clean(u, arg);196 ops->clean(u, ops, arg); 190 197 list_remove(cur_link); 191 198 } … … 227 234 228 235 static bfs_ops_t ops = { 229 .direction = BFS_FORWARD,230 .visit = start_visit,231 236 .clean = traverse_clean, 237 .visit = visit_propagate_job 232 238 }; 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 233 251 int rc = dyn_array_append(job_closure, job_t *, main_job); 234 252 if (rc != EOK) {
Note:
See TracChangeset
for help on using the changeset viewer.