Changeset 72c8f77 in mainline for uspace/srv/sysman/sysman.c
- Timestamp:
- 2019-08-06T18:30:29Z (6 years ago)
- 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/sysman/sysman.c
rc2d50c8 r72c8f77 69 69 static fibril_condvar_t observed_objects_cv; 70 70 71 /* Hash table functions */ 71 /* 72 * Hash table functions 73 */ 72 74 static size_t observed_objects_ht_hash(const ht_link_t *item) 73 75 { … … 100 102 }; 101 103 104 /* 105 * Static functions 106 */ 107 108 static 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 119 static 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 102 132 static void notify_observers(void *object) 103 133 { … … 116 146 free(callback); 117 147 } 148 149 observed_object_destroy(&observed_object); 118 150 } 119 151 … … 174 206 callback_handler_t callback, void *callback_arg) 175 207 { 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; 192 211 } 193 212 … … 197 216 } 198 217 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); 203 220 204 221 return EOK; … … 242 259 * 243 260 * 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 245 264 * @return ENOMEM 246 265 */ … … 253 272 254 273 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) { 257 276 rc = ENOMEM; 258 277 goto fail; 259 278 } 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; 265 280 } else { 266 281 observed_object = … … 284 299 } 285 300 301 int 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 286 331 /* 287 332 * Event handlers … … 293 338 job_t *job = data; 294 339 dyn_array_t job_closure; 295 dyn_array_initialize(&job_closure, job_ ptr_t);340 dyn_array_initialize(&job_closure, job_t *); 296 341 297 342 int rc = job_create_closure(job, &job_closure); … … 306 351 * otherwise, we still have the reference. 307 352 */ 308 rc = job_queue_add_ jobs(&job_closure);353 rc = job_queue_add_closure(&job_closure); 309 354 if (rc != EOK) { 310 355 goto fail; … … 321 366 job_del_ref(&job); 322 367 323 dyn_array_foreach(job_closure, job_ ptr_t, closure_job) {368 dyn_array_foreach(job_closure, job_t *, closure_job) { 324 369 job_del_ref(&(*closure_job)); 325 370 }
Note:
See TracChangeset
for help on using the changeset viewer.