1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
2a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
4e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  Use of this source code is governed by a BSD-style license
5e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  that can be found in the LICENSE file in the root of the source
6e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  tree. An additional intellectual property rights grant can be found
7e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  in the file PATENTS.  All contributing project authors may
8e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  be found in the AUTHORS file in the root of the source tree.
9e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
10e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
11c55a96383497a772a307b346368133960b02ad03Eric Laurent#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_THREAD_POSIX_H_
12c55a96383497a772a307b346368133960b02ad03Eric Laurent#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_THREAD_POSIX_H_
13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "thread_wrapper.h"
15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include <pthread.h>
16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentnamespace webrtc {
18a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
19a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinclass CriticalSectionWrapper;
20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass EventWrapper;
21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
22c55a96383497a772a307b346368133960b02ad03Eric Laurentclass ThreadPosix : public ThreadWrapper
23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentpublic:
25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    static ThreadWrapper* Create(ThreadRunFunction func, ThreadObj obj,
26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                 ThreadPriority prio, const char* threadName);
27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
28c55a96383497a772a307b346368133960b02ad03Eric Laurent    ThreadPosix(ThreadRunFunction func, ThreadObj obj, ThreadPriority prio,
29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                const char* threadName);
30c55a96383497a772a307b346368133960b02ad03Eric Laurent    ~ThreadPosix();
31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // From ThreadWrapper
33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    virtual void SetNotAlive();
34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    virtual bool Start(unsigned int& id);
35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // Not implemented on Mac
36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    virtual bool SetAffinity(const int* processorNumbers,
37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                             unsigned int amountOfProcessors);
38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    virtual bool Stop();
39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    virtual bool Shutdown();
40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    void Run();
42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentprivate:
44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int Construct();
45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentprivate:
47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // processing function
48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ThreadRunFunction   _runFunction;
49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ThreadObj           _obj;
50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // internal state
52a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    CriticalSectionWrapper* _crit_state;  // Protects _alive and _dead
53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    bool                    _alive;
54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    bool                    _dead;
55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ThreadPriority          _prio;
56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    EventWrapper*           _event;
57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // zero-terminated thread name string
59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    char                    _name[kThreadMaxNameLength];
60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    bool                    _setThreadName;
61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // handle to thread
63a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#if (defined(WEBRTC_LINUX) || defined(WEBRTC_ANDROID))
64a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    pid_t                   _pid;
65a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif
66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    pthread_attr_t          _attr;
67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    pthread_t               _thread;
68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent};
69e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} // namespace webrtc
70e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
71c55a96383497a772a307b346368133960b02ad03Eric Laurent#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_THREAD_POSIX_H_
72