Changeset 97c7682 in mainline for uspace/srv/devman/main.c
- Timestamp:
- 2012-07-14T11:18:40Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 804d9b6
- Parents:
- 0747468 (diff), f0348c8 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/main.c
r0747468 r97c7682 245 245 246 246 fibril_rwlock_write_lock(&device_tree.rwlock); 247 247 248 248 if (fun->state == FUN_ON_LINE) { 249 249 fibril_rwlock_write_unlock(&device_tree.rwlock); … … 259 259 return ENOMEM; 260 260 } 261 261 262 262 insert_dev_node(&device_tree, dev, fun); 263 263 dev_add_ref(dev); … … 272 272 /* Give one reference over to assign_driver_fibril(). */ 273 273 dev_add_ref(dev); 274 274 275 /* 275 276 * Try to find a suitable driver and assign it to the device. We do … … 288 289 } 289 290 fibril_add_ready(assign_fibril); 290 } else {291 } else 291 292 loc_register_tree_function(fun, &device_tree); 292 }293 293 294 294 fibril_rwlock_write_unlock(&device_tree.rwlock); … … 419 419 420 420 /* Check that function with same name is not there already. */ 421 if (find_fun_node_in_device(tree, pdev, fun_name) != NULL) { 421 fun_node_t *tfun = find_fun_node_in_device(tree, pdev, fun_name); 422 if (tfun) { 423 fun_del_ref(tfun); /* drop the new unwanted reference */ 422 424 fibril_rwlock_write_unlock(&tree->rwlock); 423 425 dev_del_ref(pdev); … … 855 857 } 856 858 859 /** Get function driver name. */ 860 static void devman_fun_get_driver_name(ipc_callid_t iid, ipc_call_t *icall) 861 { 862 devman_handle_t handle = IPC_GET_ARG1(*icall); 863 864 fun_node_t *fun = find_fun_node(&device_tree, handle); 865 if (fun == NULL) { 866 async_answer_0(iid, ENOMEM); 867 return; 868 } 869 870 ipc_callid_t data_callid; 871 size_t data_len; 872 if (!async_data_read_receive(&data_callid, &data_len)) { 873 async_answer_0(iid, EINVAL); 874 fun_del_ref(fun); 875 return; 876 } 877 878 void *buffer = malloc(data_len); 879 if (buffer == NULL) { 880 async_answer_0(data_callid, ENOMEM); 881 async_answer_0(iid, ENOMEM); 882 fun_del_ref(fun); 883 return; 884 } 885 886 fibril_rwlock_read_lock(&device_tree.rwlock); 887 888 /* Check function state */ 889 if (fun->state == FUN_REMOVED) { 890 fibril_rwlock_read_unlock(&device_tree.rwlock); 891 free(buffer); 892 893 async_answer_0(data_callid, ENOENT); 894 async_answer_0(iid, ENOENT); 895 fun_del_ref(fun); 896 return; 897 } 898 899 /* Check whether function has a driver */ 900 if (fun->child == NULL || fun->child->drv == NULL) { 901 fibril_rwlock_read_unlock(&device_tree.rwlock); 902 free(buffer); 903 904 async_answer_0(data_callid, EINVAL); 905 async_answer_0(iid, EINVAL); 906 fun_del_ref(fun); 907 return; 908 } 909 910 size_t sent_length = str_size(fun->child->drv->name); 911 if (sent_length > data_len) { 912 sent_length = data_len; 913 } 914 915 async_data_read_finalize(data_callid, fun->child->drv->name, 916 sent_length); 917 async_answer_0(iid, EOK); 918 919 fibril_rwlock_read_unlock(&device_tree.rwlock); 920 fun_del_ref(fun); 921 free(buffer); 922 } 857 923 858 924 /** Get device path. */ … … 1083 1149 devman_fun_get_name(callid, &call); 1084 1150 break; 1151 case DEVMAN_FUN_GET_DRIVER_NAME: 1152 devman_fun_get_driver_name(callid, &call); 1153 break; 1085 1154 case DEVMAN_FUN_GET_PATH: 1086 1155 devman_fun_get_path(callid, &call); … … 1149 1218 if (dev->pfun->dev != NULL) 1150 1219 driver = dev->pfun->dev->drv; 1220 1151 1221 fwd_h = dev->pfun->handle; 1152 1222 } else if (dev->state == DEVICE_USABLE) { … … 1154 1224 driver = dev->drv; 1155 1225 assert(driver != NULL); 1156 1226 1157 1227 fwd_h = handle; 1158 1228 } … … 1181 1251 1182 1252 if (fun != NULL) { 1183 log_msg(LVL_DEBUG, 1253 log_msg(LVL_DEBUG, 1184 1254 "Forwarding request for `%s' function to driver `%s'.", 1185 1255 fun->pathname, driver->name); 1186 1256 } else { 1187 log_msg(LVL_DEBUG, 1257 log_msg(LVL_DEBUG, 1188 1258 "Forwarding request for `%s' device to driver `%s'.", 1189 1259 dev->pfun->pathname, driver->name); … … 1193 1263 async_forward_fast(iid, exch, method, fwd_h, 0, IPC_FF_NONE); 1194 1264 async_exchange_end(exch); 1195 1265 1196 1266 cleanup: 1197 1267 if (dev != NULL) 1198 1268 dev_del_ref(dev); 1269 1199 1270 if (fun != NULL) 1200 1271 fun_del_ref(fun); … … 1299 1370 return false; 1300 1371 } 1301 1372 1302 1373 log_msg(LVL_DEBUG, "devman_init - list of drivers has been initialized."); 1303 1374 1304 1375 /* Create root device node. */ 1305 1376 if (!init_device_tree(&device_tree, &drivers_list)) { … … 1307 1378 return false; 1308 1379 } 1309 1380 1310 1381 /* 1311 1382 * Caution: As the device manager is not a real loc … … 1322 1393 int main(int argc, char *argv[]) 1323 1394 { 1324 printf(NAME ": HelenOS Device Manager\n"); 1325 1326 if (log_init(NAME, LVL_WARN) != EOK) { 1327 printf(NAME ": Error initializing logging subsystem.\n"); 1328 return -1; 1395 printf("%s: HelenOS Device Manager\n", NAME); 1396 1397 int rc = log_init(NAME, LVL_WARN); 1398 if (rc != EOK) { 1399 printf("%s: Error initializing logging subsystem.\n", NAME); 1400 return rc; 1329 1401 } 1330 1402 … … 1333 1405 async_set_client_data_destructor(devman_client_data_destroy); 1334 1406 async_set_client_connection(devman_connection); 1335 1407 1336 1408 if (!devman_init()) { 1337 1409 log_msg(LVL_ERROR, "Error while initializing service."); 1338 1410 return -1; 1339 1411 } 1340 1412 1341 1413 /* Register device manager at naming service. */ 1342 if (service_register(SERVICE_DEVMAN) != EOK) { 1414 rc = service_register(SERVICE_DEVMAN); 1415 if (rc != EOK) { 1343 1416 log_msg(LVL_ERROR, "Failed registering as a service."); 1344 return -1;1345 } 1346 1347 printf( NAME ": Accepting connections.\n");1417 return rc; 1418 } 1419 1420 printf("%s: Accepting connections.\n", NAME); 1348 1421 task_retval(0); 1349 1422 async_manager(); 1350 1423 1351 1424 /* Never reached. */ 1352 1425 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.