Changes in uspace/lib/drv/generic/driver.c [2fd26bb:81685dd9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/driver.c
r2fd26bb r81685dd9 68 68 FIBRIL_MUTEX_INITIALIZE(functions_mutex); 69 69 70 FIBRIL_RWLOCK_INITIALIZE(stopping_lock); 71 static bool stopping = false; 72 70 73 static ddf_dev_t *create_device(void); 71 74 static void delete_device(ddf_dev_t *); … … 127 130 } 128 131 132 fibril_rwlock_read_lock(&stopping_lock); 133 134 if (stopping) { 135 fibril_rwlock_read_unlock(&stopping_lock); 136 async_answer_0(iid, EIO); 137 return; 138 } 139 129 140 ddf_dev_t *dev = create_device(); 130 141 if (!dev) { 142 fibril_rwlock_read_unlock(&stopping_lock); 131 143 free(dev_name); 132 144 async_answer_0(iid, ENOMEM); … … 148 160 149 161 if (res != EOK) { 162 fibril_rwlock_read_unlock(&stopping_lock); 150 163 dev_del_ref(dev); 151 164 async_answer_0(iid, res); … … 156 169 list_append(&dev->link, &devices); 157 170 fibril_mutex_unlock(&devices_mutex); 171 fibril_rwlock_read_unlock(&stopping_lock); 158 172 159 173 async_answer_0(iid, res); … … 282 296 283 297 async_answer_0(iid, (sysarg_t) rc); 298 } 299 300 static void driver_stop(ipc_callid_t iid, ipc_call_t *icall) 301 { 302 /* Prevent new devices from being added */ 303 fibril_rwlock_write_lock(&stopping_lock); 304 stopping = true; 305 306 /* Check if there are any devices */ 307 fibril_mutex_lock(&devices_mutex); 308 if (list_first(&devices) != NULL) { 309 /* Devices exist, roll back */ 310 fibril_mutex_unlock(&devices_mutex); 311 stopping = false; 312 fibril_rwlock_write_unlock(&stopping_lock); 313 async_answer_0(iid, EBUSY); 314 return; 315 } 316 317 fibril_rwlock_write_unlock(&stopping_lock); 318 319 /* There should be no functions at this point */ 320 fibril_mutex_lock(&functions_mutex); 321 assert(list_first(&functions) == NULL); 322 fibril_mutex_unlock(&functions_mutex); 323 324 /* Reply with success and terminate */ 325 async_answer_0(iid, EOK); 326 exit(0); 284 327 } 285 328 … … 312 355 case DRIVER_FUN_OFFLINE: 313 356 driver_fun_offline(callid, &call); 357 break; 358 case DRIVER_STOP: 359 driver_stop(callid, &call); 314 360 break; 315 361 default:
Note:
See TracChangeset
for help on using the changeset viewer.