blob: 742056198aaf1ebaae4ef898efc15526f406435b [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11// System independant wrapper for spawning threads
12// Note: the spawned thread will loop over the callback function until stopped.
13// Note: The callback function is expected to return every 2 seconds or more
14// often.
15
16#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_THREAD_WRAPPER_H_
17#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_THREAD_WRAPPER_H_
18
tommi@webrtc.orgb6817d72015-03-20 15:51:39 +000019#if defined(WEBRTC_WIN)
20#include <windows.h>
21#endif
22
tommi@webrtc.org361981f2015-03-19 14:44:18 +000023#include "webrtc/base/scoped_ptr.h"
phoglund@webrtc.orgec9c9422013-01-02 08:45:03 +000024#include "webrtc/common_types.h"
25#include "webrtc/typedefs.h"
pwestin@webrtc.orgb54d7272012-01-11 08:28:04 +000026
niklase@google.com470e71d2011-07-07 08:21:25 +000027namespace webrtc {
phoglund@webrtc.orgec9c9422013-01-02 08:45:03 +000028
phoglund@webrtc.orgc63f7882011-10-24 13:20:09 +000029// Callback function that the spawned thread will enter once spawned.
30// A return value of false is interpreted as that the function has no
31// more work to do and that the thread can be released.
tommi@webrtc.orgaef07792015-01-30 15:06:10 +000032typedef bool(*ThreadRunFunction)(void*);
niklase@google.com470e71d2011-07-07 08:21:25 +000033
phoglund@webrtc.orgec9c9422013-01-02 08:45:03 +000034enum ThreadPriority {
tommi@webrtc.orgb6817d72015-03-20 15:51:39 +000035#ifdef WEBRTC_WIN
36 kLowPriority = THREAD_PRIORITY_BELOW_NORMAL,
37 kNormalPriority = THREAD_PRIORITY_NORMAL,
38 kHighPriority = THREAD_PRIORITY_ABOVE_NORMAL,
39 kHighestPriority = THREAD_PRIORITY_HIGHEST,
40 kRealtimePriority = THREAD_PRIORITY_TIME_CRITICAL
41#else
phoglund@webrtc.orgec9c9422013-01-02 08:45:03 +000042 kLowPriority = 1,
43 kNormalPriority = 2,
44 kHighPriority = 3,
45 kHighestPriority = 4,
46 kRealtimePriority = 5
tommi@webrtc.orgb6817d72015-03-20 15:51:39 +000047#endif
niklase@google.com470e71d2011-07-07 08:21:25 +000048};
49
tommi@webrtc.orgaef07792015-01-30 15:06:10 +000050// Represents a simple worker thread. The implementation must be assumed
51// to be single threaded, meaning that all methods of the class, must be
52// called from the same thread, including instantiation.
tommi@webrtc.org361981f2015-03-19 14:44:18 +000053// TODO(tommi): There's no need for this to be a virtual interface since there's
54// only ever a single implementation of it.
phoglund@webrtc.orgec9c9422013-01-02 08:45:03 +000055class ThreadWrapper {
56 public:
tommi@webrtc.orgaef07792015-01-30 15:06:10 +000057 virtual ~ThreadWrapper() {}
niklase@google.com470e71d2011-07-07 08:21:25 +000058
phoglund@webrtc.orgec9c9422013-01-02 08:45:03 +000059 // Factory method. Constructor disabled.
60 //
61 // func Pointer to a, by user, specified callback function.
62 // obj Object associated with the thread. Passed in the callback
63 // function.
64 // prio Thread priority. May require root/admin rights.
65 // thread_name NULL terminated thread name, will be visable in the Windows
66 // debugger.
tommi@webrtc.org361981f2015-03-19 14:44:18 +000067 static rtc::scoped_ptr<ThreadWrapper> CreateThread(ThreadRunFunction func,
tommi@webrtc.orgb6817d72015-03-20 15:51:39 +000068 void* obj, const char* thread_name);
pwestin@webrtc.orgb54d7272012-01-11 08:28:04 +000069
tommi@webrtc.orgaef07792015-01-30 15:06:10 +000070 // Get the current thread's thread ID.
71 // NOTE: This is a static method. It returns the id of the calling thread,
72 // *not* the id of the worker thread that a ThreadWrapper instance represents.
73 // TODO(tommi): Move outside of the ThreadWrapper class to avoid confusion.
phoglund@webrtc.orgec9c9422013-01-02 08:45:03 +000074 static uint32_t GetThreadId();
niklase@google.com470e71d2011-07-07 08:21:25 +000075
phoglund@webrtc.orgec9c9422013-01-02 08:45:03 +000076 // Tries to spawns a thread and returns true if that was successful.
77 // Additionally, it tries to set thread priority according to the priority
78 // from when CreateThread was called. However, failure to set priority will
79 // not result in a false return value.
pbos@webrtc.org86639732015-03-13 00:06:21 +000080 virtual bool Start() = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000081
phoglund@webrtc.orgec9c9422013-01-02 08:45:03 +000082 // Stops the spawned thread and waits for it to be reclaimed with a timeout
83 // of two seconds. Will return false if the thread was not reclaimed.
84 // Multiple tries to Stop are allowed (e.g. to wait longer than 2 seconds).
85 // It's ok to call Stop() even if the spawned thread has been reclaimed.
86 virtual bool Stop() = 0;
tommi@webrtc.orgb6817d72015-03-20 15:51:39 +000087
88 // Set the priority of the worker thread. Must be called when thread
89 // is running.
90 virtual bool SetPriority(ThreadPriority priority) = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000091};
phoglund@webrtc.orgec9c9422013-01-02 08:45:03 +000092
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +000093} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +000094
phoglund@webrtc.orgec9c9422013-01-02 08:45:03 +000095#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_THREAD_WRAPPER_H_