1554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com/* 2554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * Copyright 2012 Google Inc. 3554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * 4554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * Use of this source code is governed by a BSD-style license that can be 5554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * found in the LICENSE file. 6554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com */ 7554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 8554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#include "SkTypes.h" 91ee76510f5dbf632d30975fc3509ef4f609156d2mtklein#if defined(SK_BUILD_FOR_WIN32) 10554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 11554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#include "SkThreadUtils.h" 12554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#include "SkThreadUtils_win.h" 13554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 14554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comSkThread_WinData::SkThread_WinData(SkThread::entryPointProc entryPoint, void* data) 1596fcdcc219d2a0d3579719b84b28bede76efba64halcanary : fHandle(nullptr) 16554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com , fParam(data) 17554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com , fThreadId(0) 18554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com , fEntryPoint(entryPoint) 19554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com , fStarted(false) 20554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com{ 21554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com fCancelEvent = CreateEvent( 2296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr, // default security attributes 23554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com false, //auto reset 24554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com false, //not signaled 2596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr); //no name 26554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com} 27554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 28554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comSkThread_WinData::~SkThread_WinData() { 29554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com CloseHandle(fCancelEvent); 30554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com} 31554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 32554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comstatic DWORD WINAPI thread_start(LPVOID data) { 33554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com SkThread_WinData* winData = static_cast<SkThread_WinData*>(data); 34554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 35554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com //See if this thread was canceled before starting. 36554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com if (WaitForSingleObject(winData->fCancelEvent, 0) == WAIT_OBJECT_0) { 37554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com return 0; 38554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 39554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 40554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com winData->fEntryPoint(winData->fParam); 41554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com return 0; 42554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com} 43554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 44554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comSkThread::SkThread(entryPointProc entryPoint, void* data) { 45554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com SkThread_WinData* winData = new SkThread_WinData(entryPoint, data); 46554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com fData = winData; 47554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 4896fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == winData->fCancelEvent) { 49554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com return; 50554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 51554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 52554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com winData->fHandle = CreateThread( 5396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr, // default security attributes 54554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 0, // use default stack size 55554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com thread_start, // thread function name (proxy) 56554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com winData, // argument to thread function (proxy args) 57a1bde7d2e152188f8d5a2d0f759030ed032a2522mtklein CREATE_SUSPENDED, // we used to set processor affinity, which needed this 58554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com &winData->fThreadId); // returns the thread identifier 59554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com} 60554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 61554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comSkThread::~SkThread() { 6296fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (fData != nullptr) { 63554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com SkThread_WinData* winData = static_cast<SkThread_WinData*>(fData); 64554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com // If created thread but start was never called, kill the thread. 6596fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (winData->fHandle != nullptr && !winData->fStarted) { 66554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com if (SetEvent(winData->fCancelEvent) != 0) { 67554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com if (this->start()) { 68554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com this->join(); 69554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 70554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } else { 71554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com //kill with prejudice 72554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com TerminateThread(winData->fHandle, -1); 73554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 74554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 75554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com delete winData; 76554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 77554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com} 78554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 79554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.combool SkThread::start() { 80554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com SkThread_WinData* winData = static_cast<SkThread_WinData*>(fData); 8196fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == winData->fHandle) { 82554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com return false; 83554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 84554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 85554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com if (winData->fStarted) { 86554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com return false; 87554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 88554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com winData->fStarted = -1 != ResumeThread(winData->fHandle); 89554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com return winData->fStarted; 90554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com} 91554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 92554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comvoid SkThread::join() { 93554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com SkThread_WinData* winData = static_cast<SkThread_WinData*>(fData); 9496fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == winData->fHandle || !winData->fStarted) { 95554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com return; 96554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 97554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 98554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com WaitForSingleObject(winData->fHandle, INFINITE); 99554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com} 1001ee76510f5dbf632d30975fc3509ef4f609156d2mtklein 1011ee76510f5dbf632d30975fc3509ef4f609156d2mtklein#endif//defined(SK_BUILD_FOR_WIN32) 102