Changes in / [bf75e3cb:a0ce870] in mainline
- Files:
-
- 36 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/ipc/ipc.h
rbf75e3cb ra0ce870 165 165 * error is sent back to caller. Otherwise 166 166 * the call is accepted and the response is sent back. 167 * - the hash of the client task is passed to userspace 168 * (on the receiving side) as ARG4 of the call. 169 * - the hash of the allocated phone is passed to userspace 167 * - the allocated phoneid is passed to userspace 170 168 * (on the receiving side) as ARG5 of the call. 171 169 * … … 321 319 typedef struct { 322 320 sysarg_t args[IPC_CALL_LEN]; 323 /** Task which made or forwarded the call with IPC_FF_ROUTE_FROM_ME. */324 struct task *task;325 /** Phone which made or last masqueraded this call. */326 321 phone_t *phone; 327 322 } ipc_data_t; -
kernel/generic/src/ipc/ipc.c
rbf75e3cb ra0ce870 295 295 atomic_inc(&phone->active_calls); 296 296 call->data.phone = phone; 297 call->data.task = TASK;298 297 } 299 298 … … 407 406 call->caller_phone = call->data.phone; 408 407 call->data.phone = newphone; 409 call->data.task = TASK;410 408 } 411 409 -
kernel/generic/src/ipc/sysipc.c
rbf75e3cb ra0ce870 248 248 /* The connection was accepted */ 249 249 phone_connect(phoneid, &answer->sender->answerbox); 250 /* Set 'task hash' as arg4 of response */251 IPC_SET_ARG4(answer->data, (sysarg_t) TASK);252 250 /* Set 'phone hash' as arg5 of response */ 253 251 IPC_SET_ARG5(answer->data, -
uspace/lib/c/generic/async.c
rbf75e3cb ra0ce870 134 134 135 135 typedef struct { 136 sysarg_t in_task_hash;137 link_t link;138 int refcnt;139 void *data;140 } client_t;141 142 typedef struct {143 136 awaiter_t wdata; 144 137 … … 146 139 link_t link; 147 140 148 /** Incoming client task hash. */149 sysarg_t in_task_hash;150 141 /** Incoming phone hash. */ 151 142 sysarg_t in_phone_hash; 152 143 153 /** Link to the client tracking structure. */154 client_t *client;155 156 144 /** Messages that should be delivered to this fibril. */ 157 145 link_t msg_queue; … … 172 160 fibril_local connection_t *FIBRIL_connection; 173 161 174 static void *default_client_data_constructor(void)175 {176 return NULL;177 }178 179 static void default_client_data_destructor(void *data)180 {181 }182 183 static async_client_data_ctor_t async_client_data_create =184 default_client_data_constructor;185 static async_client_data_dtor_t async_client_data_destroy =186 default_client_data_destructor;187 188 void async_set_client_data_constructor(async_client_data_ctor_t ctor)189 {190 async_client_data_create = ctor;191 }192 193 void async_set_client_data_destructor(async_client_data_dtor_t dtor)194 {195 async_client_data_destroy = dtor;196 }197 198 void *async_client_data_get(void)199 {200 assert(FIBRIL_connection);201 202 return FIBRIL_connection->client->data;203 }204 205 162 static void default_client_connection(ipc_callid_t callid, ipc_call_t *call); 206 163 static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call); … … 217 174 static async_client_conn_t interrupt_received = default_interrupt_received; 218 175 219 static hash_table_t client_hash_table;220 176 static hash_table_t conn_hash_table; 221 177 static LIST_INITIALIZE(timeout_list); 222 178 223 #define CLIENT_HASH_TABLE_BUCKETS 32 224 #define CONN_HASH_TABLE_BUCKETS 32 225 226 static hash_index_t client_hash(unsigned long *key) 179 #define CONN_HASH_TABLE_CHAINS 32 180 181 /** Compute hash into the connection hash table based on the source phone hash. 182 * 183 * @param key Pointer to source phone hash. 184 * 185 * @return Index into the connection hash table. 186 * 187 */ 188 static hash_index_t conn_hash(unsigned long *key) 227 189 { 228 190 assert(key); 229 return (((*key) >> 4) % CLIENT_HASH_TABLE_BUCKETS); 230 } 231 232 static int client_compare(unsigned long key[], hash_count_t keys, link_t *item) 233 { 234 client_t *cl = hash_table_get_instance(item, client_t, link); 235 return (key[0] == cl->in_task_hash); 236 } 237 238 static void client_remove(link_t *item) 239 { 240 } 241 242 /** Operations for the client hash table. */ 243 static hash_table_operations_t client_hash_table_ops = { 244 .hash = client_hash, 245 .compare = client_compare, 246 .remove_callback = client_remove 247 }; 248 249 /** Compute hash into the connection hash table based on the source phone hash. 250 * 251 * @param key Pointer to source phone hash. 252 * 253 * @return Index into the connection hash table. 254 * 255 */ 256 static hash_index_t conn_hash(unsigned long *key) 257 { 258 assert(key); 259 return (((*key) >> 4) % CONN_HASH_TABLE_BUCKETS); 191 return (((*key) >> 4) % CONN_HASH_TABLE_CHAINS); 260 192 } 261 193 … … 548 480 static int connection_fibril(void *arg) 549 481 { 550 unsigned long key;551 client_t *cl;552 link_t *lnk;553 bool destroy = false;554 555 482 /* 556 * Setup fibril-local connection pointer. 483 * Setup fibril-local connection pointer and call client_connection(). 484 * 557 485 */ 558 486 FIBRIL_connection = (connection_t *) arg; 559 560 /*561 * Add our reference for the current connection in the client task562 * tracking structure. If this is the first reference, create and563 * hash in a new tracking structure.564 */565 futex_down(&async_futex);566 key = FIBRIL_connection->in_task_hash;567 lnk = hash_table_find(&client_hash_table, &key);568 if (lnk) {569 cl = hash_table_get_instance(lnk, client_t, link);570 cl->refcnt++;571 } else {572 cl = malloc(sizeof(client_t));573 if (!cl) {574 ipc_answer_0(FIBRIL_connection->callid, ENOMEM);575 futex_up(&async_futex);576 return 0;577 }578 cl->in_task_hash = FIBRIL_connection->in_task_hash;579 async_serialize_start();580 cl->data = async_client_data_create();581 async_serialize_end();582 cl->refcnt = 1;583 hash_table_insert(&client_hash_table, &key, &cl->link);584 }585 futex_up(&async_futex);586 587 FIBRIL_connection->client = cl;588 589 /*590 * Call the connection handler function.591 */592 487 FIBRIL_connection->cfibril(FIBRIL_connection->callid, 593 488 &FIBRIL_connection->call); 594 489 595 /* 596 * Remove the reference for this client task connection. 597 */ 490 /* Remove myself from the connection hash table */ 598 491 futex_down(&async_futex); 599 if (--cl->refcnt == 0) { 600 hash_table_remove(&client_hash_table, &key, 1); 601 destroy = true; 602 } 603 futex_up(&async_futex); 604 605 if (destroy) { 606 if (cl->data) 607 async_client_data_destroy(cl->data); 608 free(cl); 609 } 610 611 /* 612 * Remove myself from the connection hash table. 613 */ 614 futex_down(&async_futex); 615 key = FIBRIL_connection->in_phone_hash; 492 unsigned long key = FIBRIL_connection->in_phone_hash; 616 493 hash_table_remove(&conn_hash_table, &key, 1); 617 494 futex_up(&async_futex); 618 495 619 /* 620 * Answer all remaining messages with EHANGUP. 621 */ 496 /* Answer all remaining messages with EHANGUP */ 622 497 while (!list_empty(&FIBRIL_connection->msg_queue)) { 623 498 msg_t *msg; … … 630 505 } 631 506 632 /*633 * If the connection was hung-up, answer the last call,634 * i.e. IPC_M_PHONE_HUNGUP.635 */636 507 if (FIBRIL_connection->close_callid) 637 508 ipc_answer_0(FIBRIL_connection->close_callid, EOK); … … 646 517 * particular fibrils. 647 518 * 648 * @param in_task_hash Identification of the incoming connection.649 519 * @param in_phone_hash Identification of the incoming connection. 650 520 * @param callid Hash of the opening IPC_M_CONNECT_ME_TO call. … … 659 529 * 660 530 */ 661 fid_t async_new_connection(sysarg_t in_task_hash, sysarg_t in_phone_hash, 662 ipc_callid_t callid, ipc_call_t *call, 663 void (*cfibril)(ipc_callid_t, ipc_call_t *)) 531 fid_t async_new_connection(sysarg_t in_phone_hash, ipc_callid_t callid, 532 ipc_call_t *call, void (*cfibril)(ipc_callid_t, ipc_call_t *)) 664 533 { 665 534 connection_t *conn = malloc(sizeof(*conn)); … … 670 539 } 671 540 672 conn->in_task_hash = in_task_hash;673 541 conn->in_phone_hash = in_phone_hash; 674 542 list_initialize(&conn->msg_queue); … … 724 592 case IPC_M_CONNECT_ME_TO: 725 593 /* Open new connection with fibril etc. */ 726 async_new_connection( call->in_task_hash, IPC_GET_ARG5(*call),727 c allid, call, client_connection);594 async_new_connection(IPC_GET_ARG5(*call), callid, call, 595 client_connection); 728 596 goto out; 729 597 } … … 876 744 int __async_init(void) 877 745 { 878 if (!hash_table_create(&c lient_hash_table, CLIENT_HASH_TABLE_BUCKETS, 1,879 &c lient_hash_table_ops) || !hash_table_create(&conn_hash_table,880 CONN_HASH_TABLE_BUCKETS, 1, &conn_hash_table_ops)) {746 if (!hash_table_create(&conn_hash_table, CONN_HASH_TABLE_CHAINS, 1, 747 &conn_hash_table_ops)) { 748 printf("%s: Cannot create async hash table\n", "libc"); 881 749 return ENOMEM; 882 750 } -
uspace/lib/c/generic/devman.c
rbf75e3cb ra0ce870 116 116 async_set_client_connection(conn); 117 117 118 ipc_connect_to_me(phone, 0, 0, 0, NULL, NULL); 118 sysarg_t callback_phonehash; 119 ipc_connect_to_me(phone, 0, 0, 0, &callback_phonehash); 119 120 async_wait_for(req, &retval); 120 121 -
uspace/lib/c/generic/devmap.c
rbf75e3cb ra0ce870 116 116 async_set_client_connection(conn); 117 117 118 ipc_connect_to_me(phone, 0, 0, 0, NULL, NULL); 118 sysarg_t callback_phonehash; 119 ipc_connect_to_me(phone, 0, 0, 0, &callback_phonehash); 119 120 async_wait_for(req, &retval); 120 121 -
uspace/lib/c/generic/ipc.c
rbf75e3cb ra0ce870 578 578 * @param arg2 Service-defined argument. 579 579 * @param arg3 Service-defined argument. 580 * @param taskhash Storage where the kernel will store an opaque 581 * identifier of the client task. 582 * @param phonehash Storage where the kernel will store an opaque 580 * @param phonehash Storage where the library will store an opaque 583 581 * identifier of the phone that will be used for incoming 584 582 * calls. This identifier can be used for connection … … 588 586 */ 589 587 int ipc_connect_to_me(int phoneid, int arg1, int arg2, int arg3, 590 sysarg_t * taskhash, sysarg_t *phonehash)588 sysarg_t *phonehash) 591 589 { 592 590 return ipc_call_sync_3_5(phoneid, IPC_M_CONNECT_TO_ME, arg1, arg2, 593 arg3, NULL, NULL, NULL, taskhash, phonehash);591 arg3, NULL, NULL, NULL, NULL, phonehash); 594 592 } 595 593 -
uspace/lib/c/generic/net/modules.c
rbf75e3cb ra0ce870 143 143 if (phone >= 0) { 144 144 /* Request the bidirectional connection */ 145 sysarg_t taskhash;146 145 sysarg_t phonehash; 147 146 148 rc = ipc_connect_to_me(phone, arg1, arg2, arg3, &taskhash, 149 &phonehash); 147 rc = ipc_connect_to_me(phone, arg1, arg2, arg3, &phonehash); 150 148 if (rc != EOK) { 151 149 ipc_hangup(phone); 152 150 return rc; 153 151 } 154 async_new_connection(taskhash, phonehash, 0, NULL, 155 client_receiver); 152 async_new_connection(phonehash, 0, NULL, client_receiver); 156 153 } 157 154 -
uspace/lib/c/generic/vfs/vfs.c
rbf75e3cb ra0ce870 46 46 #include <ipc/services.h> 47 47 #include <async.h> 48 #include <fibril_synch.h> 48 #include <atomic.h> 49 #include <futex.h> 49 50 #include <errno.h> 50 #include <assert.h>51 51 #include <str.h> 52 52 #include <devmap.h> … … 54 54 #include <ipc/devmap.h> 55 55 56 static async_sess_t vfs_session;57 58 static FIBRIL_MUTEX_INITIALIZE(vfs_phone_mutex);59 56 static int vfs_phone = -1; 60 61 static FIBRIL_MUTEX_INITIALIZE(cwd_mutex);57 static futex_t vfs_phone_futex = FUTEX_INITIALIZER; 58 static futex_t cwd_futex = FUTEX_INITIALIZER; 62 59 63 60 static int cwd_fd = -1; … … 70 67 char *ncwd_path_nc; 71 68 72 f ibril_mutex_lock(&cwd_mutex);69 futex_down(&cwd_futex); 73 70 size_t size = str_size(path); 74 71 if (*path != '/') { 75 72 if (!cwd_path) { 76 f ibril_mutex_unlock(&cwd_mutex);73 futex_up(&cwd_futex); 77 74 return NULL; 78 75 } 79 76 ncwd_path_nc = malloc(cwd_size + 1 + size + 1); 80 77 if (!ncwd_path_nc) { 81 f ibril_mutex_unlock(&cwd_mutex);78 futex_up(&cwd_futex); 82 79 return NULL; 83 80 } … … 88 85 ncwd_path_nc = malloc(size + 1); 89 86 if (!ncwd_path_nc) { 90 f ibril_mutex_unlock(&cwd_mutex);87 futex_up(&cwd_futex); 91 88 return NULL; 92 89 } … … 96 93 ncwd_path = canonify(ncwd_path_nc, retlen); 97 94 if (!ncwd_path) { 98 f ibril_mutex_unlock(&cwd_mutex);95 futex_up(&cwd_futex); 99 96 free(ncwd_path_nc); 100 97 return NULL; … … 108 105 free(ncwd_path_nc); 109 106 if (!ncwd_path) { 110 f ibril_mutex_unlock(&cwd_mutex);107 futex_up(&cwd_futex); 111 108 return NULL; 112 109 } 113 f ibril_mutex_unlock(&cwd_mutex);110 futex_up(&cwd_futex); 114 111 return ncwd_path; 115 112 } 116 113 117 /** Connect to VFS service and create session. */118 114 static void vfs_connect(void) 119 115 { 120 while (vfs_phone < 0) { 121 vfs_phone = async_connect_me_to_blocking(PHONE_NS, SERVICE_VFS, 122 0, 0); 123 } 124 125 async_session_create(&vfs_session, vfs_phone, 0); 126 } 127 128 /** Start an async exchange on the VFS session. 129 * 130 * @return New phone to be used during the exchange. 131 */ 132 static int vfs_exchange_begin(void) 133 { 134 fibril_mutex_lock(&vfs_phone_mutex); 135 if (vfs_phone < 0) 136 vfs_connect(); 137 fibril_mutex_unlock(&vfs_phone_mutex); 138 139 return async_exchange_begin(&vfs_session); 140 } 141 142 /** End an async exchange on the VFS session. 143 * 144 * @param phone Phone used during the exchange. 145 */ 146 static void vfs_exchange_end(int phone) 147 { 148 async_exchange_end(&vfs_session, phone); 116 while (vfs_phone < 0) 117 vfs_phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_VFS, 0, 0); 149 118 } 150 119 … … 185 154 } 186 155 187 int vfs_phone = vfs_exchange_begin(); 188 156 futex_down(&vfs_phone_futex); 157 async_serialize_start(); 158 vfs_connect(); 159 189 160 sysarg_t rc_orig; 190 161 aid_t req = async_send_2(vfs_phone, VFS_IN_MOUNT, devmap_handle, flags, NULL); 191 162 sysarg_t rc = async_data_write_start(vfs_phone, (void *) mpa, mpa_size); 192 163 if (rc != EOK) { 193 vfs_exchange_end(vfs_phone); 164 async_wait_for(req, &rc_orig); 165 async_serialize_end(); 166 futex_up(&vfs_phone_futex); 194 167 free(mpa); 195 async_wait_for(req, &rc_orig);196 168 197 169 if (null_id != -1) … … 206 178 rc = async_data_write_start(vfs_phone, (void *) opts, str_size(opts)); 207 179 if (rc != EOK) { 208 vfs_exchange_end(vfs_phone); 180 async_wait_for(req, &rc_orig); 181 async_serialize_end(); 182 futex_up(&vfs_phone_futex); 209 183 free(mpa); 210 async_wait_for(req, &rc_orig);211 184 212 185 if (null_id != -1) … … 221 194 rc = async_data_write_start(vfs_phone, (void *) fs_name, str_size(fs_name)); 222 195 if (rc != EOK) { 223 vfs_exchange_end(vfs_phone); 196 async_wait_for(req, &rc_orig); 197 async_serialize_end(); 198 futex_up(&vfs_phone_futex); 224 199 free(mpa); 225 async_wait_for(req, &rc_orig);226 200 227 201 if (null_id != -1) … … 237 211 rc = async_req_0_0(vfs_phone, IPC_M_PING); 238 212 if (rc != EOK) { 239 vfs_exchange_end(vfs_phone); 213 async_wait_for(req, &rc_orig); 214 async_serialize_end(); 215 futex_up(&vfs_phone_futex); 240 216 free(mpa); 241 async_wait_for(req, &rc_orig);242 217 243 218 if (null_id != -1) … … 250 225 } 251 226 252 vfs_exchange_end(vfs_phone); 227 async_wait_for(req, &rc); 228 async_serialize_end(); 229 futex_up(&vfs_phone_futex); 253 230 free(mpa); 254 async_wait_for(req, &rc);255 231 256 232 if ((rc != EOK) && (null_id != -1)) … … 272 248 return ENOMEM; 273 249 274 int vfs_phone = vfs_exchange_begin(); 250 futex_down(&vfs_phone_futex); 251 async_serialize_start(); 252 vfs_connect(); 275 253 276 254 req = async_send_0(vfs_phone, VFS_IN_UNMOUNT, NULL); 277 255 rc = async_data_write_start(vfs_phone, (void *) mpa, mpa_size); 278 256 if (rc != EOK) { 279 vfs_exchange_end(vfs_phone); 257 async_wait_for(req, &rc_orig); 258 async_serialize_end(); 259 futex_up(&vfs_phone_futex); 280 260 free(mpa); 281 async_wait_for(req, &rc_orig); 282 if (rc_orig == EOK) 283 return (int) rc; 284 else 285 return (int) rc_orig; 286 } 287 288 289 vfs_exchange_end(vfs_phone); 261 if (rc_orig == EOK) 262 return (int) rc; 263 else 264 return (int) rc_orig; 265 } 266 267 268 async_wait_for(req, &rc); 269 async_serialize_end(); 270 futex_up(&vfs_phone_futex); 290 271 free(mpa); 291 async_wait_for(req, &rc);292 272 293 273 return (int) rc; … … 296 276 static int open_internal(const char *abs, size_t abs_size, int lflag, int oflag) 297 277 { 298 int vfs_phone = vfs_exchange_begin(); 278 futex_down(&vfs_phone_futex); 279 async_serialize_start(); 280 vfs_connect(); 299 281 300 282 ipc_call_t answer; … … 303 285 304 286 if (rc != EOK) { 305 vfs_exchange_end(vfs_phone);306 307 287 sysarg_t rc_orig; 308 288 async_wait_for(req, &rc_orig); 309 289 310 if (rc_orig == EOK) 311 return (int) rc; 312 else 313 return (int) rc_orig; 314 } 315 316 vfs_exchange_end(vfs_phone); 317 async_wait_for(req, &rc); 290 async_serialize_end(); 291 futex_up(&vfs_phone_futex); 292 293 if (rc_orig == EOK) 294 return (int) rc; 295 else 296 return (int) rc_orig; 297 } 298 299 async_wait_for(req, &rc); 300 async_serialize_end(); 301 futex_up(&vfs_phone_futex); 318 302 319 303 if (rc != EOK) … … 338 322 int open_node(fdi_node_t *node, int oflag) 339 323 { 340 int vfs_phone = vfs_exchange_begin(); 324 futex_down(&vfs_phone_futex); 325 async_serialize_start(); 326 vfs_connect(); 341 327 342 328 ipc_call_t answer; … … 344 330 node->devmap_handle, node->index, oflag, &answer); 345 331 346 vfs_exchange_end(vfs_phone);347 348 sysarg_t rc;349 async_wait_for(req, &rc);332 sysarg_t rc; 333 async_wait_for(req, &rc); 334 async_serialize_end(); 335 futex_up(&vfs_phone_futex); 350 336 351 337 if (rc != EOK) … … 359 345 sysarg_t rc; 360 346 361 int vfs_phone = vfs_exchange_begin(); 347 futex_down(&vfs_phone_futex); 348 async_serialize_start(); 349 vfs_connect(); 362 350 363 351 rc = async_req_1_0(vfs_phone, VFS_IN_CLOSE, fildes); 364 352 365 vfs_exchange_end(vfs_phone); 353 async_serialize_end(); 354 futex_up(&vfs_phone_futex); 366 355 367 356 return (int)rc; … … 374 363 aid_t req; 375 364 376 int vfs_phone = vfs_exchange_begin(); 365 futex_down(&vfs_phone_futex); 366 async_serialize_start(); 367 vfs_connect(); 377 368 378 369 req = async_send_1(vfs_phone, VFS_IN_READ, fildes, &answer); 379 370 rc = async_data_read_start(vfs_phone, (void *)buf, nbyte); 380 371 if (rc != EOK) { 381 vfs_exchange_end(vfs_phone);382 383 372 sysarg_t rc_orig; 384 async_wait_for(req, &rc_orig); 385 373 374 async_wait_for(req, &rc_orig); 375 async_serialize_end(); 376 futex_up(&vfs_phone_futex); 386 377 if (rc_orig == EOK) 387 378 return (ssize_t) rc; … … 389 380 return (ssize_t) rc_orig; 390 381 } 391 vfs_exchange_end(vfs_phone); 392 async_wait_for(req, &rc); 382 async_wait_for(req, &rc); 383 async_serialize_end(); 384 futex_up(&vfs_phone_futex); 393 385 if (rc == EOK) 394 386 return (ssize_t) IPC_GET_ARG1(answer); … … 403 395 aid_t req; 404 396 405 int vfs_phone = vfs_exchange_begin(); 397 futex_down(&vfs_phone_futex); 398 async_serialize_start(); 399 vfs_connect(); 406 400 407 401 req = async_send_1(vfs_phone, VFS_IN_WRITE, fildes, &answer); 408 402 rc = async_data_write_start(vfs_phone, (void *)buf, nbyte); 409 403 if (rc != EOK) { 410 vfs_exchange_end(vfs_phone);411 412 404 sysarg_t rc_orig; 413 async_wait_for(req, &rc_orig); 414 405 406 async_wait_for(req, &rc_orig); 407 async_serialize_end(); 408 futex_up(&vfs_phone_futex); 415 409 if (rc_orig == EOK) 416 410 return (ssize_t) rc; … … 418 412 return (ssize_t) rc_orig; 419 413 } 420 vfs_exchange_end(vfs_phone); 421 async_wait_for(req, &rc); 414 async_wait_for(req, &rc); 415 async_serialize_end(); 416 futex_up(&vfs_phone_futex); 422 417 if (rc == EOK) 423 418 return (ssize_t) IPC_GET_ARG1(answer); … … 428 423 int fsync(int fildes) 429 424 { 430 int vfs_phone = vfs_exchange_begin(); 425 futex_down(&vfs_phone_futex); 426 async_serialize_start(); 427 vfs_connect(); 431 428 432 429 sysarg_t rc = async_req_1_0(vfs_phone, VFS_IN_SYNC, fildes); 433 430 434 vfs_exchange_end(vfs_phone); 431 async_serialize_end(); 432 futex_up(&vfs_phone_futex); 435 433 436 434 return (int) rc; … … 439 437 off64_t lseek(int fildes, off64_t offset, int whence) 440 438 { 441 int vfs_phone = vfs_exchange_begin(); 439 futex_down(&vfs_phone_futex); 440 async_serialize_start(); 441 vfs_connect(); 442 442 443 443 sysarg_t newoff_lo; … … 447 447 &newoff_lo, &newoff_hi); 448 448 449 vfs_exchange_end(vfs_phone); 449 async_serialize_end(); 450 futex_up(&vfs_phone_futex); 450 451 451 452 if (rc != EOK) … … 459 460 sysarg_t rc; 460 461 461 int vfs_phone = vfs_exchange_begin(); 462 futex_down(&vfs_phone_futex); 463 async_serialize_start(); 464 vfs_connect(); 462 465 463 466 rc = async_req_3_0(vfs_phone, VFS_IN_TRUNCATE, fildes, 464 467 LOWER32(length), UPPER32(length)); 465 vfs_exchange_end(vfs_phone); 468 async_serialize_end(); 469 futex_up(&vfs_phone_futex); 466 470 467 471 return (int) rc; … … 473 477 aid_t req; 474 478 475 int vfs_phone = vfs_exchange_begin(); 479 futex_down(&vfs_phone_futex); 480 async_serialize_start(); 481 vfs_connect(); 476 482 477 483 req = async_send_1(vfs_phone, VFS_IN_FSTAT, fildes, NULL); 478 484 rc = async_data_read_start(vfs_phone, (void *) stat, sizeof(struct stat)); 479 485 if (rc != EOK) { 480 vfs_exchange_end(vfs_phone);481 482 486 sysarg_t rc_orig; 483 async_wait_for(req, &rc_orig); 484 487 488 async_wait_for(req, &rc_orig); 489 async_serialize_end(); 490 futex_up(&vfs_phone_futex); 485 491 if (rc_orig == EOK) 486 492 return (ssize_t) rc; … … 488 494 return (ssize_t) rc_orig; 489 495 } 490 vfs_exchange_end(vfs_phone); 491 async_wait_for(req, &rc); 496 async_wait_for(req, &rc); 497 async_serialize_end(); 498 futex_up(&vfs_phone_futex); 492 499 493 500 return rc; … … 505 512 return ENOMEM; 506 513 507 int vfs_phone = vfs_exchange_begin(); 514 futex_down(&vfs_phone_futex); 515 async_serialize_start(); 516 vfs_connect(); 508 517 509 518 req = async_send_0(vfs_phone, VFS_IN_STAT, NULL); 510 519 rc = async_data_write_start(vfs_phone, pa, pa_size); 511 520 if (rc != EOK) { 512 vfs_exchange_end(vfs_phone); 521 async_wait_for(req, &rc_orig); 522 async_serialize_end(); 523 futex_up(&vfs_phone_futex); 513 524 free(pa); 514 async_wait_for(req, &rc_orig);515 525 if (rc_orig == EOK) 516 526 return (int) rc; … … 520 530 rc = async_data_read_start(vfs_phone, stat, sizeof(struct stat)); 521 531 if (rc != EOK) { 522 vfs_exchange_end(vfs_phone); 532 async_wait_for(req, &rc_orig); 533 async_serialize_end(); 534 futex_up(&vfs_phone_futex); 523 535 free(pa); 524 async_wait_for(req, &rc_orig); 525 if (rc_orig == EOK) 526 return (int) rc; 527 else 528 return (int) rc_orig; 529 } 530 vfs_exchange_end(vfs_phone); 536 if (rc_orig == EOK) 537 return (int) rc; 538 else 539 return (int) rc_orig; 540 } 541 async_wait_for(req, &rc); 542 async_serialize_end(); 543 futex_up(&vfs_phone_futex); 531 544 free(pa); 532 async_wait_for(req, &rc);533 545 return rc; 534 546 } … … 589 601 return ENOMEM; 590 602 591 int vfs_phone = vfs_exchange_begin(); 603 futex_down(&vfs_phone_futex); 604 async_serialize_start(); 605 vfs_connect(); 592 606 593 607 req = async_send_1(vfs_phone, VFS_IN_MKDIR, mode, NULL); 594 608 rc = async_data_write_start(vfs_phone, pa, pa_size); 595 609 if (rc != EOK) { 596 vfs_exchange_end(vfs_phone); 610 sysarg_t rc_orig; 611 612 async_wait_for(req, &rc_orig); 613 async_serialize_end(); 614 futex_up(&vfs_phone_futex); 597 615 free(pa); 598 599 sysarg_t rc_orig; 600 async_wait_for(req, &rc_orig); 601 602 if (rc_orig == EOK) 603 return (int) rc; 604 else 605 return (int) rc_orig; 606 } 607 vfs_exchange_end(vfs_phone); 616 if (rc_orig == EOK) 617 return (int) rc; 618 else 619 return (int) rc_orig; 620 } 621 async_wait_for(req, &rc); 622 async_serialize_end(); 623 futex_up(&vfs_phone_futex); 608 624 free(pa); 609 async_wait_for(req, &rc);610 625 return rc; 611 626 } … … 621 636 return ENOMEM; 622 637 623 int vfs_phone = vfs_exchange_begin(); 638 futex_down(&vfs_phone_futex); 639 async_serialize_start(); 640 vfs_connect(); 624 641 625 642 req = async_send_0(vfs_phone, VFS_IN_UNLINK, NULL); 626 643 rc = async_data_write_start(vfs_phone, pa, pa_size); 627 644 if (rc != EOK) { 628 vfs_exchange_end(vfs_phone); 645 sysarg_t rc_orig; 646 647 async_wait_for(req, &rc_orig); 648 async_serialize_end(); 649 futex_up(&vfs_phone_futex); 629 650 free(pa); 630 631 sysarg_t rc_orig; 632 async_wait_for(req, &rc_orig); 633 634 if (rc_orig == EOK) 635 return (int) rc; 636 else 637 return (int) rc_orig; 638 } 639 vfs_exchange_end(vfs_phone); 651 if (rc_orig == EOK) 652 return (int) rc; 653 else 654 return (int) rc_orig; 655 } 656 async_wait_for(req, &rc); 657 async_serialize_end(); 658 futex_up(&vfs_phone_futex); 640 659 free(pa); 641 async_wait_for(req, &rc);642 660 return rc; 643 661 } … … 671 689 } 672 690 673 int vfs_phone = vfs_exchange_begin(); 691 futex_down(&vfs_phone_futex); 692 async_serialize_start(); 693 vfs_connect(); 674 694 675 695 req = async_send_0(vfs_phone, VFS_IN_RENAME, NULL); 676 696 rc = async_data_write_start(vfs_phone, olda, olda_size); 677 697 if (rc != EOK) { 678 vfs_exchange_end(vfs_phone); 698 async_wait_for(req, &rc_orig); 699 async_serialize_end(); 700 futex_up(&vfs_phone_futex); 679 701 free(olda); 680 702 free(newa); 681 async_wait_for(req, &rc_orig);682 703 if (rc_orig == EOK) 683 704 return (int) rc; … … 687 708 rc = async_data_write_start(vfs_phone, newa, newa_size); 688 709 if (rc != EOK) { 689 vfs_exchange_end(vfs_phone); 710 async_wait_for(req, &rc_orig); 711 async_serialize_end(); 712 futex_up(&vfs_phone_futex); 690 713 free(olda); 691 714 free(newa); 692 async_wait_for(req, &rc_orig); 693 if (rc_orig == EOK) 694 return (int) rc; 695 else 696 return (int) rc_orig; 697 } 698 vfs_exchange_end(vfs_phone); 715 if (rc_orig == EOK) 716 return (int) rc; 717 else 718 return (int) rc_orig; 719 } 720 async_wait_for(req, &rc); 721 async_serialize_end(); 722 futex_up(&vfs_phone_futex); 699 723 free(olda); 700 724 free(newa); 701 async_wait_for(req, &rc);702 725 return rc; 703 726 } … … 717 740 } 718 741 719 f ibril_mutex_lock(&cwd_mutex);742 futex_down(&cwd_futex); 720 743 721 744 if (cwd_fd >= 0) … … 730 753 cwd_size = abs_size; 731 754 732 f ibril_mutex_unlock(&cwd_mutex);755 futex_up(&cwd_futex); 733 756 return EOK; 734 757 } … … 739 762 return NULL; 740 763 741 f ibril_mutex_lock(&cwd_mutex);764 futex_down(&cwd_futex); 742 765 743 766 if ((cwd_size == 0) || (size < cwd_size + 1)) { 744 f ibril_mutex_unlock(&cwd_mutex);767 futex_up(&cwd_futex); 745 768 return NULL; 746 769 } 747 770 748 771 str_cpy(buf, size, cwd_path); 749 f ibril_mutex_unlock(&cwd_mutex);772 futex_up(&cwd_futex); 750 773 751 774 return buf; … … 783 806 int dup2(int oldfd, int newfd) 784 807 { 785 int vfs_phone = vfs_exchange_begin(); 808 futex_down(&vfs_phone_futex); 809 async_serialize_start(); 810 vfs_connect(); 786 811 787 812 sysarg_t ret; 788 813 sysarg_t rc = async_req_2_1(vfs_phone, VFS_IN_DUP, oldfd, newfd, &ret); 789 814 790 vfs_exchange_end(vfs_phone); 815 async_serialize_end(); 816 futex_up(&vfs_phone_futex); 791 817 792 818 if (rc == EOK) -
uspace/lib/c/include/async.h
rbf75e3cb ra0ce870 44 44 45 45 typedef ipc_callid_t aid_t; 46 47 typedef void *(*async_client_data_ctor_t)(void); 48 typedef void (*async_client_data_dtor_t)(void *); 49 50 typedef void (*async_client_conn_t)(ipc_callid_t, ipc_call_t *); 46 typedef void (*async_client_conn_t)(ipc_callid_t callid, ipc_call_t *call); 51 47 52 48 extern atomic_t async_futex; … … 55 51 56 52 extern int __async_init(void); 57 extern ipc_callid_t async_get_call_timeout(ipc_call_t * , suseconds_t);53 extern ipc_callid_t async_get_call_timeout(ipc_call_t *call, suseconds_t usecs); 58 54 59 55 static inline ipc_callid_t async_get_call(ipc_call_t *data) … … 89 85 (arg5), (dataptr)) 90 86 91 extern aid_t async_send_fast(int, sysarg_t, sysarg_t, sysarg_t, sysarg_t, 92 sysarg_t, ipc_call_t *); 93 extern aid_t async_send_slow(int, sysarg_t, sysarg_t, sysarg_t, sysarg_t, 94 sysarg_t, sysarg_t, ipc_call_t *); 95 extern void async_wait_for(aid_t, sysarg_t *); 96 extern int async_wait_timeout(aid_t, sysarg_t *, suseconds_t); 97 98 extern fid_t async_new_connection(sysarg_t, sysarg_t, ipc_callid_t, 99 ipc_call_t *, void (*)(ipc_callid_t, ipc_call_t *)); 100 extern void async_usleep(suseconds_t); 87 extern aid_t async_send_fast(int phoneid, sysarg_t method, sysarg_t arg1, 88 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, ipc_call_t *dataptr); 89 extern aid_t async_send_slow(int phoneid, sysarg_t method, sysarg_t arg1, 90 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5, 91 ipc_call_t *dataptr); 92 extern void async_wait_for(aid_t amsgid, sysarg_t *result); 93 extern int async_wait_timeout(aid_t amsgid, sysarg_t *retval, 94 suseconds_t timeout); 95 96 extern fid_t async_new_connection(sysarg_t in_phone_hash, ipc_callid_t callid, 97 ipc_call_t *call, void (*cthread)(ipc_callid_t, ipc_call_t *)); 98 extern void async_usleep(suseconds_t timeout); 101 99 extern void async_create_manager(void); 102 100 extern void async_destroy_manager(void); 103 101 104 extern void async_set_client_data_constructor(async_client_data_ctor_t); 105 extern void async_set_client_data_destructor(async_client_data_dtor_t); 106 107 extern void *async_client_data_get(void); 108 109 extern void async_set_client_connection(async_client_conn_t); 110 extern void async_set_interrupt_received(async_client_conn_t); 102 extern void async_set_client_connection(async_client_conn_t conn); 103 extern void async_set_interrupt_received(async_client_conn_t conn); 111 104 112 105 /* Wrappers for simple communication */ … … 250 243 (arg5), (rc1), (rc2), (rc3), (rc4), (rc5)) 251 244 252 extern sysarg_t async_req_fast(int, sysarg_t, sysarg_t, sysarg_t, sysarg_t, 253 sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *); 254 extern sysarg_t async_req_slow(int, sysarg_t, sysarg_t, sysarg_t, sysarg_t, 255 sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *, 256 sysarg_t *); 245 extern sysarg_t async_req_fast(int phoneid, sysarg_t method, sysarg_t arg1, 246 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t *r1, sysarg_t *r2, 247 sysarg_t *r3, sysarg_t *r4, sysarg_t *r5); 248 extern sysarg_t async_req_slow(int phoneid, sysarg_t method, sysarg_t arg1, 249 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5, sysarg_t *r1, 250 sysarg_t *r2, sysarg_t *r3, sysarg_t *r4, sysarg_t *r5); 257 251 258 252 static inline void async_serialize_start(void) -
uspace/lib/c/include/ipc/ipc.h
rbf75e3cb ra0ce870 46 46 typedef struct { 47 47 sysarg_t args[IPC_CALL_LEN]; 48 sysarg_t in_task_hash;49 48 sysarg_t in_phone_hash; 50 49 } ipc_call_t; … … 259 258 sysarg_t, sysarg_t, void *, ipc_async_callback_t, int); 260 259 261 extern int ipc_connect_to_me(int, int, int, int, sysarg_t * , sysarg_t *);260 extern int ipc_connect_to_me(int, int, int, int, sysarg_t *); 262 261 extern int ipc_connect_me_to(int, int, int, int); 263 262 extern int ipc_connect_me_to_blocking(int, int, int, int); -
uspace/lib/fs/libfs.c
rbf75e3cb ra0ce870 102 102 * Ask VFS for callback connection. 103 103 */ 104 sysarg_t taskhash; 105 ipc_connect_to_me(vfs_phone, 0, 0, 0, &taskhash, ®->vfs_phonehash); 104 ipc_connect_to_me(vfs_phone, 0, 0, 0, ®->vfs_phonehash); 106 105 107 106 /* … … 132 131 * Create a connection fibril to handle the callback connection. 133 132 */ 134 async_new_connection( taskhash,reg->vfs_phonehash, 0, NULL, conn);133 async_new_connection(reg->vfs_phonehash, 0, NULL, conn); 135 134 136 135 /* -
uspace/lib/net/il/il_skel.c
rbf75e3cb ra0ce870 115 115 goto out; 116 116 117 rc = ipc_connect_to_me(PHONE_NS, service, 0, 0, NULL, NULL); 117 sysarg_t phonehash; 118 rc = ipc_connect_to_me(PHONE_NS, service, 0, 0, &phonehash); 118 119 if (rc != EOK) 119 120 goto out; -
uspace/lib/net/nil/nil_skel.c
rbf75e3cb ra0ce870 115 115 goto out; 116 116 117 rc = ipc_connect_to_me(PHONE_NS, service, 0, 0, NULL, NULL); 117 sysarg_t phonehash; 118 rc = ipc_connect_to_me(PHONE_NS, service, 0, 0, &phonehash); 118 119 if (rc != EOK) 119 120 goto out; -
uspace/lib/net/tl/tl_skel.c
rbf75e3cb ra0ce870 117 117 goto out; 118 118 119 rc = ipc_connect_to_me(PHONE_NS, service, 0, 0, NULL, NULL); 119 sysarg_t phonehash; 120 rc = ipc_connect_to_me(PHONE_NS, service, 0, 0, &phonehash); 120 121 if (rc != EOK) 121 122 goto out; -
uspace/srv/clip/clip.c
rbf75e3cb ra0ce870 183 183 async_set_client_connection(clip_connection); 184 184 185 if (ipc_connect_to_me(PHONE_NS, SERVICE_CLIPBOARD, 0, 0, NULL, NULL)) 185 sysarg_t phonead; 186 if (ipc_connect_to_me(PHONE_NS, SERVICE_CLIPBOARD, 0, 0, &phonead) != 0) 186 187 return -1; 187 188 -
uspace/srv/devman/main.c
rbf75e3cb ra0ce870 586 586 587 587 /* Register device manager at naming service. */ 588 if (ipc_connect_to_me(PHONE_NS, SERVICE_DEVMAN, 0, 0, NULL, NULL) != 0) 588 sysarg_t phonead; 589 if (ipc_connect_to_me(PHONE_NS, SERVICE_DEVMAN, 0, 0, &phonead) != 0) 589 590 return -1; 590 591 -
uspace/srv/devmap/devmap.c
rbf75e3cb ra0ce870 1150 1150 1151 1151 /* Register device mapper at naming service */ 1152 if (ipc_connect_to_me(PHONE_NS, SERVICE_DEVMAP, 0, 0, NULL, NULL) != 0) 1152 sysarg_t phonead; 1153 if (ipc_connect_to_me(PHONE_NS, SERVICE_DEVMAP, 0, 0, &phonead) != 0) 1153 1154 return -1; 1154 1155 -
uspace/srv/hid/adb_mouse/adb_dev.c
rbf75e3cb ra0ce870 68 68 69 69 /* NB: The callback connection is slotted for removal */ 70 sysarg_t taskhash;71 70 sysarg_t phonehash; 72 if (ipc_connect_to_me(dev_phone, 0, 0, 0, & taskhash, &phonehash) != 0) {71 if (ipc_connect_to_me(dev_phone, 0, 0, 0, &phonehash) != 0) { 73 72 printf(NAME ": Failed to create callback from device\n"); 74 73 return false; 75 74 } 76 75 77 async_new_connection( taskhash,phonehash, 0, NULL, adb_dev_events);76 async_new_connection(phonehash, 0, NULL, adb_dev_events); 78 77 79 78 return 0; -
uspace/srv/hid/char_mouse/chardev.c
rbf75e3cb ra0ce870 70 70 71 71 /* NB: The callback connection is slotted for removal */ 72 sysarg_t taskhash;73 72 sysarg_t phonehash; 74 if (ipc_connect_to_me(dev_phone, 0, 0, 0, & taskhash, &phonehash) != 0) {73 if (ipc_connect_to_me(dev_phone, 0, 0, 0, &phonehash) != 0) { 75 74 printf(NAME ": Failed to create callback from device\n"); 76 75 return false; 77 76 } 78 77 79 async_new_connection( taskhash,phonehash, 0, NULL, chardev_events);78 async_new_connection(phonehash, 0, NULL, chardev_events); 80 79 81 80 return 0; -
uspace/srv/hid/console/console.c
rbf75e3cb ra0ce870 726 726 727 727 /* NB: The callback connection is slotted for removal */ 728 sysarg_t taskhash;729 728 sysarg_t phonehash; 730 if (ipc_connect_to_me(kbd_phone, SERVICE_CONSOLE, 0, 0, &taskhash, 731 &phonehash) != 0) { 729 if (ipc_connect_to_me(kbd_phone, SERVICE_CONSOLE, 0, 0, &phonehash) != 0) { 732 730 printf(NAME ": Failed to create callback from input device\n"); 733 731 return false; 734 732 } 735 733 736 async_new_connection( taskhash,phonehash, 0, NULL, keyboard_events);734 async_new_connection(phonehash, 0, NULL, keyboard_events); 737 735 738 736 /* Connect to mouse device */ … … 751 749 } 752 750 753 if (ipc_connect_to_me(mouse_phone, SERVICE_CONSOLE, 0, 0, &taskhash, 754 &phonehash) != 0) { 751 if (ipc_connect_to_me(mouse_phone, SERVICE_CONSOLE, 0, 0, &phonehash) != 0) { 755 752 printf(NAME ": Failed to create callback from mouse device\n"); 756 753 mouse_phone = -1; … … 758 755 } 759 756 760 async_new_connection( taskhash,phonehash, 0, NULL, mouse_events);757 async_new_connection(phonehash, 0, NULL, mouse_events); 761 758 skip_mouse: 762 759 -
uspace/srv/hid/fb/main.c
rbf75e3cb ra0ce870 114 114 return -1; 115 115 116 if (ipc_connect_to_me(PHONE_NS, SERVICE_VIDEO, 0, 0, NULL, NULL) != 0) 116 sysarg_t phonead; 117 if (ipc_connect_to_me(PHONE_NS, SERVICE_VIDEO, 0, 0, &phonead) != 0) 117 118 return -1; 118 119 -
uspace/srv/hid/kbd/port/adb.c
rbf75e3cb ra0ce870 71 71 72 72 /* NB: The callback connection is slotted for removal */ 73 sysarg_t taskhash;74 73 sysarg_t phonehash; 75 if (ipc_connect_to_me(dev_phone, 0, 0, 0, & taskhash, &phonehash) != 0) {74 if (ipc_connect_to_me(dev_phone, 0, 0, 0, &phonehash) != 0) { 76 75 printf(NAME ": Failed to create callback from device\n"); 77 76 return false; 78 77 } 79 78 80 async_new_connection( taskhash,phonehash, 0, NULL, kbd_port_events);79 async_new_connection(phonehash, 0, NULL, kbd_port_events); 81 80 82 81 return 0; -
uspace/srv/hid/kbd/port/chardev.c
rbf75e3cb ra0ce870 91 91 92 92 /* NB: The callback connection is slotted for removal */ 93 sysarg_t taskhash;94 93 sysarg_t phonehash; 95 if (ipc_connect_to_me(dev_phone, 0, 0, 0, & taskhash, &phonehash) != 0) {94 if (ipc_connect_to_me(dev_phone, 0, 0, 0, &phonehash) != 0) { 96 95 printf(NAME ": Failed to create callback from device\n"); 97 96 return -1; 98 97 } 99 98 100 async_new_connection( taskhash,phonehash, 0, NULL, kbd_port_events);99 async_new_connection(phonehash, 0, NULL, kbd_port_events); 101 100 102 101 return 0; -
uspace/srv/hw/irc/apic/apic.c
rbf75e3cb ra0ce870 108 108 109 109 async_set_client_connection(apic_connection); 110 ipc_connect_to_me(PHONE_NS, SERVICE_APIC, 0, 0, NULL, NULL); 110 sysarg_t phonead; 111 ipc_connect_to_me(PHONE_NS, SERVICE_APIC, 0, 0, &phonead); 111 112 112 113 return true; -
uspace/srv/hw/irc/fhc/fhc.c
rbf75e3cb ra0ce870 137 137 138 138 async_set_client_connection(fhc_connection); 139 ipc_connect_to_me(PHONE_NS, SERVICE_FHC, 0, 0, NULL, NULL); 139 sysarg_t phonead; 140 ipc_connect_to_me(PHONE_NS, SERVICE_FHC, 0, 0, &phonead); 140 141 141 142 return true; -
uspace/srv/hw/irc/i8259/i8259.c
rbf75e3cb ra0ce870 150 150 151 151 async_set_client_connection(i8259_connection); 152 ipc_connect_to_me(PHONE_NS, SERVICE_I8259, 0, 0, NULL, NULL); 152 sysarg_t phonead; 153 ipc_connect_to_me(PHONE_NS, SERVICE_I8259, 0, 0, &phonead); 153 154 154 155 return true; -
uspace/srv/hw/irc/obio/obio.c
rbf75e3cb ra0ce870 138 138 139 139 async_set_client_connection(obio_connection); 140 ipc_connect_to_me(PHONE_NS, SERVICE_OBIO, 0, 0, NULL, NULL); 140 sysarg_t phonead; 141 ipc_connect_to_me(PHONE_NS, SERVICE_OBIO, 0, 0, &phonead); 141 142 142 143 return true; -
uspace/srv/hw/netif/ne2000/ne2000.c
rbf75e3cb ra0ce870 397 397 async_set_interrupt_received(irq_handler); 398 398 399 return ipc_connect_to_me(PHONE_NS, SERVICE_NE2000, 0, 0, NULL, NULL); 399 sysarg_t phonehash; 400 return ipc_connect_to_me(PHONE_NS, SERVICE_NE2000, 0, 0, &phonehash); 400 401 } 401 402 -
uspace/srv/loader/main.c
rbf75e3cb ra0ce870 423 423 int main(int argc, char *argv[]) 424 424 { 425 sysarg_t phonead; 425 426 task_id_t id; 426 427 int rc; … … 438 439 439 440 /* Register at naming service. */ 440 if (ipc_connect_to_me(PHONE_NS, SERVICE_LOAD, 0, 0, NULL, NULL) != 0)441 if (ipc_connect_to_me(PHONE_NS, SERVICE_LOAD, 0, 0, &phonead) != 0) 441 442 return -2; 442 443 -
uspace/srv/net/net/net.c
rbf75e3cb ra0ce870 326 326 static int net_module_start(async_client_conn_t client_connection) 327 327 { 328 sysarg_t phonehash; 328 329 int rc; 329 330 … … 337 338 goto out; 338 339 339 rc = ipc_connect_to_me(PHONE_NS, SERVICE_NETWORKING, 0, 0, NULL, NULL);340 rc = ipc_connect_to_me(PHONE_NS, SERVICE_NETWORKING, 0, 0, &phonehash); 340 341 if (rc != EOK) 341 342 goto out; -
uspace/srv/net/netif/lo/lo.c
rbf75e3cb ra0ce870 167 167 int netif_initialize(void) 168 168 { 169 return ipc_connect_to_me(PHONE_NS, SERVICE_LO, 0, 0, NULL, NULL); 169 sysarg_t phonehash; 170 return ipc_connect_to_me(PHONE_NS, SERVICE_LO, 0, 0, &phonehash); 170 171 } 171 172 -
uspace/srv/vfs/vfs.c
rbf75e3cb ra0ce870 59 59 ipc_answer_0(iid, EOK); 60 60 61 /* 62 * Here we enter the main connection fibril loop. 63 * The logic behind this loop and the protocol is that we'd like to keep 64 * each connection open until the client hangs up. When the client hangs 65 * up, we will free its VFS state. The act of hanging up the connection 66 * by the client is equivalent to client termination because we cannot 67 * distinguish one from the other. On the other hand, the client can 68 * hang up arbitrarily if it has no open files and reestablish the 69 * connection later. 70 */ 61 71 while (keep_on_going) { 62 72 ipc_call_t call; … … 123 133 } 124 134 } 125 126 /* 127 * Open files for this client will be cleaned up when its last 128 * connection fibril terminates. 129 */ 135 136 vfs_files_done(); 130 137 } 131 138 … … 159 166 160 167 /* 161 * Set client data constructor and destructor.162 */163 async_set_client_data_constructor(vfs_client_data_create);164 async_set_client_data_destructor(vfs_client_data_destroy);165 166 /*167 168 * Set a connection handling function/fibril. 168 169 */ … … 172 173 * Register at the naming service. 173 174 */ 174 ipc_connect_to_me(PHONE_NS, SERVICE_VFS, 0, 0, NULL, NULL); 175 sysarg_t phonead; 176 ipc_connect_to_me(PHONE_NS, SERVICE_VFS, 0, 0, &phonead); 175 177 176 178 /* -
uspace/srv/vfs/vfs.h
rbf75e3cb ra0ce870 188 188 #define MAX_OPEN_FILES 128 189 189 190 extern void *vfs_client_data_create(void); 191 extern void vfs_client_data_destroy(void *); 192 190 extern bool vfs_files_init(void); 191 extern void vfs_files_done(void); 193 192 extern vfs_file_t *vfs_file_get(int); 194 extern void vfs_file_put(vfs_file_t *); 195 extern int vfs_fd_assign(vfs_file_t *, int); 193 extern int vfs_fd_assign(vfs_file_t *file, int fd); 196 194 extern int vfs_fd_alloc(bool desc); 197 195 extern int vfs_fd_free(int); 196 197 extern void vfs_file_addref(vfs_file_t *); 198 extern void vfs_file_delref(vfs_file_t *); 198 199 199 200 extern void vfs_node_addref(vfs_node_t *); -
uspace/srv/vfs/vfs_file.c
rbf75e3cb ra0ce870 45 45 #include "vfs.h" 46 46 47 #define VFS_DATA ((vfs_client_data_t *) async_client_data_get()) 48 #define FILES (VFS_DATA->files) 49 50 typedef struct { 51 fibril_mutex_t lock; 52 vfs_file_t **files; 53 } vfs_client_data_t; 47 /** 48 * This is a per-connection table of open files. 49 * Our assumption is that each client opens only one connection and therefore 50 * there is one table of open files per task. However, this may not be the case 51 * and the client can open more connections to VFS. In that case, there will be 52 * several tables and several file handle name spaces per task. Besides of this, 53 * the functionality will stay unchanged. So unless the client knows what it is 54 * doing, it should open one connection to VFS only. 55 * 56 * Allocation of the open files table is deferred until the client makes the 57 * first VFS_OPEN operation. 58 * 59 * This resource being per-connection and, in the first place, per-fibril, we 60 * don't need to protect it by a mutex. 61 */ 62 fibril_local vfs_file_t **files = NULL; 54 63 55 64 /** Initialize the table of open files. */ 56 static bool vfs_files_init(void) 57 { 58 fibril_mutex_lock(&VFS_DATA->lock); 59 if (!FILES) { 60 FILES = malloc(MAX_OPEN_FILES * sizeof(vfs_file_t *)); 61 if (!FILES) { 62 fibril_mutex_unlock(&VFS_DATA->lock); 65 bool vfs_files_init(void) 66 { 67 if (!files) { 68 files = malloc(MAX_OPEN_FILES * sizeof(vfs_file_t *)); 69 if (!files) 63 70 return false; 64 } 65 memset(FILES, 0, MAX_OPEN_FILES * sizeof(vfs_file_t *)); 66 } 67 fibril_mutex_unlock(&VFS_DATA->lock); 71 memset(files, 0, MAX_OPEN_FILES * sizeof(vfs_file_t *)); 72 } 68 73 return true; 69 74 } 70 75 71 76 /** Cleanup the table of open files. */ 72 staticvoid vfs_files_done(void)77 void vfs_files_done(void) 73 78 { 74 79 int i; 75 80 76 if (! FILES)81 if (!files) 77 82 return; 78 83 79 84 for (i = 0; i < MAX_OPEN_FILES; i++) { 80 if ( FILES[i]) {81 (void) vfs_close_internal( FILES[i]);85 if (files[i]) { 86 (void) vfs_close_internal(files[i]); 82 87 (void) vfs_fd_free(i); 83 88 } 84 89 } 85 90 86 free(FILES); 87 } 88 89 void *vfs_client_data_create(void) 90 { 91 vfs_client_data_t *vfs_data; 92 93 vfs_data = malloc(sizeof(vfs_client_data_t)); 94 if (vfs_data) { 95 fibril_mutex_initialize(&vfs_data->lock); 96 vfs_data->files = NULL; 97 } 98 99 return vfs_data; 100 } 101 102 void vfs_client_data_destroy(void *data) 103 { 104 vfs_client_data_t *vfs_data = (vfs_client_data_t *) data; 105 106 vfs_files_done(); 107 free(vfs_data); 108 } 109 110 /** Increment reference count of VFS file structure. 111 * 112 * @param file File structure that will have reference count 113 * incremented. 114 */ 115 static void vfs_file_addref(vfs_file_t *file) 116 { 117 assert(fibril_mutex_is_locked(&VFS_DATA->lock)); 118 119 file->refcnt++; 120 } 121 122 /** Decrement reference count of VFS file structure. 123 * 124 * @param file File structure that will have reference count 125 * decremented. 126 */ 127 static void vfs_file_delref(vfs_file_t *file) 128 { 129 assert(fibril_mutex_is_locked(&VFS_DATA->lock)); 130 131 if (file->refcnt-- == 1) { 132 /* 133 * Lost the last reference to a file, need to drop our reference 134 * to the underlying VFS node. 135 */ 136 vfs_node_delref(file->node); 137 free(file); 138 } 139 } 140 91 free(files); 92 } 141 93 142 94 /** Allocate a file descriptor. … … 159 111 i = 0; 160 112 161 fibril_mutex_lock(&VFS_DATA->lock);162 113 while (true) { 163 if (!FILES[i]) { 164 FILES[i] = (vfs_file_t *) malloc(sizeof(vfs_file_t)); 165 if (!FILES[i]) { 166 fibril_mutex_unlock(&VFS_DATA->lock); 114 if (!files[i]) { 115 files[i] = (vfs_file_t *) malloc(sizeof(vfs_file_t)); 116 if (!files[i]) 167 117 return ENOMEM; 168 }169 118 170 memset(FILES[i], 0, sizeof(vfs_file_t)); 171 fibril_mutex_initialize(&FILES[i]->lock); 172 vfs_file_addref(FILES[i]); 173 fibril_mutex_unlock(&VFS_DATA->lock); 119 memset(files[i], 0, sizeof(vfs_file_t)); 120 fibril_mutex_initialize(&files[i]->lock); 121 vfs_file_addref(files[i]); 174 122 return (int) i; 175 123 } … … 187 135 } 188 136 } 189 fibril_mutex_unlock(&VFS_DATA->lock);190 137 191 138 return EMFILE; … … 203 150 if (!vfs_files_init()) 204 151 return ENOMEM; 205 206 fibril_mutex_lock(&VFS_DATA->lock); 207 if ((fd < 0) || (fd >= MAX_OPEN_FILES) || (FILES[fd] == NULL)) { 208 fibril_mutex_unlock(&VFS_DATA->lock); 152 153 if ((fd < 0) || (fd >= MAX_OPEN_FILES) || (files[fd] == NULL)) 209 154 return EBADF; 210 } 211 212 vfs_file_delref(FILES[fd]); 213 FILES[fd] = NULL; 214 fibril_mutex_unlock(&VFS_DATA->lock); 155 156 vfs_file_delref(files[fd]); 157 files[fd] = NULL; 215 158 216 159 return EOK; … … 230 173 if (!vfs_files_init()) 231 174 return ENOMEM; 232 233 fibril_mutex_lock(&VFS_DATA->lock); 234 if ((fd < 0) || (fd >= MAX_OPEN_FILES) || (FILES[fd] != NULL)) { 235 fibril_mutex_unlock(&VFS_DATA->lock); 175 176 if ((fd < 0) || (fd >= MAX_OPEN_FILES) || (files[fd] != NULL)) 236 177 return EINVAL; 237 } 238 239 FILES[fd] = file; 240 vfs_file_addref(FILES[fd]); 241 fibril_mutex_unlock(&VFS_DATA->lock); 178 179 files[fd] = file; 180 vfs_file_addref(files[fd]); 242 181 243 182 return EOK; 244 183 } 245 184 185 /** Increment reference count of VFS file structure. 186 * 187 * @param file File structure that will have reference count 188 * incremented. 189 */ 190 void vfs_file_addref(vfs_file_t *file) 191 { 192 /* 193 * File structures are per-connection, so no-one, except the current 194 * fibril, should have a reference to them. This is the reason we don't 195 * do any synchronization here. 196 */ 197 file->refcnt++; 198 } 199 200 /** Decrement reference count of VFS file structure. 201 * 202 * @param file File structure that will have reference count 203 * decremented. 204 */ 205 void vfs_file_delref(vfs_file_t *file) 206 { 207 if (file->refcnt-- == 1) { 208 /* 209 * Lost the last reference to a file, need to drop our reference 210 * to the underlying VFS node. 211 */ 212 vfs_node_delref(file->node); 213 free(file); 214 } 215 } 216 246 217 /** Find VFS file structure for a given file descriptor. 247 218 * … … 255 226 return NULL; 256 227 257 fibril_mutex_lock(&VFS_DATA->lock); 258 if ((fd >= 0) && (fd < MAX_OPEN_FILES)) { 259 vfs_file_t *file = FILES[fd]; 260 vfs_file_addref(file); 261 fibril_mutex_unlock(&VFS_DATA->lock); 262 return file; 263 } 264 fibril_mutex_unlock(&VFS_DATA->lock); 228 if ((fd >= 0) && (fd < MAX_OPEN_FILES)) 229 return files[fd]; 265 230 266 231 return NULL; 267 }268 269 /** Stop using a file structure.270 *271 * @param file VFS file structure.272 */273 void vfs_file_put(vfs_file_t *file)274 {275 fibril_mutex_lock(&VFS_DATA->lock);276 vfs_file_delref(file);277 fibril_mutex_unlock(&VFS_DATA->lock);278 232 } 279 233 -
uspace/srv/vfs/vfs_ops.c
rbf75e3cb ra0ce870 491 491 void vfs_open(ipc_callid_t rid, ipc_call_t *request) 492 492 { 493 if (!vfs_files_init()) { 494 ipc_answer_0(rid, ENOMEM); 495 return; 496 } 497 493 498 /* 494 499 * The POSIX interface is open(path, oflag, mode). … … 604 609 vfs_node_addref(node); 605 610 vfs_node_put(node); 606 vfs_file_put(file);607 611 608 612 /* Success! Return the new file descriptor to the client. */ … … 613 617 { 614 618 // FIXME: check for sanity of the supplied fs, dev and index 619 620 if (!vfs_files_init()) { 621 ipc_answer_0(rid, ENOMEM); 622 return; 623 } 615 624 616 625 /* … … 677 686 vfs_node_addref(node); 678 687 vfs_node_put(node); 679 vfs_file_put(file);680 688 681 689 /* Success! Return the new file descriptor to the client. */ … … 713 721 vfs_release_phone(file->node->fs_handle, fs_phone); 714 722 fibril_mutex_unlock(&file->lock); 715 716 vfs_file_put(file); 723 717 724 ipc_answer_0(rid, rc); 718 725 } … … 768 775 ipc_answer_0(rid, ret); 769 776 770 vfs_file_put(file);771 777 ret = vfs_fd_free(fd); 772 778 ipc_answer_0(rid, ret); … … 869 875 file->pos += bytes; 870 876 fibril_mutex_unlock(&file->lock); 871 vfs_file_put(file); 872 877 873 878 /* 874 879 * FS server's reply is the final result of the whole operation we … … 910 915 file->pos = (aoff64_t) off; 911 916 fibril_mutex_unlock(&file->lock); 912 vfs_file_put(file);913 917 ipc_answer_1(rid, EOK, off); 914 918 return; … … 918 922 if ((off >= 0) && (file->pos + off < file->pos)) { 919 923 fibril_mutex_unlock(&file->lock); 920 vfs_file_put(file);921 924 ipc_answer_0(rid, EOVERFLOW); 922 925 return; … … 925 928 if ((off < 0) && (file->pos < (aoff64_t) -off)) { 926 929 fibril_mutex_unlock(&file->lock); 927 vfs_file_put(file);928 930 ipc_answer_0(rid, EOVERFLOW); 929 931 return; … … 934 936 935 937 fibril_mutex_unlock(&file->lock); 936 vfs_file_put(file);937 938 ipc_answer_2(rid, EOK, LOWER32(newoff), 938 939 UPPER32(newoff)); … … 945 946 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 946 947 fibril_mutex_unlock(&file->lock); 947 vfs_file_put(file);948 948 ipc_answer_0(rid, EOVERFLOW); 949 949 return; … … 953 953 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 954 954 fibril_mutex_unlock(&file->lock); 955 vfs_file_put(file);956 955 ipc_answer_0(rid, EOVERFLOW); 957 956 return; … … 963 962 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 964 963 fibril_mutex_unlock(&file->lock); 965 vfs_file_put(file);966 964 ipc_answer_2(rid, EOK, LOWER32(newoff), UPPER32(newoff)); 967 965 return; … … 969 967 970 968 fibril_mutex_unlock(&file->lock); 971 vfs_file_put(file);972 969 ipc_answer_0(rid, EINVAL); 973 970 } … … 1008 1005 1009 1006 fibril_mutex_unlock(&file->lock); 1010 vfs_file_put(file);1011 1007 ipc_answer_0(rid, (sysarg_t)rc); 1012 1008 } … … 1025 1021 ipc_callid_t callid; 1026 1022 if (!async_data_read_receive(&callid, NULL)) { 1027 vfs_file_put(file);1028 1023 ipc_answer_0(callid, EINVAL); 1029 1024 ipc_answer_0(rid, EINVAL); … … 1043 1038 1044 1039 fibril_mutex_unlock(&file->lock); 1045 vfs_file_put(file);1046 1040 ipc_answer_0(rid, rc); 1047 1041 } … … 1345 1339 int newfd = IPC_GET_ARG2(*request); 1346 1340 1347 /* If the file descriptors are the same, do nothing. */1348 if (oldfd == newfd) {1349 ipc_answer_1(rid, EOK, newfd);1350 return;1351 }1352 1353 1341 /* Lookup the file structure corresponding to oldfd. */ 1354 1342 vfs_file_t *oldfile = vfs_file_get(oldfd); 1355 1343 if (!oldfile) { 1356 1344 ipc_answer_0(rid, EBADF); 1345 return; 1346 } 1347 1348 /* If the file descriptors are the same, do nothing. */ 1349 if (oldfd == newfd) { 1350 ipc_answer_1(rid, EOK, newfd); 1357 1351 return; 1358 1352 } … … 1371 1365 if (ret != EOK) { 1372 1366 fibril_mutex_unlock(&oldfile->lock); 1373 vfs_file_put(oldfile);1374 vfs_file_put(newfile);1375 1367 ipc_answer_0(rid, ret); 1376 1368 return; … … 1380 1372 if (ret != EOK) { 1381 1373 fibril_mutex_unlock(&oldfile->lock); 1382 vfs_file_put(oldfile);1383 vfs_file_put(newfile);1384 1374 ipc_answer_0(rid, ret); 1385 1375 return; 1386 1376 } 1387 vfs_file_put(newfile);1388 1377 } 1389 1378 … … 1391 1380 int ret = vfs_fd_assign(oldfile, newfd); 1392 1381 fibril_mutex_unlock(&oldfile->lock); 1393 vfs_file_put(oldfile);1394 1382 1395 1383 if (ret != EOK)
Note:
See TracChangeset
for help on using the changeset viewer.