| Index: base/thread.cc
|
| diff --git a/base/thread.cc b/base/thread.cc
|
| deleted file mode 100644
|
| index a3abf4ad1785ef189f6e7747927cf8607736fcab..0000000000000000000000000000000000000000
|
| --- a/base/thread.cc
|
| +++ /dev/null
|
| @@ -1,169 +0,0 @@
|
| -// Copyright 2004-2009 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -
|
| -#include "omaha/base/thread.h"
|
| -
|
| -#include "omaha/base/debug.h"
|
| -#include "omaha/base/exception_barrier.h"
|
| -#include "omaha/base/logging.h"
|
| -#include "omaha/base/time.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -// The system keeps an event associated with the thread message queue for a
|
| -// while even after the thread is dead. It can appear as a handle leak in the
|
| -// unit test but in fact it is not.
|
| -
|
| -Thread::Thread() : thread_id_(0), thread_(NULL) {
|
| -}
|
| -
|
| -Thread::~Thread() {
|
| - if (thread_) {
|
| - VERIFY1(CloseHandle(thread_));
|
| - }
|
| - thread_ = NULL;
|
| -}
|
| -
|
| -// This is the thread proc function as required by win32.
|
| -DWORD __stdcall Thread::Prepare(void* this_pointer) {
|
| - ExceptionBarrier eb;
|
| -
|
| - ASSERT1(this_pointer);
|
| - Thread * this_thread = reinterpret_cast<Thread*>(this_pointer);
|
| - Runnable * this_runner = this_thread->runner_;
|
| -
|
| - // Create a message queue. Our thread should have one.
|
| - MSG message = {0};
|
| - PeekMessage(&message, NULL, WM_USER, WM_USER, PM_NOREMOVE);
|
| -
|
| - // Start method is waiting on this gate to be open in order
|
| - // to proceed. By opening gate we say: OK thread is running.
|
| - this_thread->start_gate_.Open();
|
| -
|
| - // Now call the interface method. We are done.
|
| - UTIL_LOG(L4, (L"Thread::Prepare calling thread's Run()"));
|
| - this_runner->Run();
|
| -
|
| - return 0;
|
| -}
|
| -
|
| -// Starts the thread. It does not return until the thread is started.
|
| -bool Thread::Start(Runnable* runner) {
|
| - ASSERT1(runner);
|
| -
|
| - // Allow the thread object to be reused by cleaning its state up.
|
| - if (thread_) {
|
| - VERIFY1(CloseHandle(thread_));
|
| - }
|
| - start_gate_.Close();
|
| -
|
| - runner_ = runner;
|
| - thread_ = CreateThread(NULL, // default security attributes
|
| - 0, // use default stack size
|
| - &Thread::Prepare, // thread function
|
| - this, // argument to thread function
|
| - 0, // use default creation flags
|
| - &thread_id_); // returns the thread identifier
|
| - if (!thread_) {
|
| - return false;
|
| - }
|
| - // Wait until the newly created thread opens the gate for us.
|
| - return start_gate_.Wait(INFINITE);
|
| -}
|
| -
|
| -DWORD Thread::GetThreadId() const {
|
| - return thread_id_;
|
| -}
|
| -
|
| -HANDLE Thread::GetThreadHandle() const {
|
| - return thread_;
|
| -}
|
| -
|
| -bool Thread::Suspend() {
|
| - return (static_cast<DWORD>(-1) != SuspendThread(thread_));
|
| -}
|
| -
|
| -bool Thread::Resume() {
|
| - return (static_cast<DWORD>(-1) != ResumeThread(thread_));
|
| -}
|
| -
|
| -bool Thread::Terminate(int exit_code) {
|
| - return TRUE == TerminateThread(thread_, exit_code);
|
| -}
|
| -
|
| -bool Thread::SetPriority(int priority) {
|
| - return TRUE == SetThreadPriority(thread_, priority);
|
| -}
|
| -
|
| -bool Thread::GetPriority(int* priority) const {
|
| - if (!priority) {
|
| - return false;
|
| - }
|
| - *priority = GetThreadPriority(thread_);
|
| - return THREAD_PRIORITY_ERROR_RETURN != *priority;
|
| -}
|
| -
|
| -// Waits for handle to become signaled.
|
| -bool Thread::WaitTillExit(DWORD msec) const {
|
| - if (!Running()) {
|
| - return true;
|
| - }
|
| - return WAIT_OBJECT_0 == WaitForSingleObject(thread_, msec);
|
| -}
|
| -
|
| -// Checks if the thread is running.
|
| -bool Thread::Running() const {
|
| - if (NULL == thread_) {
|
| - return false;
|
| - }
|
| - return WAIT_TIMEOUT == WaitForSingleObject(thread_, 0);
|
| -}
|
| -
|
| -// Executes an APC request.
|
| -void __stdcall Thread::APCProc(ULONG_PTR param) {
|
| - ApcInfo* pInfo = reinterpret_cast<ApcInfo*>(param);
|
| - if (pInfo) {
|
| - if (pInfo->receiver_) {
|
| - pInfo->receiver_->OnApc(pInfo->param_);
|
| - }
|
| - // Deallocates what was allocated in QueueApc.
|
| - delete pInfo;
|
| - }
|
| -}
|
| -
|
| -// ApcReceiver wants to execute its OnApc function in the
|
| -// context of this thread.
|
| -bool Thread::QueueApc(ApcReceiver* receiver, ULONG_PTR param) {
|
| - ASSERT1(receiver);
|
| - if (!Running()) {
|
| - // No reason to queue anything to not running thread.
|
| - return true;
|
| - }
|
| -
|
| - // This allocation will be freed in Thread::APCProc
|
| - ApcInfo* pInfo = new ApcInfo();
|
| - pInfo->receiver_ = receiver;
|
| - pInfo->param_ = param;
|
| - return 0 != QueueUserAPC(&Thread::APCProc,
|
| - thread_,
|
| - reinterpret_cast<ULONG_PTR>(pInfo));
|
| -}
|
| -
|
| -bool Thread::PostMessage(UINT msg, WPARAM wparam, LPARAM lparam) {
|
| - return TRUE == PostThreadMessage(thread_id_, msg, wparam, lparam);
|
| -}
|
| -
|
| -} // namespace omaha
|
| -
|
|
|