Changeset 41811af in mainline for uspace/srv/fs/devfs/devfs_ops.c
- Timestamp:
- 2011-06-10T10:14:26Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ab547063
- Parents:
- 9536e6e (diff), 390d80d (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/fs/devfs/devfs_ops.c
r9536e6e r41811af 59 59 typedef struct { 60 60 devmap_handle_t handle; 61 int phone; /**< When < 0, the structure is incomplete. */61 async_sess_t *sess; /**< If NULL, the structure is incomplete. */ 62 62 size_t refcount; 63 63 link_t link; 64 fibril_condvar_t cv; 64 fibril_condvar_t cv; /**< Broadcast when completed. */ 65 65 } device_t; 66 66 … … 232 232 }; 233 233 link_t *lnk; 234 234 235 235 fibril_mutex_lock(&devices_mutex); 236 236 restart: … … 244 244 245 245 dev->handle = node->handle; 246 dev->phone = -1; /* mark as incomplete */ 246 247 /* Mark as incomplete */ 248 dev->sess = NULL; 247 249 dev->refcount = 1; 248 250 fibril_condvar_initialize(&dev->cv); 249 251 250 252 /* 251 253 * Insert the incomplete device structure so that other … … 254 256 */ 255 257 hash_table_insert(&devices, key, &dev->link); 256 258 257 259 /* 258 260 * Drop the mutex to allow recursive devfs requests. 259 261 */ 260 262 fibril_mutex_unlock(&devices_mutex); 261 262 int phone = devmap_device_connect(node->handle, 0); 263 263 264 async_sess_t *sess = devmap_device_connect(EXCHANGE_SERIALIZE, 265 node->handle, 0); 266 264 267 fibril_mutex_lock(&devices_mutex); 265 268 266 269 /* 267 270 * Notify possible waiters about this device structure … … 269 272 */ 270 273 fibril_condvar_broadcast(&dev->cv); 271 272 if ( phone < 0) {274 275 if (!sess) { 273 276 /* 274 277 * Connecting failed, need to remove the … … 277 280 hash_table_remove(&devices, key, DEVICES_KEYS); 278 281 fibril_mutex_unlock(&devices_mutex); 279 282 280 283 return ENOENT; 281 284 } 282 285 283 /* Set the correct phone. */284 dev-> phone = phone;286 /* Set the correct session. */ 287 dev->sess = sess; 285 288 } else { 286 289 device_t *dev = hash_table_get_instance(lnk, device_t, link); 287 288 if ( dev->phone < 0) {290 291 if (!dev->sess) { 289 292 /* 290 293 * Wait until the device structure is completed … … 608 611 609 612 device_t *dev = hash_table_get_instance(lnk, device_t, link); 610 assert(dev-> phone >= 0);613 assert(dev->sess); 611 614 612 615 ipc_callid_t callid; … … 619 622 620 623 /* Make a request at the driver */ 624 async_exch_t *exch = async_exchange_begin(dev->sess); 625 621 626 ipc_call_t answer; 622 aid_t msg = async_send_3( dev->phone, IPC_GET_IMETHOD(*request),627 aid_t msg = async_send_3(exch, IPC_GET_IMETHOD(*request), 623 628 IPC_GET_ARG1(*request), IPC_GET_ARG2(*request), 624 629 IPC_GET_ARG3(*request), &answer); 625 630 626 631 /* Forward the IPC_M_DATA_READ request to the driver */ 627 async_forward_fast(callid, dev->phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 632 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 633 634 async_exchange_end(exch); 635 628 636 fibril_mutex_unlock(&devices_mutex); 629 637 … … 672 680 673 681 device_t *dev = hash_table_get_instance(lnk, device_t, link); 674 assert(dev-> phone >= 0);682 assert(dev->sess); 675 683 676 684 ipc_callid_t callid; … … 683 691 684 692 /* Make a request at the driver */ 693 async_exch_t *exch = async_exchange_begin(dev->sess); 694 685 695 ipc_call_t answer; 686 aid_t msg = async_send_3( dev->phone, IPC_GET_IMETHOD(*request),696 aid_t msg = async_send_3(exch, IPC_GET_IMETHOD(*request), 687 697 IPC_GET_ARG1(*request), IPC_GET_ARG2(*request), 688 698 IPC_GET_ARG3(*request), &answer); 689 699 690 700 /* Forward the IPC_M_DATA_WRITE request to the driver */ 691 async_forward_fast(callid, dev->phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 701 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 702 703 async_exchange_end(exch); 692 704 693 705 fibril_mutex_unlock(&devices_mutex); … … 742 754 743 755 device_t *dev = hash_table_get_instance(lnk, device_t, link); 744 assert(dev-> phone >= 0);756 assert(dev->sess); 745 757 dev->refcount--; 746 758 747 759 if (dev->refcount == 0) { 748 async_hangup(dev-> phone);760 async_hangup(dev->sess); 749 761 hash_table_remove(&devices, key, DEVICES_KEYS); 750 762 } … … 790 802 791 803 device_t *dev = hash_table_get_instance(lnk, device_t, link); 792 assert(dev-> phone >= 0);804 assert(dev->sess); 793 805 794 806 /* Make a request at the driver */ 807 async_exch_t *exch = async_exchange_begin(dev->sess); 808 795 809 ipc_call_t answer; 796 aid_t msg = async_send_2( dev->phone, IPC_GET_IMETHOD(*request),810 aid_t msg = async_send_2(exch, IPC_GET_IMETHOD(*request), 797 811 IPC_GET_ARG1(*request), IPC_GET_ARG2(*request), &answer); 812 813 async_exchange_end(exch); 798 814 799 815 fibril_mutex_unlock(&devices_mutex);
Note:
See TracChangeset
for help on using the changeset viewer.