Changeset b5e68c8 in mainline for uspace/lib/c/generic/task.c
- Timestamp:
- 2011-05-12T16:49:44Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f36787d7
- Parents:
- e80329d6 (diff), 750636a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/task.c
re80329d6 rb5e68c8 39 39 #include <errno.h> 40 40 #include <loader/loader.h> 41 #include <stdarg.h> 41 42 #include <str.h> 42 43 #include <ipc/ns.h> … … 46 47 task_id_t task_get_id(void) 47 48 { 49 #ifdef __32_BITS__ 48 50 task_id_t task_id; 49 51 (void) __SYSCALL1(SYS_TASK_GET_ID, (sysarg_t) &task_id); 50 52 51 53 return task_id; 54 #endif /* __32_BITS__ */ 55 56 #ifdef __64_BITS__ 57 return (task_id_t) __SYSCALL0(SYS_TASK_GET_ID); 58 #endif /* __64_BITS__ */ 52 59 } 53 60 … … 58 65 * 59 66 * @return Zero on success or negative error code. 60 *61 67 */ 62 68 int task_set_name(const char *name) … … 65 71 } 66 72 73 /** Kill a task. 74 * 75 * @param task_id ID of task to kill. 76 * 77 * @return Zero on success or negative error code. 78 */ 79 80 int task_kill(task_id_t task_id) 81 { 82 return (int) __SYSCALL1(SYS_TASK_KILL, (sysarg_t) &task_id); 83 } 84 67 85 /** Create a new task by running an executable from the filesystem. 68 86 * 69 87 * This is really just a convenience wrapper over the more complicated 70 * loader API. 71 * 72 * @param path Pathname of the binary to execute. 73 * @param argv Command-line arguments. 74 * @param err If not NULL, the error value is stored here. 75 * 76 * @return ID of the newly created task or zero on error. 77 * 78 */ 79 task_id_t task_spawn(const char *path, const char *const args[], int *err) 80 { 88 * loader API. Arguments are passed as a null-terminated array of strings. 89 * 90 * @param id If not NULL, the ID of the task is stored here on success. 91 * @param path Pathname of the binary to execute. 92 * @param argv Command-line arguments. 93 * 94 * @return Zero on success or negative error code. 95 */ 96 int task_spawnv(task_id_t *id, const char *path, const char *const args[]) 97 { 98 loader_t *ldr; 99 task_id_t task_id; 100 int rc; 101 81 102 /* Connect to a program loader. */ 82 loader_t *ldr = loader_connect(); 83 if (ldr == NULL) { 84 if (err != NULL) 85 *err = EREFUSED; 86 87 return 0; 88 } 103 ldr = loader_connect(); 104 if (ldr == NULL) 105 return EREFUSED; 89 106 90 107 /* Get task ID. */ 91 task_id_t task_id; 92 int rc = loader_get_task_id(ldr, &task_id); 108 rc = loader_get_task_id(ldr, &task_id); 93 109 if (rc != EOK) 94 110 goto error; … … 149 165 free(ldr); 150 166 151 if ( err!= NULL)152 * err = EOK;153 154 return task_id;167 if (id != NULL) 168 *id = task_id; 169 170 return EOK; 155 171 156 172 error: … … 158 174 loader_abort(ldr); 159 175 free(ldr); 160 161 if (err != NULL) 162 *err = rc; 163 164 return 0; 176 return rc; 177 } 178 179 /** Create a new task by running an executable from the filesystem. 180 * 181 * This is really just a convenience wrapper over the more complicated 182 * loader API. Arguments are passed as a null-terminated list of arguments. 183 * 184 * @param id If not NULL, the ID of the task is stored here on success. 185 * @param path Pathname of the binary to execute. 186 * @param ... Command-line arguments. 187 * 188 * @return Zero on success or negative error code. 189 */ 190 int task_spawnl(task_id_t *task_id, const char *path, ...) 191 { 192 va_list ap; 193 int rc, cnt; 194 const char *arg; 195 const char **arglist; 196 197 /* Count the number of arguments. */ 198 cnt = 0; 199 va_start(ap, path); 200 do { 201 arg = va_arg(ap, const char *); 202 cnt++; 203 } while (arg != NULL); 204 va_end(ap); 205 206 /* Allocate argument list. */ 207 arglist = malloc(cnt * sizeof(const char *)); 208 if (arglist == NULL) 209 return ENOMEM; 210 211 /* Fill in arguments. */ 212 cnt = 0; 213 va_start(ap, path); 214 do { 215 arg = va_arg(ap, const char *); 216 arglist[cnt++] = arg; 217 } while (arg != NULL); 218 va_end(ap); 219 220 /* Spawn task. */ 221 rc = task_spawnv(task_id, path, arglist); 222 223 /* Free argument list. */ 224 free(arglist); 225 return rc; 165 226 } 166 227 167 228 int task_wait(task_id_t id, task_exit_t *texit, int *retval) 168 229 { 169 ipcarg_t te, rv;230 sysarg_t te, rv; 170 231 int rc; 171 232
Note:
See TracChangeset
for help on using the changeset viewer.