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