Changeset 16dc887 in mainline for uspace/srv/devman
- Timestamp:
- 2011-08-16T14:00:32Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 278ac72, b112055
- Parents:
- 3751a08 (diff), cc574511 (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. - Location:
- uspace/srv/devman
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/devman.c
r3751a08 r16dc887 37 37 #include <ipc/driver.h> 38 38 #include <ipc/devman.h> 39 #include < devmap.h>39 #include <loc.h> 40 40 #include <str_error.h> 41 41 #include <stdio.h> … … 66 66 } 67 67 68 static int devmap_functions_compare(unsigned long key[], hash_count_t keys,68 static int loc_functions_compare(unsigned long key[], hash_count_t keys, 69 69 link_t *item) 70 70 { 71 fun_node_t *fun = hash_table_get_instance(item, fun_node_t, devmap_fun);72 return (fun-> devmap_handle == (devmap_handle_t) key[0]);73 } 74 75 static int devmap_devices_class_compare(unsigned long key[], hash_count_t keys,71 fun_node_t *fun = hash_table_get_instance(item, fun_node_t, loc_fun); 72 return (fun->service_id == (service_id_t) key[0]); 73 } 74 75 static int loc_devices_class_compare(unsigned long key[], hash_count_t keys, 76 76 link_t *item) 77 77 { 78 78 dev_class_info_t *class_info 79 = hash_table_get_instance(item, dev_class_info_t, devmap_link);79 = hash_table_get_instance(item, dev_class_info_t, loc_link); 80 80 assert(class_info != NULL); 81 81 82 return (class_info-> devmap_handle == (devmap_handle_t) key[0]);82 return (class_info->service_id == (service_id_t) key[0]); 83 83 } 84 84 … … 99 99 }; 100 100 101 static hash_table_operations_t devmap_devices_ops = {101 static hash_table_operations_t loc_devices_ops = { 102 102 .hash = devices_hash, 103 .compare = devmap_functions_compare,103 .compare = loc_functions_compare, 104 104 .remove_callback = devices_remove_callback 105 105 }; 106 106 107 static hash_table_operations_t devmap_devices_class_ops = {107 static hash_table_operations_t loc_devices_class_ops = { 108 108 .hash = devices_hash, 109 .compare = devmap_devices_class_compare,109 .compare = loc_devices_class_compare, 110 110 .remove_callback = devices_remove_callback 111 111 }; … … 701 701 } 702 702 703 /** Create devmappath and name for the function. */704 void devmap_register_tree_function(fun_node_t *fun, dev_tree_t *tree)705 { 706 char * devmap_pathname = NULL;707 char * devmap_name = NULL;708 709 asprintf(& devmap_name, "%s", fun->pathname);710 if ( devmap_name == NULL)703 /** Create loc path and name for the function. */ 704 void loc_register_tree_function(fun_node_t *fun, dev_tree_t *tree) 705 { 706 char *loc_pathname = NULL; 707 char *loc_name = NULL; 708 709 asprintf(&loc_name, "%s", fun->pathname); 710 if (loc_name == NULL) 711 711 return; 712 712 713 replace_char( devmap_name, '/', DEVMAP_SEPARATOR);714 715 asprintf(& devmap_pathname, "%s/%s", DEVMAP_DEVICE_NAMESPACE,716 devmap_name);717 if ( devmap_pathname == NULL) {718 free( devmap_name);713 replace_char(loc_name, '/', LOC_SEPARATOR); 714 715 asprintf(&loc_pathname, "%s/%s", LOC_DEVICE_NAMESPACE, 716 loc_name); 717 if (loc_pathname == NULL) { 718 free(loc_name); 719 719 return; 720 720 } 721 721 722 devmap_device_register_with_iface(devmap_pathname,723 &fun-> devmap_handle, DEVMAN_CONNECT_FROM_DEVMAP);724 725 tree_add_ devmap_function(tree, fun);726 727 free( devmap_name);728 free( devmap_pathname);722 loc_service_register_with_iface(loc_pathname, 723 &fun->service_id, DEVMAN_CONNECT_FROM_LOC); 724 725 tree_add_loc_function(tree, fun); 726 727 free(loc_name); 728 free(loc_pathname); 729 729 } 730 730 … … 856 856 hash_table_create(&tree->devman_functions, DEVICE_BUCKETS, 1, 857 857 &devman_functions_ops); 858 hash_table_create(&tree-> devmap_functions, DEVICE_BUCKETS, 1,859 & devmap_devices_ops);858 hash_table_create(&tree->loc_functions, DEVICE_BUCKETS, 1, 859 &loc_devices_ops); 860 860 861 861 fibril_rwlock_initialize(&tree->rwlock); … … 952 952 list_initialize(&res->classes); 953 953 link_initialize(&res->devman_fun); 954 link_initialize(&res-> devmap_fun);954 link_initialize(&res->loc_fun); 955 955 } 956 956 … … 1268 1268 memset(info, 0, sizeof(dev_class_info_t)); 1269 1269 link_initialize(&info->dev_classes); 1270 link_initialize(&info-> devmap_link);1270 link_initialize(&info->loc_link); 1271 1271 link_initialize(&info->link); 1272 1272 } … … 1414 1414 list_initialize(&class_list->classes); 1415 1415 fibril_rwlock_initialize(&class_list->rwlock); 1416 hash_table_create(&class_list-> devmap_functions, DEVICE_BUCKETS, 1,1417 & devmap_devices_class_ops);1418 } 1419 1420 1421 /* Devmapdevices */1422 1423 fun_node_t *find_ devmap_tree_function(dev_tree_t *tree, devmap_handle_t devmap_handle)1416 hash_table_create(&class_list->loc_functions, DEVICE_BUCKETS, 1, 1417 &loc_devices_class_ops); 1418 } 1419 1420 1421 /* loc devices */ 1422 1423 fun_node_t *find_loc_tree_function(dev_tree_t *tree, service_id_t service_id) 1424 1424 { 1425 1425 fun_node_t *fun = NULL; 1426 1426 link_t *link; 1427 unsigned long key = (unsigned long) devmap_handle;1427 unsigned long key = (unsigned long) service_id; 1428 1428 1429 1429 fibril_rwlock_read_lock(&tree->rwlock); 1430 link = hash_table_find(&tree-> devmap_functions, &key);1430 link = hash_table_find(&tree->loc_functions, &key); 1431 1431 if (link != NULL) 1432 fun = hash_table_get_instance(link, fun_node_t, devmap_fun);1432 fun = hash_table_get_instance(link, fun_node_t, loc_fun); 1433 1433 fibril_rwlock_read_unlock(&tree->rwlock); 1434 1434 … … 1436 1436 } 1437 1437 1438 fun_node_t *find_ devmap_class_function(class_list_t *classes,1439 devmap_handle_t devmap_handle)1438 fun_node_t *find_loc_class_function(class_list_t *classes, 1439 service_id_t service_id) 1440 1440 { 1441 1441 fun_node_t *fun = NULL; 1442 1442 dev_class_info_t *cli; 1443 1443 link_t *link; 1444 unsigned long key = (unsigned long) devmap_handle;1444 unsigned long key = (unsigned long)service_id; 1445 1445 1446 1446 fibril_rwlock_read_lock(&classes->rwlock); 1447 link = hash_table_find(&classes-> devmap_functions, &key);1447 link = hash_table_find(&classes->loc_functions, &key); 1448 1448 if (link != NULL) { 1449 1449 cli = hash_table_get_instance(link, dev_class_info_t, 1450 devmap_link);1450 loc_link); 1451 1451 fun = cli->fun; 1452 1452 } … … 1456 1456 } 1457 1457 1458 void class_add_ devmap_function(class_list_t *class_list, dev_class_info_t *cli)1459 { 1460 unsigned long key = (unsigned long) cli-> devmap_handle;1458 void class_add_loc_function(class_list_t *class_list, dev_class_info_t *cli) 1459 { 1460 unsigned long key = (unsigned long) cli->service_id; 1461 1461 1462 1462 fibril_rwlock_write_lock(&class_list->rwlock); 1463 hash_table_insert(&class_list-> devmap_functions, &key, &cli->devmap_link);1463 hash_table_insert(&class_list->loc_functions, &key, &cli->loc_link); 1464 1464 fibril_rwlock_write_unlock(&class_list->rwlock); 1465 1465 1466 assert(find_ devmap_class_function(class_list, cli->devmap_handle) != NULL);1467 } 1468 1469 void tree_add_ devmap_function(dev_tree_t *tree, fun_node_t *fun)1470 { 1471 unsigned long key = (unsigned long) fun-> devmap_handle;1466 assert(find_loc_class_function(class_list, cli->service_id) != NULL); 1467 } 1468 1469 void tree_add_loc_function(dev_tree_t *tree, fun_node_t *fun) 1470 { 1471 unsigned long key = (unsigned long) fun->service_id; 1472 1472 fibril_rwlock_write_lock(&tree->rwlock); 1473 hash_table_insert(&tree-> devmap_functions, &key, &fun->devmap_fun);1473 hash_table_insert(&tree->loc_functions, &key, &fun->loc_fun); 1474 1474 fibril_rwlock_write_unlock(&tree->rwlock); 1475 1475 } -
uspace/srv/devman/devman.h
r3751a08 r16dc887 41 41 #include <adt/hash_table.h> 42 42 #include <ipc/devman.h> 43 #include <ipc/ devmap.h>43 #include <ipc/loc.h> 44 44 #include <fibril_synch.h> 45 45 #include <atomic.h> … … 53 53 #define DEVICE_BUCKETS 256 54 54 55 #define DEVMAP_CLASS_NAMESPACE "class"56 #define DEVMAP_DEVICE_NAMESPACE "devices"57 #define DEVMAP_SEPARATOR '\\'55 #define LOC_CLASS_NAMESPACE "class" 56 #define LOC_DEVICE_NAMESPACE "devices" 57 #define LOC_SEPARATOR '\\' 58 58 59 59 struct dev_node; … … 172 172 /** List of device classes to which this device function belongs. */ 173 173 list_t classes; 174 /** Devmap handle if the device function is registered by devmap. */175 devmap_handle_t devmap_handle;174 /** Service ID if the device function is registered with loc. */ 175 service_id_t service_id; 176 176 177 177 /** … … 181 181 182 182 /** 183 * Used by the hash table of functions indexed by devmap device handles.184 */ 185 link_t devmap_fun;183 * Used by the hash table of functions indexed by service IDs. 184 */ 185 link_t loc_fun; 186 186 }; 187 187 … … 208 208 209 209 /** 210 * Hash table of devices registered by devmapper, indexed by devmap211 * handles.212 */ 213 hash_table_t devmap_functions;210 * Hash table of services registered with location service, indexed by 211 * service IDs. 212 */ 213 hash_table_t loc_functions; 214 214 } dev_tree_t; 215 215 … … 267 267 /** The name of the device function within the class. */ 268 268 char *dev_name; 269 /** The handle of the device by device mapperin the class namespace. */270 devmap_handle_t devmap_handle;271 272 /** 273 * Link in the hash table of devices registered by the devmapperusing269 /** Service ID in the class namespace. */ 270 service_id_t service_id; 271 272 /** 273 * Link to hash table of services registered with location service using 274 274 * their class names. 275 275 */ 276 link_t devmap_link;276 link_t loc_link; 277 277 } dev_class_info_t; 278 278 … … 283 283 284 284 /** 285 * Hash table of devices registered by devmapper using their class name,286 * indexed by devmap handles.287 */ 288 hash_table_t devmap_functions;285 * Hash table of services registered with location service using their 286 * class name, indexed by service IDs. 287 */ 288 hash_table_t loc_functions; 289 289 290 290 /** Fibril mutex for list of classes. */ … … 364 364 extern void add_dev_class_no_lock(class_list_t *, dev_class_t *); 365 365 366 /* Devmap devices */367 368 extern void devmap_register_tree_function(fun_node_t *, dev_tree_t *);369 370 extern fun_node_t *find_ devmap_tree_function(dev_tree_t *, devmap_handle_t);371 extern fun_node_t *find_ devmap_class_function(class_list_t *, devmap_handle_t);372 373 extern void class_add_ devmap_function(class_list_t *, dev_class_info_t *);374 extern void tree_add_ devmap_function(dev_tree_t *, fun_node_t *);366 /* Loc services */ 367 368 extern void loc_register_tree_function(fun_node_t *, dev_tree_t *); 369 370 extern fun_node_t *find_loc_tree_function(dev_tree_t *, service_id_t); 371 extern fun_node_t *find_loc_class_function(class_list_t *, service_id_t); 372 373 extern void class_add_loc_function(class_list_t *, dev_class_info_t *); 374 extern void tree_add_loc_function(dev_tree_t *, fun_node_t *); 375 375 376 376 #endif -
uspace/srv/devman/main.c
r3751a08 r16dc887 56 56 #include <ipc/driver.h> 57 57 #include <thread.h> 58 #include < devmap.h>58 #include <loc.h> 59 59 60 60 #include "devman.h" … … 326 326 } 327 327 } else { 328 devmap_register_tree_function(fun, tree);328 loc_register_tree_function(fun, tree); 329 329 } 330 330 … … 333 333 } 334 334 335 static void devmap_register_class_dev(dev_class_info_t *cli)336 { 337 /* Create devmap path and name for the device. */338 char * devmap_pathname = NULL;339 340 asprintf(& devmap_pathname, "%s/%s%c%s", DEVMAP_CLASS_NAMESPACE,341 cli->dev_class->name, DEVMAP_SEPARATOR, cli->dev_name);342 if ( devmap_pathname == NULL)335 static void loc_register_class_dev(dev_class_info_t *cli) 336 { 337 /* Create loc path and name for the service. */ 338 char *loc_pathname = NULL; 339 340 asprintf(&loc_pathname, "%s/%s%c%s", LOC_CLASS_NAMESPACE, 341 cli->dev_class->name, LOC_SEPARATOR, cli->dev_name); 342 if (loc_pathname == NULL) 343 343 return; 344 344 345 345 /* 346 * Register the device by the device mapper and remember its devmap347 * handle.346 * Register the device with location service and remember its 347 * service ID. 348 348 */ 349 devmap_device_register_with_iface(devmap_pathname,350 &cli-> devmap_handle, DEVMAN_CONNECT_FROM_DEVMAP);349 loc_service_register_with_iface(loc_pathname, 350 &cli->service_id, DEVMAN_CONNECT_FROM_LOC); 351 351 352 352 /* 353 * Add device to the hash map of class devices registered by device354 * mapper.353 * Add device to the hash map of class devices registered with 354 * location service. 355 355 */ 356 class_add_ devmap_function(&class_list, cli);357 358 free( devmap_pathname);356 class_add_loc_function(&class_list, cli); 357 358 free(loc_pathname); 359 359 } 360 360 … … 362 362 { 363 363 devman_handle_t handle = IPC_GET_ARG1(*call); 364 category_id_t cat_id; 365 int rc; 364 366 365 367 /* Get class name. */ 366 368 char *class_name; 367 intrc = async_data_write_accept((void **) &class_name, true,369 rc = async_data_write_accept((void **) &class_name, true, 368 370 0, 0, 0, 0); 369 371 if (rc != EOK) { … … 381 383 dev_class_info_t *class_info = add_function_to_class(fun, cl, NULL); 382 384 383 /* Register the device's class alias by devmapper. */ 384 devmap_register_class_dev(class_info); 385 /* Register the device's class alias with location service. */ 386 loc_register_class_dev(class_info); 387 388 rc = loc_category_get_id(class_name, &cat_id, IPC_FLAG_BLOCKING); 389 if (rc == EOK) { 390 loc_service_add_to_cat(fun->service_id, cat_id); 391 } else { 392 log_msg(LVL_ERROR, "Failed adding function `%s' to category " 393 "`%s'.", fun->pathname, class_name); 394 } 385 395 386 396 log_msg(LVL_NOTE, "Function `%s' added to class `%s' as `%s'.", … … 659 669 } 660 670 661 /** Function for handling connections from a client forwarded by the device662 * mapperto the device manager. */663 static void devman_connection_ devmapper(ipc_callid_t iid, ipc_call_t *icall)664 { 665 devmap_handle_t devmap_handle= IPC_GET_ARG2(*icall);671 /** Function for handling connections from a client forwarded by the location 672 * service to the device manager. */ 673 static void devman_connection_loc(ipc_callid_t iid, ipc_call_t *icall) 674 { 675 service_id_t service_id = IPC_GET_ARG2(*icall); 666 676 fun_node_t *fun; 667 677 dev_node_t *dev; 668 678 669 fun = find_ devmap_tree_function(&device_tree, devmap_handle);679 fun = find_loc_tree_function(&device_tree, service_id); 670 680 if (fun == NULL) 671 fun = find_ devmap_class_function(&class_list, devmap_handle);681 fun = find_loc_class_function(&class_list, service_id); 672 682 673 683 if (fun == NULL || fun->dev->drv == NULL) { … … 689 699 690 700 log_msg(LVL_DEBUG, 691 "Forwarding devmapperrequest for `%s' function to driver `%s'.",701 "Forwarding loc service request for `%s' function to driver `%s'.", 692 702 fun->pathname, dev->drv->name); 693 703 } … … 708 718 devman_forward(iid, icall, false); 709 719 break; 710 case DEVMAN_CONNECT_FROM_ DEVMAP:711 /* Someone connected through devmapnode. */712 devman_connection_ devmapper(iid, icall);720 case DEVMAN_CONNECT_FROM_LOC: 721 /* Someone connected through loc node. */ 722 devman_connection_loc(iid, icall); 713 723 break; 714 724 case DEVMAN_CONNECT_TO_PARENTS_DEVICE: … … 746 756 747 757 /* 748 * !!! devman_connection ... as the device manager is not a real devmap758 * !!! devman_connection ... as the device manager is not a real loc 749 759 * driver (it uses a completely different ipc protocol than an ordinary 750 * devmapdriver) forwarding a connection from client to the devman by751 * devmapperwould not work.760 * loc driver) forwarding a connection from client to the devman by 761 * location service would not work. 752 762 */ 753 devmap_driver_register(NAME, devman_connection);763 loc_server_register(NAME, devman_connection); 754 764 755 765 return true; … … 760 770 printf(NAME ": HelenOS Device Manager\n"); 761 771 762 if (log_init(NAME, LVL_ ERROR) != EOK) {772 if (log_init(NAME, LVL_WARN) != EOK) { 763 773 printf(NAME ": Error initializing logging subsystem.\n"); 764 774 return -1;
Note:
See TracChangeset
for help on using the changeset viewer.
