Changes in / [e64df9a:4e6577c] in mainline
- Location:
- uspace
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/async.c
re64df9a r4e6577c 1656 1656 1657 1657 return sess; 1658 }1659 1660 /** Set arguments for new connections.1661 *1662 * FIXME This is an ugly hack to work around the problem that parallel1663 * exchanges are implemented using parallel connections. When we create1664 * a callback session, the framework does not know arguments for the new1665 * connections.1666 *1667 * The proper solution seems to be to implement parallel exchanges using1668 * tagging.1669 */1670 void async_sess_args_set(async_sess_t *sess, sysarg_t arg1, sysarg_t arg2,1671 sysarg_t arg3)1672 {1673 sess->arg1 = arg1;1674 sess->arg2 = arg2;1675 sess->arg3 = arg3;1676 1658 } 1677 1659 -
uspace/lib/c/generic/devman.c
re64df9a r4e6577c 89 89 if (devman_driver_block_sess == NULL) 90 90 devman_driver_block_sess = 91 service_connect_blocking(EXCHANGE_ PARALLEL,91 service_connect_blocking(EXCHANGE_SERIALIZE, 92 92 SERVICE_DEVMAN, DEVMAN_DRIVER, 0); 93 93 } … … 138 138 if (devman_driver_sess == NULL) 139 139 devman_driver_sess = 140 service_connect(EXCHANGE_ PARALLEL, SERVICE_DEVMAN,140 service_connect(EXCHANGE_SERIALIZE, SERVICE_DEVMAN, 141 141 DEVMAN_DRIVER, 0); 142 142 -
uspace/lib/c/generic/ns.c
re64df9a r4e6577c 56 56 async_exchange_end(exch); 57 57 58 /*59 * FIXME Ugly hack to work around limitation of implementing60 * parallel exchanges using multiple connections. Shift out61 * first argument for non-initial connections.62 */63 async_sess_args_set(sess, arg2, arg3, 0);64 65 58 return sess; 66 59 } … … 73 66 async_connect_me_to_blocking(mgmt, exch, service, arg2, arg3); 74 67 async_exchange_end(exch); 75 76 /*77 * FIXME Ugly hack to work around limitation of implementing78 * parallel exchanges using multiple connections. Shift out79 * first argument for non-initial connections.80 */81 async_sess_args_set(sess, arg2, arg3, 0);82 68 83 69 return sess; -
uspace/lib/c/include/async.h
re64df9a r4e6577c 337 337 338 338 /* 339 * FIXME These functions just work around problems with parallel exchange340 * management. Proper solution needs to be implemented.341 */342 void async_sess_args_set(async_sess_t *sess, sysarg_t, sysarg_t, sysarg_t);343 344 /*345 339 * User-friendly wrappers for async_share_in_start(). 346 340 */ -
uspace/srv/devman/devman.h
re64df9a r4e6577c 63 63 typedef struct fun_node fun_node_t; 64 64 65 typedef struct {66 fibril_mutex_t mutex;67 struct driver *driver;68 } client_t;69 70 65 typedef enum { 71 66 /** Driver has not been started. */ -
uspace/srv/devman/main.c
re64df9a r4e6577c 65 65 static dev_tree_t device_tree; 66 66 67 static int init_running_drv(void *drv);68 69 67 /** Register running driver. */ 70 static driver_t *devman_driver_register(ipc_callid_t callid, ipc_call_t *call) 71 { 68 static driver_t *devman_driver_register(void) 69 { 70 ipc_call_t icall; 71 ipc_callid_t iid; 72 72 driver_t *driver = NULL; 73 74 log_msg(LVL_DEBUG, "devman_driver_register"); 75 76 iid = async_get_call(&icall); 77 if (IPC_GET_IMETHOD(icall) != DEVMAN_DRIVER_REGISTER) { 78 async_answer_0(iid, EREFUSED); 79 return NULL; 80 } 81 73 82 char *drv_name = NULL; 74 75 log_msg(LVL_DEBUG, "devman_driver_register");76 83 77 84 /* Get driver name. */ 78 85 int rc = async_data_write_accept((void **) &drv_name, true, 0, 0, 0, 0); 79 86 if (rc != EOK) { 80 async_answer_0( callid, rc);87 async_answer_0(iid, rc); 81 88 return NULL; 82 89 } … … 91 98 free(drv_name); 92 99 drv_name = NULL; 93 async_answer_0( callid, ENOENT);100 async_answer_0(iid, ENOENT); 94 101 return NULL; 95 102 } … … 105 112 driver->name); 106 113 fibril_mutex_unlock(&driver->driver_mutex); 107 async_answer_0( callid, EEXISTS);114 async_answer_0(iid, EEXISTS); 108 115 return NULL; 109 116 } … … 127 134 log_msg(LVL_DEBUG, "Creating connection to the `%s' driver.", 128 135 driver->name); 129 driver->sess = async_callback_receive(EXCHANGE_ PARALLEL);136 driver->sess = async_callback_receive(EXCHANGE_SERIALIZE); 130 137 if (!driver->sess) { 131 138 fibril_mutex_unlock(&driver->driver_mutex); 132 async_answer_0( callid, ENOTSUP);139 async_answer_0(iid, ENOTSUP); 133 140 return NULL; 134 141 } 135 /* FIXME: Work around problem with callback sessions */136 async_sess_args_set(driver->sess, DRIVER_DEVMAN, 0, 0);142 143 fibril_mutex_unlock(&driver->driver_mutex); 137 144 138 145 log_msg(LVL_NOTE, … … 140 147 driver->name); 141 148 142 /* 143 * Initialize the driver as running (e.g. pass assigned devices to it) 144 * in a separate fibril; the separate fibril is used to enable the 145 * driver to use devman service during the driver's initialization. 146 */ 147 fid_t fid = fibril_create(init_running_drv, driver); 148 if (fid == 0) { 149 log_msg(LVL_ERROR, "Failed to create initialization fibril " \ 150 "for driver `%s'.", driver->name); 151 fibril_mutex_unlock(&driver->driver_mutex); 152 async_answer_0(callid, ENOMEM); 153 return NULL; 154 } 155 156 fibril_add_ready(fid); 157 fibril_mutex_unlock(&driver->driver_mutex); 158 159 async_answer_0(callid, EOK); 149 async_answer_0(iid, EOK); 150 160 151 return driver; 161 152 } … … 438 429 static void devman_connection_driver(ipc_callid_t iid, ipc_call_t *icall) 439 430 { 440 client_t *client;441 driver_t *driver;442 443 431 /* Accept the connection. */ 444 432 async_answer_0(iid, EOK); 445 433 446 client = async_get_client_data(); 447 if (client == NULL) { 448 log_msg(LVL_ERROR, "Failed to allocate client data."); 449 return; 450 } 434 driver_t *driver = devman_driver_register(); 435 if (driver == NULL) 436 return; 437 438 /* 439 * Initialize the driver as running (e.g. pass assigned devices to it) 440 * in a separate fibril; the separate fibril is used to enable the 441 * driver to use devman service during the driver's initialization. 442 */ 443 fid_t fid = fibril_create(init_running_drv, driver); 444 if (fid == 0) { 445 log_msg(LVL_ERROR, "Failed to create initialization fibril " \ 446 "for driver `%s'.", driver->name); 447 return; 448 } 449 fibril_add_ready(fid); 451 450 452 451 while (true) { … … 457 456 break; 458 457 459 if (IPC_GET_IMETHOD(call) != DEVMAN_DRIVER_REGISTER) {460 fibril_mutex_lock(&client->mutex);461 driver = client->driver;462 fibril_mutex_unlock(&client->mutex);463 if (driver == NULL) {464 /* First call must be to DEVMAN_DRIVER_REGISTER */465 async_answer_0(callid, ENOTSUP);466 continue;467 }468 }469 470 458 switch (IPC_GET_IMETHOD(call)) { 471 case DEVMAN_DRIVER_REGISTER:472 fibril_mutex_lock(&client->mutex);473 if (client->driver != NULL) {474 fibril_mutex_unlock(&client->mutex);475 async_answer_0(callid, EINVAL);476 continue;477 }478 client->driver = devman_driver_register(callid, &call);479 fibril_mutex_unlock(&client->mutex);480 break;481 459 case DEVMAN_ADD_FUNCTION: 482 460 devman_add_function(callid, &call); … … 836 814 static void devman_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 837 815 { 838 /* Select port. */816 /* Select interface. */ 839 817 switch ((sysarg_t) (IPC_GET_ARG1(*icall))) { 840 818 case DEVMAN_DRIVER: … … 862 840 } 863 841 864 static void *devman_client_data_create(void)865 {866 client_t *client;867 868 client = calloc(1, sizeof(client_t));869 if (client == NULL)870 return NULL;871 872 fibril_mutex_initialize(&client->mutex);873 return client;874 }875 876 static void devman_client_data_destroy(void *data)877 {878 free(data);879 }880 881 842 /** Initialize device manager internal structures. */ 882 843 static bool devman_init(void) … … 925 886 } 926 887 927 /* Set handlers for incoming connections. */ 928 async_set_client_data_constructor(devman_client_data_create); 929 async_set_client_data_destructor(devman_client_data_destroy); 888 /* Set a handler of incomming connections. */ 930 889 async_set_client_connection(devman_connection); 931 890
Note:
See TracChangeset
for help on using the changeset viewer.