Index: runtime/bin/process_win.cc |
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc |
index 1c0a03df1dfd01f207c43b7a95ceee33ae8fcff8..9777c5526c56d6b57f25d287a90479447852fabd 100644 |
--- a/runtime/bin/process_win.cc |
+++ b/runtime/bin/process_win.cc |
@@ -5,11 +5,12 @@ |
#include "platform/globals.h" |
#if defined(TARGET_OS_WINDOWS) |
+#include "bin/process.h" |
+ |
#include <process.h> // NOLINT |
#include "bin/builtin.h" |
#include "bin/dartutils.h" |
-#include "bin/process.h" |
#include "bin/eventhandler.h" |
#include "bin/lockers.h" |
#include "bin/log.h" |
@@ -18,7 +19,6 @@ |
#include "bin/utils.h" |
#include "bin/utils_win.h" |
- |
namespace dart { |
namespace bin { |
@@ -72,6 +72,8 @@ class ProcessInfo { |
HANDLE exit_pipe_; |
// Link to next ProcessInfo object in the singly-linked list. |
ProcessInfo* next_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ProcessInfo); |
}; |
@@ -143,7 +145,9 @@ class ProcessInfoList { |
// Callback called when an exit code is available from one of the |
// processes in the list. |
static void CALLBACK ExitCodeCallback(PVOID data, BOOLEAN timed_out) { |
- if (timed_out) return; |
+ if (timed_out) { |
+ return; |
+ } |
DWORD pid = reinterpret_cast<DWORD>(data); |
HANDLE handle; |
HANDLE wait_handle; |
@@ -154,13 +158,12 @@ class ProcessInfoList { |
} |
// Unregister the event in a non-blocking way. |
BOOL ok = UnregisterWait(wait_handle); |
- if (!ok && GetLastError() != ERROR_IO_PENDING) { |
+ if (!ok && (GetLastError() != ERROR_IO_PENDING)) { |
FATAL("Failed unregistering wait operation"); |
} |
// Get and report the exit code to Dart. |
int exit_code; |
- ok = GetExitCodeProcess(handle, |
- reinterpret_cast<DWORD*>(&exit_code)); |
+ ok = GetExitCodeProcess(handle, reinterpret_cast<DWORD*>(&exit_code)); |
if (!ok) { |
FATAL1("GetExitCodeProcess failed %d\n", GetLastError()); |
} |
@@ -176,9 +179,9 @@ class ProcessInfoList { |
// pipe has been closed. It is therefore not a problem that |
// WriteFile fails with a closed pipe error |
// (ERROR_NO_DATA). Other errors should not happen. |
- if (ok && written != sizeof(message)) { |
+ if (ok && (written != sizeof(message))) { |
FATAL("Failed to write entire process exit message"); |
- } else if (!ok && GetLastError() != ERROR_NO_DATA) { |
+ } else if (!ok && (GetLastError() != ERROR_NO_DATA)) { |
FATAL1("Failed to write exit code: %d", GetLastError()); |
} |
// Remove the process from the list of active processes. |
@@ -191,6 +194,9 @@ class ProcessInfoList { |
// Mutex protecting all accesses to the linked list of active |
// processes. |
static Mutex* mutex_; |
+ |
+ DISALLOW_ALLOCATION(); |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ProcessInfoList); |
}; |
@@ -249,7 +255,7 @@ static bool CreateProcessPipe(HANDLE handles[2], |
return false; |
} |
} else { |
- ASSERT(type == kInheritWrite || type == kInheritNone); |
+ ASSERT((type == kInheritWrite) || (type == kInheritNone)); |
handles[kReadHandle] = |
CreateNamedPipeW(pipe_name, |
PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, |
@@ -357,19 +363,19 @@ static bool EnsureInitialized() { |
HMODULE kernel32_module = GetModuleHandleW(L"kernel32.dll"); |
if (!load_attempted) { |
MutexLocker locker(mutex); |
- if (load_attempted) return delete_proc_thread_attr_list != NULL; |
+ if (load_attempted) { |
+ return (delete_proc_thread_attr_list != NULL); |
+ } |
init_proc_thread_attr_list = reinterpret_cast<InitProcThreadAttrListFn>( |
GetProcAddress(kernel32_module, "InitializeProcThreadAttributeList")); |
- update_proc_thread_attr = |
- reinterpret_cast<UpdateProcThreadAttrFn>( |
- GetProcAddress(kernel32_module, "UpdateProcThreadAttribute")); |
+ update_proc_thread_attr = reinterpret_cast<UpdateProcThreadAttrFn>( |
+ GetProcAddress(kernel32_module, "UpdateProcThreadAttribute")); |
delete_proc_thread_attr_list = reinterpret_cast<DeleteProcThreadAttrListFn>( |
- reinterpret_cast<DeleteProcThreadAttrListFn>( |
- GetProcAddress(kernel32_module, "DeleteProcThreadAttributeList"))); |
+ GetProcAddress(kernel32_module, "DeleteProcThreadAttributeList")); |
load_attempted = true; |
- return delete_proc_thread_attr_list != NULL; |
+ return (delete_proc_thread_attr_list != NULL); |
} |
- return delete_proc_thread_attr_list != NULL; |
+ return (delete_proc_thread_attr_list != NULL); |
} |
@@ -378,7 +384,7 @@ template<int Count> |
static int GenerateNames(wchar_t pipe_names[Count][kMaxPipeNameSize]) { |
UUID uuid; |
RPC_STATUS status = UuidCreateSequential(&uuid); |
- if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) { |
+ if ((status != RPC_S_OK) && (status != RPC_S_UUID_LOCAL_ONLY)) { |
return status; |
} |
RPC_WSTR uuid_string; |
@@ -451,7 +457,8 @@ class ProcessStarter { |
command_line_length += arguments_length + 1; |
// Put together command-line string. |
- command_line_ = new wchar_t[command_line_length]; |
+ command_line_ = reinterpret_cast<wchar_t*>(Dart_ScopeAllocate( |
+ command_line_length * sizeof(*command_line_))); |
int len = 0; |
int remaining = command_line_length; |
int written = |
@@ -460,9 +467,8 @@ class ProcessStarter { |
remaining -= written; |
ASSERT(remaining >= 0); |
for (int i = 0; i < arguments_length; i++) { |
- written = |
- _snwprintf( |
- command_line_ + len, remaining, L" %s", system_arguments[i]); |
+ written = _snwprintf( |
+ command_line_ + len, remaining, L" %s", system_arguments[i]); |
len += written; |
remaining -= written; |
ASSERT(remaining >= 0); |
@@ -485,7 +491,8 @@ class ProcessStarter { |
for (intptr_t i = 0; i < environment_length; i++) { |
block_size += wcslen(system_environment[i]) + 1; |
} |
- environment_block_ = new wchar_t[block_size]; |
+ environment_block_ = reinterpret_cast<wchar_t*>(Dart_ScopeAllocate( |
+ block_size * sizeof(*environment_block_))); |
intptr_t block_index = 0; |
for (intptr_t i = 0; i < environment_length; i++) { |
intptr_t len = wcslen(system_environment[i]); |
@@ -513,12 +520,8 @@ class ProcessStarter { |
~ProcessStarter() { |
- // Deallocate command-line and environment block strings. |
- delete[] command_line_; |
- delete[] environment_block_; |
if (attribute_list_ != NULL) { |
delete_proc_thread_attr_list(attribute_list_); |
- free(attribute_list_); |
} |
} |
@@ -526,7 +529,9 @@ class ProcessStarter { |
int Start() { |
// Create pipes required. |
int err = CreatePipes(); |
- if (err != 0) return err; |
+ if (err != 0) { |
+ return err; |
+ } |
// Setup info structures. |
STARTUPINFOEXW startup_info; |
@@ -545,11 +550,11 @@ class ProcessStarter { |
// The call to determine the size of an attribute list always fails with |
// ERROR_INSUFFICIENT_BUFFER and that error should be ignored. |
if (!init_proc_thread_attr_list(NULL, 1, 0, &size) && |
- GetLastError() != ERROR_INSUFFICIENT_BUFFER) { |
+ (GetLastError() != ERROR_INSUFFICIENT_BUFFER)) { |
return CleanupAndReturnError(); |
} |
- attribute_list_ = |
- reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(malloc(size)); |
+ attribute_list_ = reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>( |
+ Dart_ScopeAllocate(size)); |
ZeroMemory(attribute_list_, size); |
if (!init_proc_thread_attr_list(attribute_list_, 1, 0, &size)) { |
return CleanupAndReturnError(); |
@@ -650,10 +655,19 @@ class ProcessStarter { |
} |
} |
} else { |
- // Open NUL for stdin, stdout and stderr. |
- if ((stdin_handles_[kReadHandle] = OpenNul()) == INVALID_HANDLE_VALUE || |
- (stdout_handles_[kWriteHandle] = OpenNul()) == INVALID_HANDLE_VALUE || |
- (stderr_handles_[kWriteHandle] = OpenNul()) == INVALID_HANDLE_VALUE) { |
+ // Open NUL for stdin, stdout, and stderr. |
+ stdin_handles_[kReadHandle] = OpenNul(); |
+ if (stdin_handles_[kReadHandle] == INVALID_HANDLE_VALUE) { |
+ return CleanupAndReturnError(); |
+ } |
+ |
+ stdout_handles_[kWriteHandle] = OpenNul(); |
+ if (stdout_handles_[kWriteHandle] == INVALID_HANDLE_VALUE) { |
+ return CleanupAndReturnError(); |
+ } |
+ |
+ stderr_handles_[kWriteHandle] = OpenNul(); |
+ if (stderr_handles_[kWriteHandle] == INVALID_HANDLE_VALUE) { |
return CleanupAndReturnError(); |
} |
} |
@@ -688,6 +702,10 @@ class ProcessStarter { |
intptr_t* id_; |
intptr_t* exit_handler_; |
char** os_error_message_; |
+ |
+ private: |
+ DISALLOW_ALLOCATION(); |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ProcessStarter); |
}; |
@@ -738,7 +756,9 @@ class BufferList: public BufferListBase { |
// The access to the read buffer for overlapped read. |
void GetReadBuffer(uint8_t** buffer, intptr_t* size) { |
ASSERT(!read_pending_); |
- if (free_size_ == 0) Allocate(); |
+ if (free_size_ == 0) { |
+ Allocate(); |
+ } |
ASSERT(free_size_ > 0); |
ASSERT(free_size_ <= kBufferSize); |
*buffer = FreeSpaceAddress(); |
@@ -763,11 +783,15 @@ class BufferList: public BufferListBase { |
private: |
bool read_pending_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BufferList); |
}; |
class OverlappedHandle { |
public: |
+ OverlappedHandle() {} |
+ |
void Init(HANDLE handle, HANDLE event) { |
handle_ = handle; |
event_ = event; |
@@ -775,7 +799,7 @@ class OverlappedHandle { |
} |
bool HasEvent(HANDLE event) { |
- return event_ == event; |
+ return (event_ == event); |
} |
bool Read() { |
@@ -793,7 +817,9 @@ class OverlappedHandle { |
intptr_t buffer_size; |
buffer_.GetReadBuffer(&buffer, &buffer_size); |
BOOL ok = ReadFile(handle_, buffer, buffer_size, NULL, &overlapped_); |
- if (!ok) return GetLastError() == ERROR_IO_PENDING; |
+ if (!ok) { |
+ return (GetLastError() == ERROR_IO_PENDING); |
+ } |
buffer_.DataIsRead(overlapped_.InternalHigh); |
} |
} |
@@ -833,6 +859,7 @@ class OverlappedHandle { |
BufferList buffer_; |
DISALLOW_ALLOCATION(); |
+ DISALLOW_COPY_AND_ASSIGN(OverlappedHandle); |
}; |
@@ -905,12 +932,14 @@ bool Process::Wait(intptr_t pid, |
// Calculate the exit code. |
ASSERT(oh[2].GetDataSize() == 8); |
- uint32_t exit[2]; |
- memmove(&exit, oh[2].GetFirstDataBuffer(), sizeof(exit)); |
+ uint32_t exit_codes[2]; |
+ memmove(&exit_codes, oh[2].GetFirstDataBuffer(), sizeof(exit_codes)); |
oh[2].FreeDataBuffer(); |
- intptr_t exit_code = exit[0]; |
- intptr_t negative = exit[1]; |
- if (negative) exit_code = -exit_code; |
+ intptr_t exit_code = exit_codes[0]; |
+ intptr_t negative = exit_codes[1]; |
+ if (negative != 0) { |
+ exit_code = -exit_code; |
+ } |
result->set_exit_code(exit_code); |
return true; |
} |
@@ -931,7 +960,9 @@ bool Process::Kill(intptr_t id, int signal) { |
if (!success) { |
process_handle = OpenProcess(PROCESS_TERMINATE, FALSE, id); |
// The process is already dead. |
- if (process_handle == INVALID_HANDLE_VALUE) return false; |
+ if (process_handle == INVALID_HANDLE_VALUE) { |
+ return false; |
+ } |
} |
BOOL result = TerminateProcess(process_handle, -1); |
return result ? true : false; |
@@ -985,12 +1016,16 @@ intptr_t GetWinSignal(intptr_t signal) { |
intptr_t Process::SetSignalHandler(intptr_t signal) { |
signal = GetWinSignal(signal); |
- if (signal == -1) return -1; |
+ if (signal == -1) { |
+ return -1; |
+ } |
// Generate a unique pipe name for the named pipe. |
wchar_t pipe_name[kMaxPipeNameSize]; |
int status = GenerateNames<1>(&pipe_name); |
- if (status != 0) return status; |
+ if (status != 0) { |
+ return status; |
+ } |
HANDLE fds[2]; |
if (!CreateProcessPipe(fds, pipe_name, kInheritNone)) { |
@@ -1019,12 +1054,14 @@ intptr_t Process::SetSignalHandler(intptr_t signal) { |
void Process::ClearSignalHandler(intptr_t signal) { |
signal = GetWinSignal(signal); |
- if (signal == -1) return; |
+ if (signal == -1) { |
+ return; |
+ } |
MutexLocker lock(signal_mutex); |
SignalInfo* handler = signal_handlers; |
while (handler != NULL) { |
- if (handler->port() == Dart_GetMainPortId() && |
- handler->signal() == signal) { |
+ if ((handler->port() == Dart_GetMainPortId()) && |
+ (handler->signal() == signal)) { |
handler->Unlink(); |
break; |
} |