Changeset b8341bc in mainline for uspace/lib/c/generic/task.c
- Timestamp:
- 2019-08-07T05:42:02Z (6 years ago)
- Children:
- c675ab1
- Parents:
- b22b0a94
- git-author:
- Michal Koutný <xm.koutny+hos@…> (2015-10-19 22:25:17)
- git-committer:
- Matthieu Riolo <matthieu.riolo@…> (2019-08-07 05:42:02)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/task.c
rb22b0a94 rb8341bc 472 472 } 473 473 474 void task_set_event_handler(task_event_handler_t handler) 475 { 474 // TODO extract to separate module 475 static void taskman_task_event(ipc_callid_t iid, ipc_call_t *icall) 476 { 477 task_id_t tid = (task_id_t) 478 MERGE_LOUP32(IPC_GET_ARG1(*icall), IPC_GET_ARG2(*icall)); 479 int flags = IPC_GET_ARG3(*icall); 480 task_exit_t texit = IPC_GET_ARG4(*icall); 481 int retval = IPC_GET_ARG5(*icall); 482 483 task_event_handler(tid, flags, texit, retval); 484 485 async_answer_0(iid, EOK); 486 } 487 488 static void taskman_event_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) 489 { 490 /* Accept connection */ 491 async_answer_0(iid, EOK); 492 493 while (true) { 494 ipc_call_t call; 495 ipc_callid_t callid = async_get_call(&call); 496 497 if (!IPC_GET_IMETHOD(call)) { 498 /* Hangup, TODO explain or handle differntly */ 499 break; 500 } 501 502 switch (IPC_GET_IMETHOD(call)) { 503 case TASKMAN_EV_TASK: 504 taskman_task_event(callid, &call); 505 break; 506 default: 507 async_answer_0(callid, ENOTSUP); 508 break; 509 } 510 } 511 } 512 513 /** 514 * Blocks, calls handler in another fibril 515 */ 516 int task_register_event_handler(task_event_handler_t handler) 517 { 518 /* 519 * so far support assign once, modification cannot be naïve due to 520 * races 521 */ 522 assert(task_event_handler == NULL); 523 assert(handler != NULL); /* no support for "unregistration" */ 524 476 525 task_event_handler = handler; 477 // TODO implement logic for calling the handler 526 527 async_exch_t *exch = taskman_exchange_begin(); 528 aid_t req = async_send_0(exch, TASKMAN_EVENT_CALLBACK, NULL); 529 530 int rc = async_connect_to_me(exch, 0, 0, 0, taskman_event_conn, NULL); 531 taskman_exchange_end(exch); 532 533 if (rc != EOK) { 534 return rc; 535 } 536 537 sysarg_t retval; 538 async_wait_for(req, &retval); 539 return retval; 478 540 } 479 541
Note:
See TracChangeset
for help on using the changeset viewer.