Changeset 9a7e5b4 in mainline for uspace/lib/usb/src/host/usb_endpoint_manager.c
- Timestamp:
- 2011-04-07T08:19:03Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 41c1f7b
- Parents:
- dcaf819 (diff), 506d330 (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/lib/usb/src/host/usb_endpoint_manager.c
rdcaf819 r9a7e5b4 35 35 #define BUCKET_COUNT 7 36 36 37 typedef struct { 38 usb_address_t address; 39 usb_endpoint_t endpoint; 40 usb_direction_t direction; 41 } __attribute__((aligned (sizeof(unsigned long)))) id_t; 42 #define MAX_KEYS (sizeof(id_t) / sizeof(unsigned long)) 37 #define MAX_KEYS (3) 43 38 typedef struct { 44 union {45 id_t id;46 unsigned long key[MAX_KEYS];47 };48 39 link_t link; 49 40 size_t bw; … … 66 57 assert(item); 67 58 node_t *node = hash_table_get_instance(item, node_t, link); 68 hash_count_t i = 0; 69 for (; i < keys; ++i) { 70 if (key[i] != node->key[i]) 71 return false; 72 } 73 return true; 59 assert(node); 60 assert(node->ep); 61 bool match = true; 62 switch (keys) { 63 case 3: 64 match = match && (key[2] == node->ep->direction); 65 case 2: 66 match = match && (key[1] == (unsigned long)node->ep->endpoint); 67 case 1: 68 match = match && (key[0] == (unsigned long)node->ep->address); 69 break; 70 default: 71 match = false; 72 } 73 return match; 74 74 } 75 75 /*----------------------------------------------------------------------------*/ … … 142 142 /*----------------------------------------------------------------------------*/ 143 143 int usb_endpoint_manager_register_ep(usb_endpoint_manager_t *instance, 144 usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction,145 144 endpoint_t *ep, size_t data_size) 146 145 { … … 150 149 assert(instance); 151 150 152 id_t id = { 153 .address = address, 154 .endpoint = endpoint, 155 .direction = direction, 156 }; 151 unsigned long key[MAX_KEYS] = 152 {ep->address, ep->endpoint, ep->direction}; 157 153 fibril_mutex_lock(&instance->guard); 158 154 159 155 link_t *item = 160 hash_table_find(&instance->ep_table, (unsigned long*)&id);156 hash_table_find(&instance->ep_table, key); 161 157 if (item != NULL) { 162 158 fibril_mutex_unlock(&instance->guard); … … 175 171 } 176 172 177 node->id = id;178 173 node->bw = bw; 179 174 node->ep = ep; 180 175 link_initialize(&node->link); 181 176 182 hash_table_insert(&instance->ep_table, 183 (unsigned long*)&id, &node->link); 177 hash_table_insert(&instance->ep_table, key, &node->link); 184 178 instance->free_bw -= bw; 185 179 fibril_mutex_unlock(&instance->guard); … … 192 186 { 193 187 assert(instance); 194 id_t id = { 195 .address = address, 196 .endpoint = endpoint, 197 .direction = direction, 198 }; 188 unsigned long key[MAX_KEYS] = {address, endpoint, direction}; 189 199 190 fibril_mutex_lock(&instance->guard); 200 link_t *item = 201 hash_table_find(&instance->ep_table, (unsigned long*)&id); 191 link_t *item = hash_table_find(&instance->ep_table, key); 202 192 if (item == NULL) { 203 193 fibril_mutex_unlock(&instance->guard); … … 207 197 node_t *node = hash_table_get_instance(item, node_t, link); 208 198 instance->free_bw += node->bw; 209 hash_table_remove(&instance->ep_table, (unsigned long*)&id, MAX_KEYS);199 hash_table_remove(&instance->ep_table, key, MAX_KEYS); 210 200 211 201 fibril_mutex_unlock(&instance->guard); … … 219 209 { 220 210 assert(instance); 221 id_t id = { 222 .address = address, 223 .endpoint = endpoint, 224 .direction = direction, 225 }; 211 unsigned long key[MAX_KEYS] = {address, endpoint, direction}; 212 226 213 fibril_mutex_lock(&instance->guard); 227 link_t *item = 228 hash_table_find(&instance->ep_table, (unsigned long*)&id); 214 link_t *item = hash_table_find(&instance->ep_table, key); 229 215 if (item == NULL) { 230 216 fibril_mutex_unlock(&instance->guard);
Note:
See TracChangeset
for help on using the changeset viewer.