Changeset 012dd8e in mainline
- Timestamp:
- 2019-08-07T09:15:30Z (5 years ago)
- Children:
- e8747bd8
- Parents:
- 780c8ce
- git-author:
- Michal Koutný <xm.koutny+hos@…> (2015-11-01 00:08:04)
- git-committer:
- Matthieu Riolo <matthieu.riolo@…> (2019-08-07 09:15:30)
- Files:
-
- 29 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
abi/include/abi/ipc/methods.h
r780c8ce r012dd8e 38 38 #include <abi/cap.h> 39 39 40 /* Well known phone descriptors */41 static cap_phone_handle_t const PHONE_INITIAL = (cap_phone_handle_t) (CAP_NIL + 1);42 43 40 /** Kernel IPC interfaces 44 41 * -
boot/Makefile.common
r780c8ce r012dd8e 68 68 INITRD = initrd 69 69 70 # NOTE: Naming service must be first task in the list 70 # NOTE: Order of tasks here is important since kernel connects initial phone of 71 # all these tasks to answerbox of the first one in this list (its phone is left 72 # untouched). 73 # INIT_TASKS = \ 74 # $(USPACE_PATH)/srv/taskman/taskman \ 75 # $(USPACE_PATH)/srv/ns/ns \ 76 # $(USPACE_PATH)/srv/locsrv/locsrv \ 77 # $(USPACE_PATH)/srv/vfs/vfs \ 78 # $(USPACE_PATH)/srv/loader/loader \ 79 # $(USPACE_PATH)/srv/bd/rd/rd 80 71 81 INIT_TASKS = \ 82 $(USPACE_PATH)/srv/taskman/taskman \ 72 83 $(USPACE_PATH)/srv/ns/ns \ 84 $(USPACE_PATH)/srv/locsrv/locsrv \ 85 $(USPACE_PATH)/srv/vfs/vfs \ 86 $(USPACE_PATH)/srv/sysman/sysman \ 73 87 $(USPACE_PATH)/srv/loader/loader \ 74 $(USPACE_PATH)/srv/sysman/sysman \75 $(USPACE_PATH)/srv/locsrv/locsrv \76 $(USPACE_PATH)/srv/bd/rd/rd \77 $(USPACE_PATH)/srv/vfs/vfs \78 88 $(USPACE_PATH)/srv/logger/logger \ 79 $(USPACE_PATH)/srv/taskman/taskman 89 $(USPACE_PATH)/srv/bd/rd/rd 90 80 91 81 92 ifeq ($(RDFMT),tmpfs) -
kernel/generic/src/main/kinit.c
r780c8ce r012dd8e 211 211 } 212 212 213 /* 214 * Initialize and prepare init tasks for start. 215 * 216 * All tasks' phone no 0 is connected to answerbox of the first of the 217 * init tasks (except for the first task itself). 218 */ 213 219 for (i = 0; i < init.cnt; i++) { 214 220 if (init.tasks[i].paddr % FRAME_SIZE) { -
uspace/app/tester/proc/task_wait.c
r780c8ce r012dd8e 73 73 rc = task_wait(&wait, &texit, &retval); 74 74 TPRINTF("done.\n"); 75 TASSERT(rc == EIN VAL);75 TASSERT(rc == EINTR); 76 76 TASSERT(task_wait_get(&wait) == 0); 77 77 TPRINTF("OK\n"); … … 215 215 rc = task_wait(&wait, &texit, &retval); 216 216 TPRINTF("done.\n"); 217 TASSERT(rc == EIN VAL);217 TASSERT(rc == EINTR); 218 218 TASSERT(task_wait_get(&wait) == 0); 219 219 TASSERT(texit == TASK_EXIT_UNEXPECTED); -
uspace/lib/c/generic/async/client.c
r780c8ce r012dd8e 124 124 static fibril_rmutex_t message_mutex; 125 125 126 /** Primary session (spawn parent, later naming service) */127 async_sess_t *session_primary = NULL;128 129 126 /** Message data */ 130 127 typedef struct { … … 169 166 170 167 171 static async_sess_t *create_session_primary(void) 168 /** Create session for existing phone 169 * 170 * @return session on success, NULL on error 171 */ 172 173 async_sess_t *create_session(cap_phone_handle_t phone, exch_mgmt_t mgmt, 174 sysarg_t arg1, sysarg_t arg2, sysarg_t arg3) 172 175 { 173 176 async_sess_t *session = (async_sess_t *) malloc(sizeof(async_sess_t)); 174 177 175 178 if (session != NULL) { 176 // TODO extract common part with async_connect_me_to 177 session_ns->iface = 0; 178 session->mgmt = EXCHANGE_ATOMIC; 179 session->phone = PHONE_INITIAL; 180 session->arg1 = 0; 181 session->arg2 = 0; 182 session->arg3 = 0; 179 session->iface = 0; 180 session->mgmt = mgmt; 181 session->phone = phone; 182 session->arg1 = arg1; 183 session->arg2 = arg2; 184 session->arg3 = arg3; 183 185 184 186 fibril_mutex_initialize(&session->remote_state_mtx); … … 189 191 atomic_set(&session->refcnt, 0); 190 192 &session.exchanges = 0; 193 } else { 194 errno = ENOMEM; 191 195 } 192 196 … … 196 200 197 201 /** Initialize the async framework. 198 * @param arg_session_primary Primary session (to naming service). 199 * 200 */ 201 void __async_client_init(async_sess_t *arg_session_primary) 202 * 203 */ 204 void __async_client_init(void) 202 205 { 203 206 if (fibril_rmutex_initialize(&message_mutex) != EOK) 204 abort();205 206 if (arg_session_primary == NULL) {207 session_primary = create_session_primary();208 } else {209 session_primary = arg_session_primary;210 }211 212 if (session_primary == NULL)213 207 abort(); 214 208 } … … 832 826 } 833 827 834 /** Injects another session instead of original primary session835 *836 * @param session Session to naming service.837 *838 * @return old primary session (to spawn parent)839 */840 async_sess_t *async_session_primary_swap(async_sess_t *session)841 {842 assert(session_primary->phone == PHONE_INITIAL);843 844 async_sess_t *old_primary = session_primary;845 session_primary = session;846 return old_primary;847 }848 849 828 /** Wrapper for making IPC_M_CONNECT_ME_TO calls using the async framework. 850 829 * … … 865 844 if (exch == NULL) { 866 845 errno = ENOENT; 867 return NULL;868 }869 870 async_sess_t *sess = calloc(1, sizeof(async_sess_t));871 if (sess == NULL) {872 errno = ENOMEM;873 846 return NULL; 874 847 } … … 879 852 if (rc != EOK) { 880 853 errno = rc; 881 free(sess);882 854 return NULL; 883 855 } 884 856 885 sess->iface = iface; 886 sess->phone = phone; 887 sess->arg1 = iface; 888 sess->arg2 = arg2; 889 sess->arg3 = arg3; 890 891 fibril_mutex_initialize(&sess->remote_state_mtx); 892 list_initialize(&sess->exch_list); 893 fibril_mutex_initialize(&sess->mutex); 857 async_sess_t *sess = create_session(phone, mgmt, iface, arg2, arg3); 858 if (sess == NULL) { 859 ipc_hangup(phone); 860 } 894 861 895 862 return sess; … … 933 900 if (exch == NULL) { 934 901 errno = ENOENT; 935 return NULL;936 }937 938 async_sess_t *sess = calloc(1, sizeof(async_sess_t));939 if (sess == NULL) {940 errno = ENOMEM;941 902 return NULL; 942 903 } … … 951 912 } 952 913 953 sess->iface = iface; 954 sess->phone = phone; 955 sess->arg1 = iface; 956 sess->arg2 = arg2; 957 sess->arg3 = arg3; 958 959 fibril_mutex_initialize(&sess->remote_state_mtx); 960 list_initialize(&sess->exch_list); 961 fibril_mutex_initialize(&sess->mutex); 914 async_sess_t *sess = create_session(phone, mgmt, iface, arg2, arg3); 915 if (sess == NULL) { 916 ipc_hangup(phone); 917 } 962 918 963 919 return sess; … … 969 925 async_sess_t *async_connect_kbox(task_id_t id) 970 926 { 971 async_sess_t *sess = calloc(1, sizeof(async_sess_t));972 if (sess == NULL) {973 errno = ENOMEM;974 return NULL;975 }976 977 927 cap_phone_handle_t phone; 978 928 errno_t rc = ipc_connect_kbox(id, &phone); 979 929 if (rc != EOK) { 980 930 errno = rc; 981 free(sess);982 931 return NULL; 983 932 } 984 933 985 sess->iface = 0; 986 sess->mgmt = EXCHANGE_ATOMIC; 987 sess->phone = phone; 988 989 fibril_mutex_initialize(&sess->remote_state_mtx); 990 list_initialize(&sess->exch_list); 991 fibril_mutex_initialize(&sess->mutex); 934 async_sess_t *sess = create_session(phone, EXCHANGE_ATOMIC, 0, 0, 0); 935 if (sess == NULL) { 936 ipc_hangup(phone); 937 } 992 938 993 939 return sess; -
uspace/lib/c/generic/async/server.c
r780c8ce r012dd8e 391 391 * calls routed through that phone. 392 392 * @param in_task_id Identification of the incoming connection. 393 * @param call Call data of the opening call. If call is NULL, the 394 * connection was opened by accepting the 395 * IPC_M_CONNECT_TO_ME call and this function is called 396 * directly by the server. 393 * @param call Call data of the opening call. If call is NULL, it's 394 * either a callback connection that was opened by 395 * accepting the IPC_M_CONNECT_TO_ME call. 396 * Alternatively, it is zero when we are opening 397 * implicit connection. 397 398 * @param handler Connection handler. 398 399 * @param data Client argument to pass to the connection handler. … … 1746 1747 } 1747 1748 1748 async_sess_t *sess = c alloc(1, sizeof(async_sess_t));1749 async_sess_t *sess = create_session(phandle, mgmt, 0, 0, 0); 1749 1750 if (sess == NULL) { 1750 async_answer_0(&call, ENOMEM); 1751 return NULL; 1752 } 1753 1754 sess->iface = 0; 1755 sess->mgmt = mgmt; 1756 sess->phone = phandle; 1757 1758 fibril_mutex_initialize(&sess->remote_state_mtx); 1759 list_initialize(&sess->exch_list); 1760 fibril_mutex_initialize(&sess->mutex); 1761 1762 /* Acknowledge the connected phone */ 1763 async_answer_0(&call, EOK); 1751 ipc_hangup(phone); 1752 async_answer_0(&call, errno); 1753 } else { 1754 /* Acknowledge the connected phone */ 1755 async_answer_0(&call, EOK); 1756 } 1764 1757 1765 1758 return sess; … … 1788 1781 return NULL; 1789 1782 1790 async_sess_t *sess = calloc(1, sizeof(async_sess_t)); 1791 if (sess == NULL) 1792 return NULL; 1793 1794 sess->iface = 0; 1795 sess->mgmt = mgmt; 1796 sess->phone = phandle; 1797 1798 fibril_mutex_initialize(&sess->remote_state_mtx); 1799 list_initialize(&sess->exch_list); 1800 fibril_mutex_initialize(&sess->mutex); 1801 1802 return sess; 1783 return create_session(phandle, mgmt, 0, 0, 0); 1803 1784 } 1804 1785 -
uspace/lib/c/generic/libc.c
r780c8ce r012dd8e 51 51 #include "private/fibril.h" 52 52 #include "private/malloc.h" 53 #include "private/ns.h" // TODO maybe better filename for session_primary54 53 #include "private/task.h" 54 #include "private/taskman.h" 55 55 56 56 … … 63 63 static bool env_setup; 64 64 static fibril_t main_fibril; 65 66 static void initialize_taskman(pcb_t *pcb) 67 { 68 if (__pcb == NULL) { 69 async_sess_t *session_tm = taskman_connect(); 70 if (session_tm == NULL) { 71 abort(); 72 } 73 __task_init(session_tm); 74 } else { 75 __task_init(__pcb->session_taskman); 76 } 77 } 65 78 66 79 void __libc_main(void *pcb_ptr) … … 107 120 #endif 108 121 109 /* Setup async framework */122 /* Setup async framework and taskman connection */ 110 123 __async_server_init(); 111 if (__pcb == NULL) { 112 __async_client_init(NULL); 113 __task_init(NULL); 114 } else { 115 __async_client_init(__pcb->session_primary); 116 __task_init(__pcb->session_taskman); 117 } 124 __async_client_init(); 118 125 __async_ports_init(); 126 initialize_taskman(__pcb); 119 127 120 128 /* The basic run-time environment is setup */ -
uspace/lib/c/generic/loader.c
r780c8ce r012dd8e 45 45 #include <task.h> 46 46 #include <vfs/vfs.h> 47 47 48 #include "private/loader.h" 49 #include "private/taskman.h" 48 50 49 51 /** Connect to a new program loader. … … 66 68 if (ldr == NULL) 67 69 return NULL; 68 69 async_sess_t *sess = 70 service_connect_blocking(SERVICE_TASKMAN, TASKMAN_CONNECT_TO_LOADER, 0); 70 71 async_sess_t *sess = taskman_session_loader(); 71 72 if (sess == NULL) { 72 73 free(ldr); -
uspace/lib/c/generic/ns.c
r780c8ce r012dd8e 38 38 #include <macros.h> 39 39 #include <errno.h> 40 #include "private/ns.h" 40 41 #include "private/taskman.h" 42 43 static async_sess_t *session_ns = NULL; 44 45 static async_exch_t *ns_exchange_begin(void) 46 { 47 /* Lazily connect to our NS */ 48 if (session_ns == NULL) { 49 session_ns = taskman_session_ns(); 50 } 51 52 async_exch_t *exch = async_exchange_begin(session_ns); 53 return exch; 54 } 55 56 static void ns_exchange_end(async_exch_t *exch) 57 { 58 async_exchange_end(exch); 59 } 41 60 42 61 /* … … 49 68 async_port_handler_t handler, void *data) 50 69 { 51 async_sess_t *sess = get_session_primary();52 if (sess == NULL)53 return EIO;54 55 70 port_id_t port; 56 71 errno_t rc = async_create_port(iface, handler, data, &port); … … 58 73 return rc; 59 74 60 async_exch_t *exch = async_exchange_begin(sess);75 async_exch_t *exch = ns_exchange_begin(); 61 76 62 77 ipc_call_t answer; … … 64 79 rc = async_connect_to_me(exch, iface, service, 0); 65 80 66 async_exchange_end(exch);81 ns_exchange_end(exch); 67 82 68 83 if (rc != EOK) { … … 105 120 async_sess_t *service_connect(service_t service, iface_t iface, sysarg_t arg3) 106 121 { 107 async_sess_t *sess = get_session_primary(); 108 if (sess == NULL) 109 return NULL; 110 111 async_exch_t *exch = async_exchange_begin(sess); 122 async_exch_t *exch = ns_exchange_begin(); 112 123 if (exch == NULL) 113 124 return NULL; 114 125 115 async_sess_t * csess =126 async_sess_t *sess = 116 127 async_connect_me_to(exch, iface, service, arg3); 117 async_exchange_end(exch);128 ns_exchange_end(exch); 118 129 119 if ( csess == NULL)130 if (sess == NULL) 120 131 return NULL; 121 132 … … 125 136 * first argument for non-initial connections. 126 137 */ 127 async_sess_args_set( csess, iface, arg3, 0);138 async_sess_args_set(sess, iface, arg3, 0); 128 139 129 140 return csess; … … 133 144 sysarg_t arg3) 134 145 { 135 async_sess_t *sess = get_session_primary(); 146 async_exch_t *exch = ns_exchange_begin(); 147 async_sess_t *sess = 148 async_connect_me_to_blocking(exch, iface, service, arg3); 149 ns_exchange_end(exch); 150 136 151 if (sess == NULL) 137 return NULL;138 139 async_exch_t *exch = async_exchange_begin(sess);140 async_sess_t *csess =141 async_connect_me_to_blocking(exch, iface, service, arg3);142 async_exchange_end(exch);143 144 if (csess == NULL)145 152 return NULL; 146 153 … … 150 157 * first argument for non-initial connections. 151 158 */ 152 async_sess_args_set( csess, iface, arg3, 0);159 async_sess_args_set(sess, iface, arg3, 0); 153 160 154 return csess;161 return sess; 155 162 } 156 163 157 164 errno_t ns_ping(void) 158 165 { 159 async_sess_t *sess = get_session_primary(); 160 if (sess == NULL) 161 return EIO; 162 163 async_exch_t *exch = async_exchange_begin(sess); 166 async_exch_t *exch = ns_exchange_begin(sess); 164 167 errno_t rc = async_req_0_0(exch, NS_PING); 165 async_exchange_end(exch);168 ns_exchange_end(exch); 166 169 167 170 return rc; 168 171 } 169 172 170 171 async_sess_t *get_session_primary(void)172 {173 async_exch_t *exch;174 175 if (sess_primary == NULL) {176 exch = async_exchange_begin(&session_primary);177 sess_primary = async_connect_me_to(exch, 0, 0, 0);178 async_exchange_end(exch);179 if (sess_primary == NULL)180 return NULL;181 }182 183 return sess_primary;184 }185 186 173 /** @} 187 174 */ -
uspace/lib/c/generic/private/async.h
r780c8ce r012dd8e 96 96 extern void __async_server_init(void); 97 97 extern void __async_server_fini(void); 98 extern void __async_client_init( async_sess_t *);98 extern void __async_client_init(void); 99 99 extern void __async_client_fini(void); 100 100 extern void __async_ports_init(void); … … 106 106 107 107 extern void async_reply_received(ipc_call_t *); 108 extern async_sess_t *create_session(int, exch_mgmt_t, 109 sysarg_t, sysarg_t, sysarg_t); 108 110 109 111 #endif -
uspace/lib/c/generic/private/task.h
r780c8ce r012dd8e 36 36 #define LIBC_PRIVATE_TASK_H_ 37 37 38 #include <async.h>39 40 void __task_init(async_sess_t *);41 42 38 int task_retval_internal(int, bool); 43 44 async_exch_t *taskman_exchange_begin(void);45 46 void taskman_exchange_end(async_exch_t *);47 39 48 40 #endif -
uspace/lib/c/generic/private/taskman.h
r780c8ce r012dd8e 1 1 /* 2 * Copyright (c) 201 1 Martin Decky2 * Copyright (c) 2015 Michal Koutny 3 3 * All rights reserved. 4 4 * … … 33 33 */ 34 34 35 #ifndef _LIBC_PRIVATE_NS_H_36 #define _LIBC_PRIVATE_NS_H_35 #ifndef LIBC_PRIVATE_TASKMAN_H_ 36 #define LIBC_PRIVATE_TASKMAN_H_ 37 37 38 38 #include <async.h> 39 39 40 extern async_sess_t *session_primary; 40 extern async_sess_t *session_taskman; 41 42 void __task_init(async_sess_t *); 43 44 async_exch_t *taskman_exchange_begin(void); 45 void taskman_exchange_end(async_exch_t *); 46 47 extern async_sess_t *taskman_connect(void); 48 extern async_sess_t *taskman_session_ns(void); 49 extern async_sess_t *taskman_session_loader(void); 41 50 42 51 #endif -
uspace/lib/c/generic/task.c
r780c8ce r012dd8e 49 49 #include <str.h> 50 50 #include <task.h> 51 #include <taskman.h> 51 52 #include <vfs/vfs.h> 52 #include "private/ns.h" 53 53 54 #include "private/task.h" 54 55 static async_sess_t *session_taskman = NULL; 55 #include "private/taskman.h" 56 56 57 57 task_id_t task_get_id(void) … … 69 69 } 70 70 71 async_exch_t *taskman_exchange_begin(void)72 {73 /* Lazy connection */74 if (session_taskman == NULL) {75 // TODO unify exchange mgmt with taskman_handshake/__init76 session_taskman = service_connect_blocking(EXCHANGE_SERIALIZE,77 SERVICE_TASKMAN,78 TASKMAN_CONTROL,79 0);80 }81 82 if (session_taskman == NULL) {83 return NULL;84 }85 86 async_exch_t *exch = async_exchange_begin(session_taskman);87 return exch;88 }89 90 void taskman_exchange_end(async_exch_t *exch)91 {92 async_exchange_end(exch);93 }94 95 71 /** Set the task name. 96 72 * … … 129 105 * 130 106 * @return EOK on success, else error code. 131 * @return TODO check this doesn't return EINVAL -- clash with task_wait132 107 */ 133 108 static errno_t task_setup_wait(task_id_t id, task_wait_t *wait) … … 393 368 * (it can be reused, but must be reinitialized with task_setup_wait first) 394 369 * 395 * @param wait task_wait_t previously initialized by task_setup_wait. 396 * @param texit Store type of task exit here. 397 * @param retval Store return value of the task here. 370 * @param[in/out] wait task_wait_t previously initialized by task_setup_wait 371 * or returned by task_wait with non-zero flags. the 372 * flags are updated so that they represent what can be 373 * still waited for. 374 * @param[out] texit Store type of task exit here. 375 * @param[out] retval Store return value of the task here. 398 376 * 399 377 * @return EOK on success 400 * @return EIN VAL on lost wait TODO other error codes378 * @return EINTR on lost wait 401 379 */ 402 380 errno_t task_wait(task_wait_t *wait, task_exit_t *texit, int *retval) … … 405 383 async_wait_for(wait->aid, &rc); 406 384 407 if (rc == EOK || rc == EIN VAL) {385 if (rc == EOK || rc == EINTR) { 408 386 if (wait->flags & TASK_WAIT_EXIT && texit) 409 387 *texit = ipc_get_arg1(wait->result); … … 471 449 } 472 450 473 void __task_init(async_sess_t *sess)474 {475 assert(session_taskman == NULL);476 session_taskman = sess;477 }478 479 451 /** @} 480 452 */ -
uspace/lib/c/generic/task_event.c
r780c8ce r012dd8e 38 38 #include <task.h> 39 39 40 #include "private/task .h"40 #include "private/taskman.h" 41 41 42 42 static task_event_handler_t task_event_handler = NULL; … … 65 65 66 66 if (!IPC_GET_IMETHOD(call)) { 67 /* Hangup, TODO explain or handle differntly*/67 /* Hangup, end of game */ 68 68 break; 69 69 } -
uspace/lib/c/generic/taskman.c
r780c8ce r012dd8e 33 33 */ 34 34 35 36 #include <async.h> 35 37 #include <errno.h> 38 #include <ipc/common.h> 36 39 #include <ipc/taskman.h> 40 #include <task.h> 37 41 #include <taskman.h> 38 42 39 #include <stdio.h> 43 #include "private/async.h" 44 #include "private/taskman.h" 40 45 41 //TODO better filename? 42 #include "private/ns.h" 46 async_sess_t *session_taskman = NULL; 43 47 44 static int taskman_ask_callback(async_sess_t *session_tm)48 void __task_init(async_sess_t *sess) 45 49 { 46 async_exch_t *exch = async_exchange_begin(session_tm); 50 assert(session_taskman == NULL); 51 session_taskman = sess; 52 } 53 54 async_exch_t *taskman_exchange_begin(void) 55 { 56 assert(session_taskman); 57 58 async_exch_t *exch = async_exchange_begin(session_taskman); 59 return exch; 60 } 61 62 void taskman_exchange_end(async_exch_t *exch) 63 { 64 async_exchange_end(exch); 65 } 66 67 /** Wrap PHONE_INITIAL with session and introduce to taskman 68 */ 69 async_sess_t *taskman_connect(void) 70 { 71 /* 72 * EXCHANGE_ATOMIC would require single calls only, 73 * EXCHANGE_PARALLEL not sure about implementation via multiple phones, 74 * >EXCHANGE_SERIALIZE perhaphs no harm, except the client serialization 75 */ 76 const exch_mgmt_t mgmt = EXCHANGE_SERIALIZE; 77 async_sess_t *sess = create_session(PHONE_INITIAL, mgmt, 0, 0, 0); 78 79 if (sess != NULL) { 80 /* Introduce ourselves and ignore answer */ 81 async_exch_t *exch = async_exchange_begin(sess); 82 aid_t req = async_send_0(exch, TASKMAN_NEW_TASK, NULL); 83 async_exchange_end(exch); 84 85 if (req) { 86 async_forget(req); 87 } 88 } 89 90 return sess; 91 } 92 93 /** Ask taskman to pass/share its NS */ 94 async_sess_t *taskman_session_ns(void) 95 { 96 assert(session_taskman); 97 98 async_exch_t *exch = async_exchange_begin(session_taskman); 99 assert(exch); 100 101 async_sess_t *sess = async_connect_me_to(EXCHANGE_ATOMIC, 102 exch, TASKMAN_CONNECT_TO_NS, 0, 0); 103 async_exchange_end(exch); 104 105 return sess; 106 } 107 108 /** Ask taskman to connect to (a new) loader instance */ 109 async_sess_t *taskman_session_loader(void) 110 { 111 assert(session_taskman); 112 113 async_exch_t *exch = async_exchange_begin(session_taskman); 114 async_sess_t *sess = async_connect_me_to(EXCHANGE_SERIALIZE, 115 exch, TASKMAN_CONNECT_TO_LOADER, 0, 0); 116 async_exchange_end(exch); 117 118 return sess; 119 } 120 121 /** Introduce as loader to taskman 122 * 123 * @return EOK on success, otherwise propagated error code 124 */ 125 int taskman_intro_loader(void) 126 { 127 assert(session_taskman); 128 129 async_exch_t *exch = async_exchange_begin(session_taskman); 47 130 int rc = async_connect_to_me( 48 131 exch, TASKMAN_LOADER_CALLBACK, 0, 0, NULL, NULL); … … 52 135 } 53 136 54 static async_sess_t *taskman_connect_to_ns(async_sess_t *session_tm) 137 /** Tell taskman we are his NS 138 * 139 * @return EOK on success, otherwise propagated error code 140 */ 141 int taskman_intro_ns(void) 55 142 { 56 async_exch_t *exch = async_exchange_begin(session_tm); 57 async_sess_t *session_ns = async_connect_me_to(EXCHANGE_ATOMIC, 58 exch, TASKMAN_LOADER_TO_NS, 0, 0); 59 async_exchange_end(exch); 143 assert(session_taskman); 60 144 61 return session_ns; 145 async_exch_t *exch = async_exchange_begin(session_taskman); 146 aid_t req = async_send_0(exch, TASKMAN_I_AM_NS, NULL); 147 148 int rc = async_connect_to_me(exch, 0, 0, 0, NULL, NULL); 149 taskman_exchange_end(exch); 150 151 if (rc != EOK) { 152 return rc; 153 } 154 155 sysarg_t retval; 156 async_wait_for(req, &retval); 157 return retval; 62 158 } 63 159 64 /** Set up phones upon being spawned by taskman 65 * 66 * Assumes primary session exists that is connected to taskman. 67 * After handshake, taskman is connected to us (see, it's opposite) and broker 68 * session is set up according to taskman. 69 * 70 * 71 * @return Session to broker (naming service) or NULL (sets errno). 72 */ 73 async_sess_t *taskman_handshake(void) 160 async_sess_t *taskman_get_session(void) 74 161 { 75 int rc = taskman_ask_callback(session_primary); 76 if (rc != EOK) { 77 errno = rc; 78 return NULL; 79 } 162 return session_taskman; 163 } 80 164 81 async_sess_t *session_ns = taskman_connect_to_ns(session_primary);82 if (session_ns == NULL) {83 errno = ENOENT;84 }85 165 86 return session_ns;87 }88 166 89 167 /** @} -
uspace/lib/c/include/async.h
r780c8ce r012dd8e 276 276 extern sysarg_t async_get_label(void); 277 277 278 extern async_sess_t *async_session_primary_swap(async_sess_t *);279 278 extern async_sess_t *async_connect_me_to(async_exch_t *, iface_t, sysarg_t, 280 279 sysarg_t); -
uspace/lib/c/include/ipc/common.h
r780c8ce r012dd8e 39 39 #include <abi/ipc/ipc.h> 40 40 41 /* Well known phone descriptors */ 42 #define PHONE_INITIAL 0 43 41 44 #define IPC_FLAG_BLOCKING 0x01 42 45 // TODO autostart flag may be united with blocking, this should be later made -
uspace/lib/c/include/ipc/services.h
r780c8ce r012dd8e 46 46 SERVICE_LOC = FOURCC('l', 'o', 'c', ' '), 47 47 SERVICE_SYSMAN = FOURCC('s', 'y', 's', 'm'), 48 SERVICE_TASKMAN = FOURCC('t', 's', 'k', 'm'),49 48 SERVICE_LOGGER = FOURCC('l', 'o', 'g', 'g'), 50 49 SERVICE_DEVMAN = FOURCC('d', 'e', 'v', 'n'), -
uspace/lib/c/include/ipc/taskman.h
r780c8ce r012dd8e 42 42 TASKMAN_WAIT = IPC_FIRST_USER_METHOD, 43 43 TASKMAN_RETVAL, 44 TASKMAN_EVENT_CALLBACK 44 TASKMAN_EVENT_CALLBACK, 45 TASKMAN_NEW_TASK, 46 TASKMAN_I_AM_NS 45 47 } taskman_request_t; 46 48 … … 50 52 51 53 typedef enum { 52 TASKMAN_CONNECT_TO_LOADER = 0, 53 TASKMAN_LOADER_TO_NS, 54 TASKMAN_LOADER_CALLBACK, 55 TASKMAN_CONTROL 56 } taskman_interface_t; 54 TASKMAN_CONNECT_TO_NS = 0, 55 TASKMAN_CONNECT_TO_LOADER, 56 TASKMAN_LOADER_CALLBACK 57 } taskman_connect_t; 57 58 58 59 #endif -
uspace/lib/c/include/loader/pcb.h
r780c8ce r012dd8e 61 61 entry_point_t entry; 62 62 63 /** Primary session to broker. */64 async_sess_t *session_primary;65 66 63 /** Session to taskman (typically spawn parent) */ 67 64 async_sess_t *session_taskman; -
uspace/lib/c/include/ns.h
r780c8ce r012dd8e 49 49 extern async_sess_t *ns_session_get(void); 50 50 51 extern async_sess_t *ns_get_session(void); 52 51 53 #endif 52 54 -
uspace/lib/c/include/task.h
r780c8ce r012dd8e 76 76 extern errno_t task_retval(int); 77 77 78 /* Implemented in task_event. h*/78 /* Implemented in task_event.c */ 79 79 extern int task_register_event_handler(task_event_handler_t); 80 80 -
uspace/lib/c/include/taskman.h
r780c8ce r012dd8e 36 36 #define LIBC_TASKMAN_H_ 37 37 38 #ifndef TASKMAN_DISABLE_ASYNC 38 39 #include <async.h> 40 #endif 39 41 40 extern async_sess_t *taskman_handshake(void); 42 /* Internal functions to be used by loader only */ 43 #ifndef TASKMAN_DISABLE_ASYNC 44 extern async_sess_t *taskman_get_session(void); 45 #endif 46 extern int taskman_intro_loader(void); 47 48 /* Internal functions to be used by NS only */ 49 extern int taskman_intro_ns(void); 41 50 42 51 #endif -
uspace/srv/loader/main.c
r780c8ce r012dd8e 35 35 * The program loader is a special init binary. Its image is used 36 36 * to create a new task upon a @c task_spawn syscall. It has a phone connected 37 * to the caller of t e syscall. The formal caller (taskman) performs a37 * to the caller of the syscall. The formal caller (taskman) performs a 38 38 * handshake with loader so that apparent caller can communicate with the 39 39 * loader. … … 60 60 #include <ipc/loader.h> 61 61 #include <loader/pcb.h> 62 #include <ns.h> 62 63 #include <str.h> 63 64 #include <sys/types.h> 65 #include <task.h> 64 66 #include <taskman.h> 65 67 #include <unistd.h> … … 72 74 #endif 73 75 76 #define NAME "loader" 74 77 #define DPRINTF(...) ((void) 0) 75 78 … … 80 83 /** The Program control block */ 81 84 static pcb_t pcb; 82 83 /** Primary IPC session */84 static async_sess_t *session_primary = NULL;85 86 /** Session to taskman (typically our spawner) */87 static async_sess_t *session_taskman = NULL;88 85 89 86 /** Current working directory */ … … 105 102 /** Used to limit number of connections to one. */ 106 103 static bool connected = false; 107 108 /** Ensure synchronization of handshake and connection fibrils. */109 static bool handshake_complete = false;110 FIBRIL_MUTEX_INITIALIZE(handshake_mtx);111 FIBRIL_CONDVAR_INITIALIZE(handshake_cv);112 104 113 105 static void ldr_get_taskid(ipc_call_t *req) … … 337 329 DPRINTF("PCB set.\n"); 338 330 339 pcb.session_primary = session_primary; 340 pcb.session_taskman = session_taskman; 331 pcb.session_taskman = taskman_get_session(); 341 332 342 333 pcb.cwd = cwd; … … 394 385 static void ldr_connection(ipc_call_t *icall, void *arg) 395 386 { 396 /* Wait for handshake */397 fibril_mutex_lock(&handshake_mtx);398 while (!handshake_complete) {399 fibril_condvar_wait(&handshake_cv, &handshake_mtx);400 }401 fibril_mutex_unlock(&handshake_mtx);402 403 387 /* Already have a connection? */ 404 388 if (connected) { … … 456 440 } 457 441 458 /** Handshake with taskman459 *460 * Taskman is our spawn parent, i.e. PHONE_INITIAL is connected to it.461 * Goal of the handshake is to obtain phone to naming service and also keep the462 * session to taskman.463 *464 * @return EOK on success, for errors see taskman_handshake()465 */466 static errno_t ldr_taskman_handshake(void)467 {468 assert(session_primary == NULL);469 assert(session_taskman == NULL);470 471 errno_t retval = EOK;472 473 fibril_mutex_lock(&handshake_mtx);474 session_primary = taskman_handshake();475 if (session_primary == NULL) {476 retval = errno;477 goto finish;478 }479 480 session_taskman = async_session_primary_swap(session_primary);481 482 handshake_complete = true;483 484 finish:485 fibril_condvar_signal(&handshake_cv);486 fibril_mutex_unlock(&handshake_mtx);487 488 return retval;489 }490 491 442 /** Program loader main function. 492 443 */ … … 496 447 async_set_fallback_port_handler(ldr_connection, NULL); 497 448 498 /* Handshake with taskman */ 499 int rc = ldr_taskman_handshake(); 500 if (rc != EOK) { 501 DPRINTF("Failed taskman handshake (%i).\n", errno); 449 /* Announce to taskman. */ 450 errno_t rc = taskman_intro_loader(); 451 if (rc != EOK) { 452 printf("%s: did not receive connectin from taskman (%i)\n", 453 NAME, rc); 502 454 return rc; 503 455 } 504 456 505 /* Handle client connections */ 457 /* 458 * We are not a regular server, thus no retval is set, just wait for 459 * forwarded connections by taskman. 460 */ 506 461 async_manager(); 507 //TODO retval?508 462 509 463 /* Never reached */ -
uspace/srv/ns/ns.c
r780c8ce r012dd8e 1 1 /* 2 2 * Copyright (c) 2006 Ondrej Palkovsky 3 * Copyright (c) 2015 Michal Koutny 3 4 * All rights reserved. 4 5 * … … 43 44 #include <stdio.h> 44 45 #include <errno.h> 46 #define TASKMAN_DISABLE_ASYNC 47 #include <taskman.h> 48 #undef TASKMAN_DISABLE_ASYNC 49 45 50 #include "ns.h" 46 51 #include "service.h" … … 115 120 if (rc != EOK) 116 121 return rc; 122 123 rc = taskman_intro_ns(); 124 if (rc != EOK) { 125 printf("%s: not accepted by taskman (%i)\n", NAME, rc); 126 return rc; 127 } 117 128 118 129 async_set_fallback_port_handler(ns_connection, NULL); -
uspace/srv/sysman/main.c
r780c8ce r012dd8e 229 229 fibril_add_ready(event_loop_fibril); 230 230 231 sysman_log(LVL_DEBUG, "Debugging pause...\n"); 232 async_usleep(10 * 1000000); 231 233 /* Queue first job from sequence */ 232 234 prepare_and_run_job(&target_sequence[0]); -
uspace/srv/taskman/event.c
r780c8ce r012dd8e 137 137 /* Nothing to wait for anymore */ 138 138 if (answer) { 139 async_answer_0(pr->callid, EIN VAL);139 async_answer_0(pr->callid, EINTR); 140 140 } 141 141 } else { … … 145 145 } else if (answer) { 146 146 if ((pr->flags & TASK_WAIT_BOTH) && match == TASK_WAIT_EXIT) { 147 async_answer_1(pr->callid, EINVAL, t->exit); 147 /* No sense to wait for both anymore */ 148 async_answer_1(pr->callid, EINTR, t->exit); 148 149 } else { 149 150 /* Send both exit status and retval, caller … … 253 254 pr->callid = callid; 254 255 } 255 // TODO remove printf("%s: %llu: %x, %x, %i\n", __func__, pr->id, flags, pr->flags, reuse);256 256 257 257 finish: -
uspace/srv/taskman/main.c
r780c8ce r012dd8e 41 41 #include <async.h> 42 42 #include <errno.h> 43 #include <fibril_synch.h> 43 44 #include <ipc/services.h> 44 45 #include <ipc/taskman.h> … … 53 54 #include "taskman.h" 54 55 55 // TODO move to appropriate header file56 extern async_sess_t *session_primary; 56 //#define DPRINTF(...) printf(__VA_ARGS__) 57 #define DPRINTF(...) /* empty */ 57 58 58 59 typedef struct { … … 63 64 static prodcons_t sess_queue; 64 65 66 /** We keep session to NS on our own in taskman */ 67 static async_sess_t *session_ns = NULL; 68 69 static FIBRIL_MUTEX_INITIALIZE(session_ns_mtx); 70 static FIBRIL_CONDVAR_INITIALIZE(session_ns_cv); 65 71 66 72 /* … … 69 75 static void connect_to_loader(ipc_callid_t iid, ipc_call_t *icall) 70 76 { 77 DPRINTF("%s:%i from %llu\n", __func__, __LINE__, icall->in_task_id); 71 78 /* We don't accept the connection request, we forward it instead to 72 79 * freshly spawned loader. */ … … 74 81 75 82 if (rc != EOK) { 76 printf(NAME ": %s -> %i\n", __func__, rc);77 83 async_answer_0(iid, rc); 78 84 return; … … 91 97 async_exchange_end(exch); 92 98 93 /* After forward we can dispose all session-related resources 94 * TODO later could be recycled for notification API 95 */ 99 /* After forward we can dispose all session-related resources */ 96 100 async_hangup(sess_ref->sess); 97 101 free(sess_ref); … … 105 109 } 106 110 107 static void loader_to_ns(ipc_callid_t iid, ipc_call_t *icall) 108 { 109 /* Do no accept connection request, forward it instead. */ 110 async_exch_t *exch = async_exchange_begin(session_primary); 111 static void connect_to_ns(ipc_callid_t iid, ipc_call_t *icall) 112 { 113 DPRINTF("%s, %llu\n", __func__, icall->in_task_id); 114 115 /* Wait until we know NS */ 116 fibril_mutex_lock(&session_ns_mtx); 117 while (session_ns == NULL) { 118 fibril_condvar_wait(&session_ns_cv, &session_ns_mtx); 119 } 120 fibril_mutex_unlock(&session_ns_mtx); 121 122 /* Do not accept connection, forward it */ 123 async_exch_t *exch = async_exchange_begin(session_ns); 111 124 int rc = async_forward_fast(iid, exch, 0, 0, 0, IPC_FF_NONE); 112 125 async_exchange_end(exch); … … 116 129 return; 117 130 } 131 } 132 133 static void taskman_new_task(ipc_callid_t iid, ipc_call_t *icall) 134 { 135 int rc = task_intro(icall->in_task_id); 136 async_answer_0(iid, rc); 137 } 138 139 static void taskman_i_am_ns(ipc_callid_t iid, ipc_call_t *icall) 140 { 141 DPRINTF("%s, %llu\n", __func__, icall->in_task_id); 142 int rc = EOK; 143 144 fibril_mutex_lock(&session_ns_mtx); 145 if (session_ns != NULL) { 146 rc = EEXISTS; 147 goto finish; 148 } 149 150 /* Used only for connection forwarding -- atomic */ 151 session_ns = async_callback_receive(EXCHANGE_ATOMIC); 152 153 if (session_ns == NULL) { 154 rc = ENOENT; 155 printf("%s: Cannot connect to NS\n", NAME); 156 } 157 158 fibril_condvar_signal(&session_ns_cv); 159 finish: 160 fibril_mutex_unlock(&session_ns_mtx); 161 async_answer_0(iid, rc); 118 162 } 119 163 … … 130 174 static void taskman_ctl_retval(ipc_callid_t iid, ipc_call_t *icall) 131 175 { 132 printf("%s:%i from %llu\n", __func__, __LINE__, icall->in_task_id);133 176 task_id_t sender = icall->in_task_id; 134 177 int retval = IPC_GET_ARG1(*icall); 135 178 bool wait_for_exit = IPC_GET_ARG2(*icall); 136 179 180 DPRINTF("%s:%i from %llu/%i\n", __func__, __LINE__, sender, retval); 181 137 182 int rc = task_set_retval(sender, retval, wait_for_exit); 138 183 async_answer_0(iid, rc); … … 141 186 static void taskman_ctl_ev_callback(ipc_callid_t iid, ipc_call_t *icall) 142 187 { 143 printf("%s:%i from %llu\n", __func__, __LINE__, icall->in_task_id); 188 DPRINTF("%s:%i from %llu\n", __func__, __LINE__, icall->in_task_id); 189 144 190 /* Atomic -- will be used for notifications only */ 145 191 async_sess_t *sess = async_callback_receive(EXCHANGE_ATOMIC); … … 157 203 task_id_t id = MERGE_LOUP32(IPC_GET_ARG1(*icall), IPC_GET_ARG2(*icall)); 158 204 exit_reason_t exit_reason = IPC_GET_ARG3(*icall); 159 printf("%s:%i from %llu/%i\n", __func__, __LINE__, id, exit_reason);205 DPRINTF("%s:%i from %llu/%i\n", __func__, __LINE__, id, exit_reason); 160 206 task_terminated(id, exit_reason); 161 207 } … … 164 210 { 165 211 task_id_t id = MERGE_LOUP32(IPC_GET_ARG1(*icall), IPC_GET_ARG2(*icall)); 166 printf("%s:%i from %llu\n", __func__, __LINE__, id);212 DPRINTF("%s:%i from %llu\n", __func__, __LINE__, id); 167 213 task_failed(id); 168 214 } 169 215 170 static void control_connection_loop(void)171 {172 while (true) {173 ipc_call_t call;174 ipc_callid_t callid = async_get_call(&call);175 176 if (!IPC_GET_IMETHOD(call)) {177 /* Client disconnected */178 break;179 }180 181 switch (IPC_GET_IMETHOD(call)) {182 case TASKMAN_WAIT:183 taskman_ctl_wait(callid, &call);184 break;185 case TASKMAN_RETVAL:186 taskman_ctl_retval(callid, &call);187 break;188 case TASKMAN_EVENT_CALLBACK:189 taskman_ctl_ev_callback(callid, &call);190 break;191 default:192 async_answer_0(callid, ENOENT);193 }194 }195 }196 197 static void control_connection(ipc_callid_t iid, ipc_call_t *icall)198 {199 /* TODO remove/redesign the workaround200 * Call task_intro here for boot-time tasks,201 * probably they should announce themselves explicitly202 * or taskman should detect them from kernel's list of tasks.203 */204 int rc = task_intro(icall, false);205 206 /* First, accept connection */207 async_answer_0(iid, rc);208 209 if (rc != EOK) {210 return;211 }212 213 control_connection_loop();214 }215 216 216 static void loader_callback(ipc_callid_t iid, ipc_call_t *icall) 217 217 { 218 DPRINTF("%s:%i from %llu\n", __func__, __LINE__, icall->in_task_id); 218 219 // TODO check that loader is expected, would probably discard prodcons 219 220 // scheme … … 232 233 } 233 234 234 /* Remember task_id */235 int rc = task_intro(icall, true);236 237 if (rc != EOK) {238 async_answer_0(iid, rc);239 free(sess_ref);240 return;241 }242 235 async_answer_0(iid, EOK); 243 236 … … 247 240 } 248 241 242 static bool handle_call(ipc_callid_t iid, ipc_call_t *icall) 243 { 244 switch (IPC_GET_IMETHOD(*icall)) { 245 case TASKMAN_NEW_TASK: 246 taskman_new_task(iid, icall); 247 break; 248 case TASKMAN_I_AM_NS: 249 taskman_i_am_ns(iid, icall); 250 break; 251 case TASKMAN_WAIT: 252 taskman_ctl_wait(iid, icall); 253 break; 254 case TASKMAN_RETVAL: 255 taskman_ctl_retval(iid, icall); 256 break; 257 case TASKMAN_EVENT_CALLBACK: 258 taskman_ctl_ev_callback(iid, icall); 259 break; 260 default: 261 return false; 262 } 263 return true; 264 } 265 266 static bool handle_implicit_call(ipc_callid_t iid, ipc_call_t *icall) 267 { 268 DPRINTF("%s:%i %i(%i) from %llu\n", __func__, __LINE__, 269 IPC_GET_IMETHOD(*icall), 270 IPC_GET_ARG1(*icall), 271 icall->in_task_id); 272 273 if (IPC_GET_IMETHOD(*icall) < IPC_FIRST_USER_METHOD) { 274 switch (IPC_GET_ARG1(*icall)) { 275 case TASKMAN_CONNECT_TO_NS: 276 connect_to_ns(iid, icall); 277 break; 278 case TASKMAN_CONNECT_TO_LOADER: 279 connect_to_loader(iid, icall); 280 break; 281 case TASKMAN_LOADER_CALLBACK: 282 loader_callback(iid, icall); 283 break; 284 default: 285 return false; 286 287 } 288 } else { 289 return handle_call(iid, icall); 290 } 291 292 return true; 293 } 294 295 static void implicit_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 296 { 297 if (!handle_implicit_call(iid, icall)) { 298 async_answer_0(iid, ENOTSUP); 299 return; 300 } 301 302 while (true) { 303 ipc_call_t call; 304 ipc_callid_t callid = async_get_call(&call); 305 306 if (!IPC_GET_IMETHOD(call)) { 307 /* Client disconnected */ 308 break; 309 } 310 311 if (!handle_implicit_call(callid, &call)) { 312 async_answer_0(callid, ENOTSUP); 313 break; 314 } 315 } 316 } 317 249 318 static void taskman_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 250 319 { 251 taskman_interface_t iface = IPC_GET_ARG1(*icall); 252 switch (iface) { 253 case TASKMAN_CONNECT_TO_LOADER: 254 connect_to_loader(iid, icall); 255 break; 256 case TASKMAN_LOADER_TO_NS: 257 loader_to_ns(iid, icall); 258 break; 259 case TASKMAN_CONTROL: 260 control_connection(iid, icall); 261 break; 262 default: 263 /* Unknown interface */ 264 async_answer_0(iid, ENOENT); 265 } 266 } 267 268 static void implicit_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 269 { 270 taskman_interface_t iface = IPC_GET_ARG1(*icall); 271 switch (iface) { 272 case TASKMAN_LOADER_CALLBACK: 273 loader_callback(iid, icall); 274 control_connection_loop(); 275 break; 276 default: 277 /* Unknown interface on implicit connection */ 320 /* 321 * We don't expect (yet) clients to connect, having this function is 322 * just to adapt to async framework that creates new connection for 323 * each IPC_M_CONNECT_ME_TO. 324 * In this case those are to be forwarded, so don't continue 325 * "listening" on such connections. 326 */ 327 if (!handle_implicit_call(iid, icall)) { 328 /* If cannot handle connection requst, give up trying */ 278 329 async_answer_0(iid, EHANGUP); 279 } 280 } 330 return; 331 } 332 } 333 281 334 282 335 … … 298 351 rc = async_event_subscribe(EVENT_EXIT, task_exit_event, NULL); 299 352 if (rc != EOK) { 300 printf( "Cannot register for exit events (%i).\n", rc);353 printf(NAME ": Cannot register for exit events (%i).\n", rc); 301 354 return rc; 302 355 } … … 304 357 rc = async_event_subscribe(EVENT_FAULT, task_fault_event, NULL); 305 358 if (rc != EOK) { 306 printf( "Cannot register for fault events (%i).\n", rc);359 printf(NAME ": Cannot register for fault events (%i).\n", rc); 307 360 return rc; 308 361 } 309 310 /* We're service too */ 311 rc = service_register(SERVICE_TASKMAN); 312 if (rc != EOK) { 313 printf("Cannot register at naming service (%i).\n", rc); 314 return rc; 362 363 task_id_t self_id = task_get_id(); 364 rc = task_intro(self_id); 365 if (rc != EOK) { 366 printf(NAME ": Cannot register self as task (%i).\n", rc); 315 367 } 316 368 317 369 /* Start sysman server */ 370 async_set_implicit_connection(implicit_connection); 318 371 async_set_client_connection(taskman_connection); 319 async_set_implicit_connection(implicit_connection);320 372 321 373 printf(NAME ": Accepting connections\n"); 322 //TODO task_retval(EOK);374 (void)task_set_retval(self_id, EOK, false); 323 375 async_manager(); 324 376 -
uspace/srv/taskman/task.c
r780c8ce r012dd8e 109 109 } 110 110 111 int task_intro( ipc_call_t *call, bool check_unique)111 int task_intro(task_id_t id) 112 112 { 113 113 int rc = EOK; … … 115 115 fibril_rwlock_write_lock(&task_hash_table_lock); 116 116 117 task_t *t = task_get_by_id( call->in_task_id);117 task_t *t = task_get_by_id(id); 118 118 if (t != NULL) { 119 119 rc = EEXISTS; … … 130 130 * Insert into the main table. 131 131 */ 132 t->id = call->in_task_id;132 t->id = id; 133 133 t->exit = TASK_EXIT_RUNNING; 134 134 t->failed = false; -
uspace/srv/taskman/task.h
r780c8ce r012dd8e 70 70 extern task_t *task_get_by_id(task_id_t); 71 71 72 extern int task_intro( ipc_call_t *, bool);72 extern int task_intro(task_id_t); 73 73 74 74 #endif
Note:
See TracChangeset
for help on using the changeset viewer.