1a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* 2a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * 4a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Use of this source code is governed by a BSD-style license 5a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * that can be found in the LICENSE file in the root of the source 6a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * tree. An additional intellectual property rights grant can be found 7a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * in the file PATENTS. All contributing project authors may 8a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * be found in the AUTHORS file in the root of the source tree. 9a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */ 10a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 11a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_THREAD_WINDOWS_H_ 12a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_THREAD_WINDOWS_H_ 13a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 14a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "thread_wrapper.h" 15a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "event_wrapper.h" 16a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "critical_section_wrapper.h" 17a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 18a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include <windows.h> 19a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 20a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinnamespace webrtc { 21a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 22a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinclass ThreadWindows : public ThreadWrapper 23a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 24a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinpublic: 25a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ThreadWindows(ThreadRunFunction func, ThreadObj obj, ThreadPriority prio, 26a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin const char* threadName); 27a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin virtual ~ThreadWindows(); 28a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 29a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin virtual bool Start(unsigned int& id); 30a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin bool SetAffinity(const int* processorNumbers, 31a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin const unsigned int amountOfProcessors); 32a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin virtual bool Stop(); 33a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin virtual void SetNotAlive(); 34a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 35a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin static unsigned int WINAPI StartThread(LPVOID lpParameter); 36a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 37a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin virtual bool Shutdown(); 38a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 39a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinprotected: 40a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin virtual void Run(); 41a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 42a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinprivate: 43a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ThreadRunFunction _runFunction; 44a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ThreadObj _obj; 45a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 46a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin bool _alive; 47a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin bool _dead; 48a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 49a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin // TODO (hellner) 50a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin // _doNotCloseHandle member seem pretty redundant. Should be able to remove 51a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin // it. Basically it should be fine to reclaim the handle when calling stop 52a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin // and in the destructor. 53a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin bool _doNotCloseHandle; 54a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ThreadPriority _prio; 55a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin EventWrapper* _event; 56a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin CriticalSectionWrapper* _critsectStop; 57a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 58a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin HANDLE _thread; 59a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin unsigned int _id; 60a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin char _name[kThreadMaxNameLength]; 61a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin bool _setThreadName; 62a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 63a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin}; 64a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} // namespace webrtc 65a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 66a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_THREAD_WINDOWS_H_ 67