1 #include "rust_internal.h"
5 command_line_args : public kernel_owned<command_line_args>
12 // [str] passed to rust_task::start.
15 command_line_args(rust_task *task,
18 : kernel(task->kernel),
23 #if defined(__WIN32__)
24 LPCWSTR cmdline = GetCommandLineW();
25 LPWSTR *wargv = CommandLineToArgvW(cmdline, &argc);
26 kernel->win32_require("CommandLineToArgvW", wargv != NULL);
27 argv = (char **) kernel->malloc(sizeof(char*) * argc,
28 "win32 command line");
29 for (int i = 0; i < argc; ++i) {
30 int n_chars = WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1,
32 kernel->win32_require("WideCharToMultiByte(0)", n_chars != 0);
33 argv[i] = (char *) kernel->malloc(n_chars,
34 "win32 command line arg");
35 n_chars = WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1,
36 argv[i], n_chars, NULL, NULL);
37 kernel->win32_require("WideCharToMultiByte(1)", n_chars != 0);
43 kernel->malloc(vec_size<rust_vec*>(argc),
44 "command line arg interior");
45 args->fill = args->alloc = sizeof(rust_vec*) * argc;
46 for (int i = 0; i < argc; ++i) {
47 rust_str *str = make_str(kernel, argv[i],
50 ((rust_str**)&args->data)[i] = str;
54 ~command_line_args() {
55 for (int i = 0; i < argc; ++i) {
56 rust_vec *s = ((rust_vec**)&args->data)[i];
62 for (int i = 0; i < argc; ++i) {
63 kernel->free(argv[i]);
71 * Main entry point into the Rust runtime. Here we create a Rust service,
72 * initialize the kernel, create the root domain and run it.
78 rust_start(uintptr_t main_fn, int argc, char **argv, void* crate_map) {
80 rust_env *env = load_env();
82 update_log_settings(crate_map, env->logspec);
83 check_claims = env->check_claims;
85 rust_srv *srv = new rust_srv(env);
86 rust_kernel *kernel = new rust_kernel(srv, env->num_sched_threads);
87 rust_task_id root_id = kernel->create_task(NULL, "main");
88 rust_task *root_task = kernel->get_task_by_id(root_id);
89 I(kernel, root_task != NULL);
90 rust_scheduler *sched = root_task->sched;
91 command_line_args *args
92 = new (kernel, "main command line args")
93 command_line_args(root_task, argc, argv);
95 DLOG(sched, dom, "startup: %d args in 0x%" PRIxPTR,
96 args->argc, (uintptr_t)args->args);
97 for (int i = 0; i < args->argc; i++) {
98 DLOG(sched, dom, "startup: arg[%d] = '%s'", i, args->argv[i]);
101 root_task->start((spawn_fn)main_fn, (uintptr_t)args->args);
105 int ret = kernel->start_task_threads();
119 // indent-tabs-mode: nil
121 // buffer-file-coding-system: utf-8-unix