Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(312)

Side by Side Diff: runtime/bin/process.cc

Issue 1275353005: VM thread shutdown. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/dartutils.h" 5 #include "bin/dartutils.h"
6 #include "bin/eventhandler.h"
6 #include "bin/io_buffer.h" 7 #include "bin/io_buffer.h"
8 #include "bin/log.h"
7 #include "bin/platform.h" 9 #include "bin/platform.h"
8 #include "bin/process.h" 10 #include "bin/process.h"
9 #include "bin/socket.h" 11 #include "bin/socket.h"
10 #include "bin/utils.h" 12 #include "bin/utils.h"
11 13
12 #include "include/dart_api.h" 14 #include "include/dart_api.h"
13 15
14 namespace dart { 16 namespace dart {
15 namespace bin { 17 namespace bin {
16 18
(...skipping 10 matching lines...) Expand all
27 static const intptr_t kMaxArgumentListLength = 1024 * 1024; 29 static const intptr_t kMaxArgumentListLength = 1024 * 1024;
28 ASSERT(Dart_IsList(strings)); 30 ASSERT(Dart_IsList(strings));
29 intptr_t len = 0; 31 intptr_t len = 0;
30 Dart_Handle result = Dart_ListLength(strings, &len); 32 Dart_Handle result = Dart_ListLength(strings, &len);
31 if (Dart_IsError(result)) { 33 if (Dart_IsError(result)) {
32 Dart_PropagateError(result); 34 Dart_PropagateError(result);
33 } 35 }
34 // Protect against user-defined list implementations that can have 36 // Protect against user-defined list implementations that can have
35 // arbitrary length. 37 // arbitrary length.
36 if (len < 0 || len > kMaxArgumentListLength) { 38 if (len < 0 || len > kMaxArgumentListLength) {
37 DartUtils::SetIntegerField(status_handle, "_errorCode", 0); 39 result = DartUtils::SetIntegerField(status_handle, "_errorCode", 0);
38 DartUtils::SetStringField( 40 if (Dart_IsError(result)) {
41 Dart_PropagateError(result);
42 }
43 result = DartUtils::SetStringField(
39 status_handle, "_errorMessage", "Max argument list length exceeded"); 44 status_handle, "_errorMessage", "Max argument list length exceeded");
45 if (Dart_IsError(result)) {
46 Dart_PropagateError(result);
47 }
40 return NULL; 48 return NULL;
41 } 49 }
42 *length = len; 50 *length = len;
43 char** string_args = new char*[len]; 51 char** string_args = new char*[len];
44 for (int i = 0; i < len; i++) { 52 for (int i = 0; i < len; i++) {
45 Dart_Handle arg = Dart_ListGetAt(strings, i); 53 Dart_Handle arg = Dart_ListGetAt(strings, i);
46 if (Dart_IsError(arg)) { 54 if (Dart_IsError(arg)) {
47 delete[] string_args; 55 delete[] string_args;
48 Dart_PropagateError(arg); 56 Dart_PropagateError(arg);
49 } 57 }
50 if (!Dart_IsString(arg)) { 58 if (!Dart_IsString(arg)) {
51 DartUtils::SetIntegerField(status_handle, "_errorCode", 0); 59 result = DartUtils::SetIntegerField(status_handle, "_errorCode", 0);
52 DartUtils::SetStringField( 60 if (Dart_IsError(result)) {
61 Dart_PropagateError(result);
62 }
63 result = DartUtils::SetStringField(
53 status_handle, "_errorMessage", error_msg); 64 status_handle, "_errorMessage", error_msg);
65 if (Dart_IsError(result)) {
66 Dart_PropagateError(result);
67 }
54 delete[] string_args; 68 delete[] string_args;
55 return NULL; 69 return NULL;
56 } 70 }
57 string_args[i] = const_cast<char *>(DartUtils::GetStringValue(arg)); 71 string_args[i] = const_cast<char *>(DartUtils::GetStringValue(arg));
58 } 72 }
59 return string_args; 73 return string_args;
60 } 74 }
61 75
62 void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) { 76 void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) {
63 Dart_Handle process = Dart_GetNativeArgument(args, 0); 77 Dart_Handle process = Dart_GetNativeArgument(args, 0);
64 intptr_t process_stdin; 78 intptr_t process_stdin;
65 intptr_t process_stdout; 79 intptr_t process_stdout;
66 intptr_t process_stderr; 80 intptr_t process_stderr;
67 intptr_t exit_event; 81 intptr_t exit_event;
82 Dart_Handle result;
68 Dart_Handle status_handle = Dart_GetNativeArgument(args, 10); 83 Dart_Handle status_handle = Dart_GetNativeArgument(args, 10);
69 Dart_Handle path_handle = Dart_GetNativeArgument(args, 1); 84 Dart_Handle path_handle = Dart_GetNativeArgument(args, 1);
70 // The Dart code verifies that the path implements the String 85 // The Dart code verifies that the path implements the String
71 // interface. However, only builtin Strings are handled by 86 // interface. However, only builtin Strings are handled by
72 // GetStringValue. 87 // GetStringValue.
73 if (!Dart_IsString(path_handle)) { 88 if (!Dart_IsString(path_handle)) {
74 DartUtils::SetIntegerField(status_handle, "_errorCode", 0); 89 result = DartUtils::SetIntegerField(status_handle, "_errorCode", 0);
75 DartUtils::SetStringField( 90 if (Dart_IsError(result)) {
91 Dart_PropagateError(result);
92 }
93 result = DartUtils::SetStringField(
76 status_handle, "_errorMessage", "Path must be a builtin string"); 94 status_handle, "_errorMessage", "Path must be a builtin string");
95 if (Dart_IsError(result)) {
96 Dart_PropagateError(result);
97 }
77 Dart_SetReturnValue(args, Dart_NewBoolean(false)); 98 Dart_SetReturnValue(args, Dart_NewBoolean(false));
78 return; 99 return;
79 } 100 }
80 const char* path = DartUtils::GetStringValue(path_handle); 101 const char* path = DartUtils::GetStringValue(path_handle);
81 Dart_Handle arguments = Dart_GetNativeArgument(args, 2); 102 Dart_Handle arguments = Dart_GetNativeArgument(args, 2);
82 intptr_t args_length = 0; 103 intptr_t args_length = 0;
83 char** string_args = 104 char** string_args =
84 ExtractCStringList(arguments, 105 ExtractCStringList(arguments,
85 status_handle, 106 status_handle,
86 "Arguments must be builtin strings", 107 "Arguments must be builtin strings",
87 &args_length); 108 &args_length);
88 if (string_args == NULL) { 109 if (string_args == NULL) {
89 Dart_SetReturnValue(args, Dart_NewBoolean(false)); 110 Dart_SetReturnValue(args, Dart_NewBoolean(false));
90 return; 111 return;
91 } 112 }
92 Dart_Handle working_directory_handle = Dart_GetNativeArgument(args, 3); 113 Dart_Handle working_directory_handle = Dart_GetNativeArgument(args, 3);
93 // Defaults to the current working directoy. 114 // Defaults to the current working directoy.
94 const char* working_directory = NULL; 115 const char* working_directory = NULL;
95 if (Dart_IsString(working_directory_handle)) { 116 if (Dart_IsString(working_directory_handle)) {
96 working_directory = DartUtils::GetStringValue(working_directory_handle); 117 working_directory = DartUtils::GetStringValue(working_directory_handle);
97 } else if (!Dart_IsNull(working_directory_handle)) { 118 } else if (!Dart_IsNull(working_directory_handle)) {
98 delete[] string_args; 119 delete[] string_args;
99 DartUtils::SetIntegerField(status_handle, "_errorCode", 0); 120 result = DartUtils::SetIntegerField(status_handle, "_errorCode", 0);
100 DartUtils::SetStringField( 121 if (Dart_IsError(result)) {
122 Dart_PropagateError(result);
123 }
124 result = DartUtils::SetStringField(
101 status_handle, "_errorMessage", 125 status_handle, "_errorMessage",
102 "WorkingDirectory must be a builtin string"); 126 "WorkingDirectory must be a builtin string");
127 if (Dart_IsError(result)) {
128 Dart_PropagateError(result);
129 }
103 Dart_SetReturnValue(args, Dart_NewBoolean(false)); 130 Dart_SetReturnValue(args, Dart_NewBoolean(false));
104 return; 131 return;
105 } 132 }
106 Dart_Handle environment = Dart_GetNativeArgument(args, 4); 133 Dart_Handle environment = Dart_GetNativeArgument(args, 4);
107 intptr_t environment_length = 0; 134 intptr_t environment_length = 0;
108 char** string_environment = NULL; 135 char** string_environment = NULL;
109 if (!Dart_IsNull(environment)) { 136 if (!Dart_IsNull(environment)) {
110 string_environment = 137 string_environment =
111 ExtractCStringList(environment, 138 ExtractCStringList(environment,
112 status_handle, 139 status_handle,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 if (mode != kDetached) { 171 if (mode != kDetached) {
145 Socket::SetSocketIdNativeField(stdin_handle, process_stdin); 172 Socket::SetSocketIdNativeField(stdin_handle, process_stdin);
146 Socket::SetSocketIdNativeField(stdout_handle, process_stdout); 173 Socket::SetSocketIdNativeField(stdout_handle, process_stdout);
147 Socket::SetSocketIdNativeField(stderr_handle, process_stderr); 174 Socket::SetSocketIdNativeField(stderr_handle, process_stderr);
148 } 175 }
149 if (mode == kNormal) { 176 if (mode == kNormal) {
150 Socket::SetSocketIdNativeField(exit_handle, exit_event); 177 Socket::SetSocketIdNativeField(exit_handle, exit_event);
151 } 178 }
152 Process::SetProcessIdNativeField(process, pid); 179 Process::SetProcessIdNativeField(process, pid);
153 } else { 180 } else {
154 DartUtils::SetIntegerField( 181 result = DartUtils::SetIntegerField(
155 status_handle, "_errorCode", error_code); 182 status_handle, "_errorCode", error_code);
156 DartUtils::SetStringField( 183 if (Dart_IsError(result)) {
184 Dart_PropagateError(result);
185 }
186 result = DartUtils::SetStringField(
157 status_handle, 187 status_handle,
158 "_errorMessage", 188 "_errorMessage",
159 os_error_message != NULL ? os_error_message 189 os_error_message != NULL ? os_error_message
160 : "Cannot get error message"); 190 : "Cannot get error message");
191 if (Dart_IsError(result)) {
192 Dart_PropagateError(result);
193 }
161 } 194 }
162 delete[] string_args; 195 delete[] string_args;
163 delete[] string_environment; 196 delete[] string_environment;
164 free(os_error_message); 197 free(os_error_message);
165 Dart_SetReturnValue(args, Dart_NewBoolean(error_code == 0)); 198 Dart_SetReturnValue(args, Dart_NewBoolean(error_code == 0));
166 } 199 }
167 200
168 201
169 void FUNCTION_NAME(Process_Wait)(Dart_NativeArguments args) { 202 void FUNCTION_NAME(Process_Wait)(Dart_NativeArguments args) {
170 Dart_Handle process = Dart_GetNativeArgument(args, 0); 203 Dart_Handle process = Dart_GetNativeArgument(args, 0);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 intptr_t signal = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); 242 intptr_t signal = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1));
210 bool success = Process::Kill(pid, signal); 243 bool success = Process::Kill(pid, signal);
211 Dart_SetReturnValue(args, Dart_NewBoolean(success)); 244 Dart_SetReturnValue(args, Dart_NewBoolean(success));
212 } 245 }
213 246
214 247
215 void FUNCTION_NAME(Process_Exit)(Dart_NativeArguments args) { 248 void FUNCTION_NAME(Process_Exit)(Dart_NativeArguments args) {
216 int64_t status = 0; 249 int64_t status = 0;
217 // Ignore result if passing invalid argument and just exit 0. 250 // Ignore result if passing invalid argument and just exit 0.
218 DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &status); 251 DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &status);
219 Dart_ExitIsolate(); 252 Dart_ShutdownIsolate();
220 Dart_Cleanup(); 253 Process::TerminateExitCodeHandler();
254 char* error = Dart_Cleanup();
255 if (error != NULL) {
256 Log::PrintErr("VM cleanup failed: %s\n", error);
257 free(error);
258 }
259 EventHandler::Stop();
221 exit(static_cast<int>(status)); 260 exit(static_cast<int>(status));
222 } 261 }
223 262
224 263
225 void FUNCTION_NAME(Process_SetExitCode)(Dart_NativeArguments args) { 264 void FUNCTION_NAME(Process_SetExitCode)(Dart_NativeArguments args) {
226 int64_t status = 0; 265 int64_t status = 0;
227 // Ignore result if passing invalid argument and just set exit code to 0. 266 // Ignore result if passing invalid argument and just set exit code to 0.
228 DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &status); 267 DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &status);
229 Process::SetGlobalExitCode(status); 268 Process::SetGlobalExitCode(status);
230 } 269 }
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 free(const_cast<char*>(system_string)); 375 free(const_cast<char*>(system_string));
337 Dart_PropagateError(result); 376 Dart_PropagateError(result);
338 } 377 }
339 memmove(buffer, system_string, system_len); 378 memmove(buffer, system_string, system_len);
340 free(const_cast<char*>(system_string)); 379 free(const_cast<char*>(system_string));
341 Dart_SetReturnValue(args, external_array); 380 Dart_SetReturnValue(args, external_array);
342 } 381 }
343 382
344 } // namespace bin 383 } // namespace bin
345 } // namespace dart 384 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698