Changeset d51ee2b in mainline
- Timestamp:
- 2010-05-21T13:59:09Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 957cfa58
- Parents:
- c47e1a8
- Location:
- uspace/srv/devman
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/devman.c
rc47e1a8 rd51ee2b 736 736 } 737 737 738 /** Create unique device name within the class. 739 * 740 * @param cl the class. 741 * @param base_dev_name contains base name for the device 742 * if it was specified by the driver when it registered the device by the class; 743 * NULL if driver specified no base name. 744 * @return the unique name for the device within the class. 745 */ 746 char * create_dev_name_for_class(dev_class_t *cl, const char *base_dev_name) 747 { 748 char *dev_name; 749 const char *base_name; 750 if (NULL != base_dev_name) { 751 base_name = base_dev_name; 752 } else { 753 base_name = cl->base_dev_name; 754 } 755 756 size_t idx = get_new_class_dev_idx(cl); 757 asprintf(&dev_name, "%s%d", base_name, idx); 758 return dev_name; 759 } 760 761 /** Add the device to the class. 762 * 763 * The device may be added to multiple classes and a class may contain multiple devices. 764 * The class and the device are associated with each other by the dev_class_info_t structure. 765 * 766 * @param dev the device. 767 * @param class the class. 768 * @param base_dev_name the base name of the device within the class if specified by the driver, 769 * NULL otherwise. 770 * @return dev_class_info_t structure which associates the device with the class. 771 */ 772 dev_class_info_t * add_device_to_class(node_t *dev, dev_class_t *cl, const char *base_dev_name) 773 { 774 dev_class_info_t *info = create_dev_class_info(); 775 info->dev_class = cl; 776 info->dev = dev; 777 778 // add the device to the class 779 fibril_mutex_lock(&cl->mutex); 780 list_append(&info->link, &cl->devices); 781 fibril_mutex_unlock(&cl->mutex); 782 783 // add the class to the device 784 list_append(&info->dev_classes, &dev->classes); 785 786 // create unique name for the device within the class 787 info->dev_name = create_dev_name_for_class(cl, base_dev_name); 788 789 return info; 790 } 791 738 792 /** @} 739 793 */ -
uspace/srv/devman/devman.h
rc47e1a8 rd51ee2b 41 41 #include <ipc/ipc.h> 42 42 #include <ipc/devman.h> 43 #include <ipc/devmap.h> 43 44 #include <fibril_synch.h> 44 45 #include <atomic.h> … … 52 53 53 54 struct node; 54 55 55 typedef struct node node_t; 56 56 … … 126 126 owned by one driver */ 127 127 link_t driver_devices; 128 /** The list of device classes to which this device belongs.*/ 129 link_t classes; 128 130 }; 129 131 … … 139 141 } dev_tree_t; 140 142 141 143 typedef struct dev_class { 144 /** The name of the class.*/ 145 const char *name; 146 /** Pointer to the previous and next class in the list of registered classes.*/ 147 link_t link; 148 /** List of dev_class_info structures - one for each device registered by this class.*/ 149 link_t devices; 150 /** Default base name for the device within the class, might be overrided by the driver.*/ 151 const char *base_dev_name; 152 /** Unique numerical identifier appened to the base name of the newly added device.*/ 153 size_t curr_dev_idx; 154 /** Synchronize access to the list of devices in this class. */ 155 fibril_mutex_t mutex; 156 } dev_class_t; 157 158 /** Provides n-to-m mapping between device nodes and classes 159 * - each device may be register to the arbitrary number of classes 160 * and each class may contain the arbitrary number of devices. */ 161 typedef struct dev_class_info { 162 /** The class.*/ 163 dev_class_t *dev_class; 164 /** The device.*/ 165 node_t *dev; 166 /** Pointer to the previous and next class info in the list of devices registered by the class.*/ 167 link_t link; 168 /** Pointer to the previous and next class info in the list of classes by which the device is registered.*/ 169 link_t dev_classes; 170 /** The name of the device within the class.*/ 171 char *dev_name; 172 /** The handle of the device by device mapper in the class namespace.*/ 173 dev_handle_t devmap_handle; 174 } dev_class_info_t; 142 175 143 176 // Match ids and scores … … 289 322 bool insert_dev_node(dev_tree_t *tree, node_t *node, char *dev_name, node_t *parent); 290 323 324 // Device classes 325 326 /** Create device class. 327 * 328 * @return device class. 329 */ 330 static inline dev_class_t * create_dev_class() 331 { 332 dev_class_t *cl = (dev_class_t *)malloc(sizeof(dev_class_t)); 333 if (NULL != cl) { 334 memset(cl, 0, sizeof(dev_class_t)); 335 fibril_mutex_initialize(&cl->mutex); 336 } 337 return cl; 338 } 339 340 /** Create device class info. 341 * 342 * @return device class info. 343 */ 344 static inline dev_class_info_t * create_dev_class_info() 345 { 346 dev_class_info_t *info = (dev_class_info_t *)malloc(sizeof(dev_class_info_t)); 347 if (NULL != info) { 348 memset(info, 0, sizeof(dev_class_info_t)); 349 } 350 return info; 351 } 352 353 static inline size_t get_new_class_dev_idx(dev_class_t *cl) 354 { 355 size_t dev_idx; 356 fibril_mutex_lock(&cl->mutex); 357 dev_idx = ++cl->curr_dev_idx; 358 fibril_mutex_unlock(&cl->mutex); 359 return dev_idx; 360 } 361 362 char * create_dev_name_for_class(dev_class_t *cl, const char *base_dev_name); 363 dev_class_info_t * add_device_to_class(node_t *dev, dev_class_t *cl, const char *base_dev_name); 364 291 365 #endif 292 366
Note:
See TracChangeset
for help on using the changeset viewer.