gfx/skia/trunk/src/utils/SkThreadUtils_win.cpp

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

michael@0 1 /*
michael@0 2 * Copyright 2012 Google Inc.
michael@0 3 *
michael@0 4 * Use of this source code is governed by a BSD-style license that can be
michael@0 5 * found in the LICENSE file.
michael@0 6 */
michael@0 7
michael@0 8 #include "SkTypes.h"
michael@0 9
michael@0 10 #include "SkThreadUtils.h"
michael@0 11 #include "SkThreadUtils_win.h"
michael@0 12
michael@0 13 SkThread_WinData::SkThread_WinData(SkThread::entryPointProc entryPoint, void* data)
michael@0 14 : fHandle(NULL)
michael@0 15 , fParam(data)
michael@0 16 , fThreadId(0)
michael@0 17 , fEntryPoint(entryPoint)
michael@0 18 , fStarted(false)
michael@0 19 {
michael@0 20 fCancelEvent = CreateEvent(
michael@0 21 NULL, // default security attributes
michael@0 22 false, //auto reset
michael@0 23 false, //not signaled
michael@0 24 NULL); //no name
michael@0 25 }
michael@0 26
michael@0 27 SkThread_WinData::~SkThread_WinData() {
michael@0 28 CloseHandle(fCancelEvent);
michael@0 29 }
michael@0 30
michael@0 31 static DWORD WINAPI thread_start(LPVOID data) {
michael@0 32 SkThread_WinData* winData = static_cast<SkThread_WinData*>(data);
michael@0 33
michael@0 34 //See if this thread was canceled before starting.
michael@0 35 if (WaitForSingleObject(winData->fCancelEvent, 0) == WAIT_OBJECT_0) {
michael@0 36 return 0;
michael@0 37 }
michael@0 38
michael@0 39 winData->fEntryPoint(winData->fParam);
michael@0 40 return 0;
michael@0 41 }
michael@0 42
michael@0 43 SkThread::SkThread(entryPointProc entryPoint, void* data) {
michael@0 44 SkThread_WinData* winData = new SkThread_WinData(entryPoint, data);
michael@0 45 fData = winData;
michael@0 46
michael@0 47 if (NULL == winData->fCancelEvent) {
michael@0 48 return;
michael@0 49 }
michael@0 50
michael@0 51 winData->fHandle = CreateThread(
michael@0 52 NULL, // default security attributes
michael@0 53 0, // use default stack size
michael@0 54 thread_start, // thread function name (proxy)
michael@0 55 winData, // argument to thread function (proxy args)
michael@0 56 CREATE_SUSPENDED, // create suspended so affinity can be set
michael@0 57 &winData->fThreadId); // returns the thread identifier
michael@0 58 }
michael@0 59
michael@0 60 SkThread::~SkThread() {
michael@0 61 if (fData != NULL) {
michael@0 62 SkThread_WinData* winData = static_cast<SkThread_WinData*>(fData);
michael@0 63 // If created thread but start was never called, kill the thread.
michael@0 64 if (winData->fHandle != NULL && !winData->fStarted) {
michael@0 65 if (SetEvent(winData->fCancelEvent) != 0) {
michael@0 66 if (this->start()) {
michael@0 67 this->join();
michael@0 68 }
michael@0 69 } else {
michael@0 70 //kill with prejudice
michael@0 71 TerminateThread(winData->fHandle, -1);
michael@0 72 }
michael@0 73 }
michael@0 74 delete winData;
michael@0 75 }
michael@0 76 }
michael@0 77
michael@0 78 bool SkThread::start() {
michael@0 79 SkThread_WinData* winData = static_cast<SkThread_WinData*>(fData);
michael@0 80 if (NULL == winData->fHandle) {
michael@0 81 return false;
michael@0 82 }
michael@0 83
michael@0 84 if (winData->fStarted) {
michael@0 85 return false;
michael@0 86 }
michael@0 87 winData->fStarted = -1 != ResumeThread(winData->fHandle);
michael@0 88 return winData->fStarted;
michael@0 89 }
michael@0 90
michael@0 91 void SkThread::join() {
michael@0 92 SkThread_WinData* winData = static_cast<SkThread_WinData*>(fData);
michael@0 93 if (NULL == winData->fHandle || !winData->fStarted) {
michael@0 94 return;
michael@0 95 }
michael@0 96
michael@0 97 WaitForSingleObject(winData->fHandle, INFINITE);
michael@0 98 }
michael@0 99
michael@0 100 static unsigned int num_bits_set(DWORD_PTR mask) {
michael@0 101 unsigned int count;
michael@0 102 for (count = 0; mask; ++count) {
michael@0 103 mask &= mask - 1;
michael@0 104 }
michael@0 105 return count;
michael@0 106 }
michael@0 107
michael@0 108 static unsigned int nth_set_bit(unsigned int n, DWORD_PTR mask) {
michael@0 109 n %= num_bits_set(mask);
michael@0 110 for (unsigned int setBitsSeen = 0, currentBit = 0; true; ++currentBit) {
michael@0 111 if (mask & (static_cast<DWORD_PTR>(1) << currentBit)) {
michael@0 112 ++setBitsSeen;
michael@0 113 if (setBitsSeen > n) {
michael@0 114 return currentBit;
michael@0 115 }
michael@0 116 }
michael@0 117 }
michael@0 118 }
michael@0 119
michael@0 120 bool SkThread::setProcessorAffinity(unsigned int processor) {
michael@0 121 SkThread_WinData* winData = static_cast<SkThread_WinData*>(fData);
michael@0 122 if (NULL == winData->fHandle) {
michael@0 123 return false;
michael@0 124 }
michael@0 125
michael@0 126 DWORD_PTR processAffinityMask;
michael@0 127 DWORD_PTR systemAffinityMask;
michael@0 128 if (0 == GetProcessAffinityMask(GetCurrentProcess(),
michael@0 129 &processAffinityMask,
michael@0 130 &systemAffinityMask)) {
michael@0 131 return false;
michael@0 132 }
michael@0 133
michael@0 134 DWORD_PTR threadAffinityMask = 1 << nth_set_bit(processor, processAffinityMask);
michael@0 135 return 0 != SetThreadAffinityMask(winData->fHandle, threadAffinityMask);
michael@0 136 }

mercurial