OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 <process.h> | 5 #include <process.h> |
6 | 6 |
7 #include "bin/builtin.h" | 7 #include "bin/builtin.h" |
8 #include "bin/process.h" | 8 #include "bin/process.h" |
9 #include "bin/eventhandler.h" | 9 #include "bin/eventhandler.h" |
10 #include "bin/log.h" | 10 #include "bin/log.h" |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 kInheritNone | 195 kInheritNone |
196 }; | 196 }; |
197 | 197 |
198 | 198 |
199 // Create a pipe for communicating with a new process. The handles array | 199 // Create a pipe for communicating with a new process. The handles array |
200 // will contain the read and write ends of the pipe. Based on the type | 200 // will contain the read and write ends of the pipe. Based on the type |
201 // one of the handles will be inheritable. | 201 // one of the handles will be inheritable. |
202 // NOTE: If this function returns false the handles might have been allocated | 202 // NOTE: If this function returns false the handles might have been allocated |
203 // and the caller should make sure to close them in case of an error. | 203 // and the caller should make sure to close them in case of an error. |
204 static bool CreateProcessPipe(HANDLE handles[2], | 204 static bool CreateProcessPipe(HANDLE handles[2], |
205 wchar_t* pipe_name, | 205 char* pipe_name, |
206 NamedPipeType type) { | 206 NamedPipeType type) { |
207 // Security attributes describing an inheritable handle. | 207 // Security attributes describing an inheritable handle. |
208 SECURITY_ATTRIBUTES inherit_handle; | 208 SECURITY_ATTRIBUTES inherit_handle; |
209 inherit_handle.nLength = sizeof(SECURITY_ATTRIBUTES); | 209 inherit_handle.nLength = sizeof(SECURITY_ATTRIBUTES); |
210 inherit_handle.bInheritHandle = TRUE; | 210 inherit_handle.bInheritHandle = TRUE; |
211 inherit_handle.lpSecurityDescriptor = NULL; | 211 inherit_handle.lpSecurityDescriptor = NULL; |
212 | 212 |
213 if (type == kInheritRead) { | 213 if (type == kInheritRead) { |
214 handles[kWriteHandle] = | 214 handles[kWriteHandle] = |
215 CreateNamedPipeW(pipe_name, | 215 CreateNamedPipe(pipe_name, |
216 PIPE_ACCESS_OUTBOUND | FILE_FLAG_OVERLAPPED, | 216 PIPE_ACCESS_OUTBOUND | FILE_FLAG_OVERLAPPED, |
217 PIPE_TYPE_BYTE | PIPE_WAIT, | 217 PIPE_TYPE_BYTE | PIPE_WAIT, |
218 1, // Number of pipes | 218 1, // Number of pipes |
219 1024, // Out buffer size | 219 1024, // Out buffer size |
220 1024, // In buffer size | 220 1024, // In buffer size |
221 0, // Timeout in ms | 221 0, // Timeout in ms |
222 NULL); | 222 NULL); |
223 | 223 |
224 if (handles[kWriteHandle] == INVALID_HANDLE_VALUE) { | 224 if (handles[kWriteHandle] == INVALID_HANDLE_VALUE) { |
225 Log::PrintErr("CreateNamedPipe failed %d\n", GetLastError()); | 225 Log::PrintErr("CreateNamedPipe failed %d\n", GetLastError()); |
226 return false; | 226 return false; |
227 } | 227 } |
228 | 228 |
229 handles[kReadHandle] = | 229 handles[kReadHandle] = |
230 CreateFileW(pipe_name, | 230 CreateFile(pipe_name, |
231 GENERIC_READ, | 231 GENERIC_READ, |
232 0, | 232 0, |
233 &inherit_handle, | 233 &inherit_handle, |
234 OPEN_EXISTING, | 234 OPEN_EXISTING, |
235 FILE_READ_ATTRIBUTES | FILE_FLAG_OVERLAPPED, | 235 FILE_READ_ATTRIBUTES | FILE_FLAG_OVERLAPPED, |
236 NULL); | 236 NULL); |
237 if (handles[kReadHandle] == INVALID_HANDLE_VALUE) { | 237 if (handles[kReadHandle] == INVALID_HANDLE_VALUE) { |
238 Log::PrintErr("CreateFile failed %d\n", GetLastError()); | 238 Log::PrintErr("CreateFile failed %d\n", GetLastError()); |
239 return false; | 239 return false; |
240 } | 240 } |
241 } else { | 241 } else { |
242 ASSERT(type == kInheritWrite || type == kInheritNone); | 242 ASSERT(type == kInheritWrite || type == kInheritNone); |
243 handles[kReadHandle] = | 243 handles[kReadHandle] = |
244 CreateNamedPipeW(pipe_name, | 244 CreateNamedPipe(pipe_name, |
245 PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, | 245 PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, |
246 PIPE_TYPE_BYTE | PIPE_WAIT, | 246 PIPE_TYPE_BYTE | PIPE_WAIT, |
247 1, // Number of pipes | 247 1, // Number of pipes |
248 1024, // Out buffer size | 248 1024, // Out buffer size |
249 1024, // In buffer size | 249 1024, // In buffer size |
250 0, // Timeout in ms | 250 0, // Timeout in ms |
251 NULL); | 251 NULL); |
252 | 252 |
253 if (handles[kReadHandle] == INVALID_HANDLE_VALUE) { | 253 if (handles[kReadHandle] == INVALID_HANDLE_VALUE) { |
254 Log::PrintErr("CreateNamedPipe failed %d\n", GetLastError()); | 254 Log::PrintErr("CreateNamedPipe failed %d\n", GetLastError()); |
255 return false; | 255 return false; |
256 } | 256 } |
257 | 257 |
258 handles[kWriteHandle] = | 258 handles[kWriteHandle] = |
259 CreateFileW(pipe_name, | 259 CreateFile(pipe_name, |
260 GENERIC_WRITE, | 260 GENERIC_WRITE, |
261 0, | 261 0, |
262 (type == kInheritWrite) ? &inherit_handle : NULL, | 262 (type == kInheritWrite) ? &inherit_handle : NULL, |
263 OPEN_EXISTING, | 263 OPEN_EXISTING, |
264 FILE_WRITE_ATTRIBUTES | FILE_FLAG_OVERLAPPED, | 264 FILE_WRITE_ATTRIBUTES | FILE_FLAG_OVERLAPPED, |
265 NULL); | 265 NULL); |
266 if (handles[kWriteHandle] == INVALID_HANDLE_VALUE) { | 266 if (handles[kWriteHandle] == INVALID_HANDLE_VALUE) { |
267 Log::PrintErr("CreateFile failed %d\n", GetLastError()); | 267 Log::PrintErr("CreateFile failed %d\n", GetLastError()); |
268 return false; | 268 return false; |
269 } | 269 } |
270 } | 270 } |
271 return true; | 271 return true; |
272 } | 272 } |
273 | 273 |
274 | 274 |
275 static void CloseProcessPipe(HANDLE handles[2]) { | 275 static void CloseProcessPipe(HANDLE handles[2]) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 intptr_t* err, | 330 intptr_t* err, |
331 intptr_t* id, | 331 intptr_t* id, |
332 intptr_t* exit_handler, | 332 intptr_t* exit_handler, |
333 char** os_error_message) { | 333 char** os_error_message) { |
334 HANDLE stdin_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; | 334 HANDLE stdin_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
335 HANDLE stdout_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; | 335 HANDLE stdout_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
336 HANDLE stderr_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; | 336 HANDLE stderr_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
337 HANDLE exit_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; | 337 HANDLE exit_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
338 | 338 |
339 // Generate unique pipe names for the four named pipes needed. | 339 // Generate unique pipe names for the four named pipes needed. |
340 static const int kMaxPipeNameSize = 80; | 340 char pipe_names[4][80]; |
341 wchar_t pipe_names[4][kMaxPipeNameSize]; | |
342 UUID uuid; | 341 UUID uuid; |
343 RPC_STATUS status = UuidCreateSequential(&uuid); | 342 RPC_STATUS status = UuidCreateSequential(&uuid); |
344 if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) { | 343 if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) { |
345 SetOsErrorMessage(os_error_message); | 344 SetOsErrorMessage(os_error_message); |
346 Log::PrintErr("UuidCreateSequential failed %d\n", status); | 345 Log::PrintErr("UuidCreateSequential failed %d\n", status); |
347 return status; | 346 return status; |
348 } | 347 } |
349 RPC_WSTR uuid_string; | 348 RPC_CSTR uuid_string; |
350 status = UuidToStringW(&uuid, &uuid_string); | 349 status = UuidToString(&uuid, &uuid_string); |
351 if (status != RPC_S_OK) { | 350 if (status != RPC_S_OK) { |
352 SetOsErrorMessage(os_error_message); | 351 SetOsErrorMessage(os_error_message); |
353 Log::PrintErr("UuidToString failed %d\n", status); | 352 Log::PrintErr("UuidToString failed %d\n", status); |
354 return status; | 353 return status; |
355 } | 354 } |
356 for (int i = 0; i < 4; i++) { | 355 for (int i = 0; i < 4; i++) { |
357 static const wchar_t* prefix = L"\\\\.\\Pipe\\dart"; | 356 static const char* prefix = "\\\\.\\Pipe\\dart"; |
358 _snwprintf(pipe_names[i], | 357 snprintf(pipe_names[i], |
359 kMaxPipeNameSize, | 358 sizeof(pipe_names[i]), |
360 L"%s_%s_%d", prefix, uuid_string, i + 1); | 359 "%s_%s_%d", prefix, uuid_string, i + 1); |
361 } | 360 } |
362 status = RpcStringFreeW(&uuid_string); | 361 status = RpcStringFree(&uuid_string); |
363 if (status != RPC_S_OK) { | 362 if (status != RPC_S_OK) { |
364 SetOsErrorMessage(os_error_message); | 363 SetOsErrorMessage(os_error_message); |
365 Log::PrintErr("RpcStringFree failed %d\n", status); | 364 Log::PrintErr("RpcStringFree failed %d\n", status); |
366 return status; | 365 return status; |
367 } | 366 } |
368 | 367 |
369 if (!CreateProcessPipe(stdin_handles, pipe_names[0], kInheritRead)) { | 368 if (!CreateProcessPipe(stdin_handles, pipe_names[0], kInheritRead)) { |
370 int error_code = SetOsErrorMessage(os_error_message); | 369 int error_code = SetOsErrorMessage(os_error_message); |
371 CloseProcessPipes( | 370 CloseProcessPipes( |
372 stdin_handles, stdout_handles, stderr_handles, exit_handles); | 371 stdin_handles, stdout_handles, stderr_handles, exit_handles); |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
606 | 605 |
607 | 606 |
608 void Process::TerminateExitCodeHandler() { | 607 void Process::TerminateExitCodeHandler() { |
609 // Nothing needs to be done on Windows. | 608 // Nothing needs to be done on Windows. |
610 } | 609 } |
611 | 610 |
612 | 611 |
613 intptr_t Process::CurrentProcessId() { | 612 intptr_t Process::CurrentProcessId() { |
614 return static_cast<intptr_t>(GetCurrentProcessId()); | 613 return static_cast<intptr_t>(GetCurrentProcessId()); |
615 } | 614 } |
OLD | NEW |