1 | /* |
2 | Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file |
3 | |
4 | This file is part of libzmq, the ZeroMQ core engine in C++. |
5 | |
6 | libzmq is free software; you can redistribute it and/or modify it under |
7 | the terms of the GNU Lesser General Public License (LGPL) as published |
8 | by the Free Software Foundation; either version 3 of the License, or |
9 | (at your option) any later version. |
10 | |
11 | As a special exception, the Contributors give you permission to link |
12 | this library with independent modules to produce an executable, |
13 | regardless of the license terms of these independent modules, and to |
14 | copy and distribute the resulting executable under terms of your choice, |
15 | provided that you also meet, for each linked independent module, the |
16 | terms and conditions of the license of that module. An independent |
17 | module is a module which is not derived from or based on this library. |
18 | If you modify this library, you must extend this exception to your |
19 | version of the library. |
20 | |
21 | libzmq is distributed in the hope that it will be useful, but WITHOUT |
22 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
23 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
24 | License for more details. |
25 | |
26 | You should have received a copy of the GNU Lesser General Public License |
27 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
28 | */ |
29 | |
30 | #ifndef __ZMQ_THREAD_HPP_INCLUDED__ |
31 | #define __ZMQ_THREAD_HPP_INCLUDED__ |
32 | |
33 | #if defined ZMQ_HAVE_VXWORKS |
34 | #include <vxWorks.h> |
35 | #include <taskLib.h> |
36 | #elif !defined ZMQ_HAVE_WINDOWS |
37 | #include <pthread.h> |
38 | #endif |
39 | #include <set> |
40 | #include <cstring> |
41 | |
42 | namespace zmq |
43 | { |
44 | typedef void(thread_fn) (void *); |
45 | |
46 | // Class encapsulating OS thread. Thread initiation/termination is done |
47 | // using special functions rather than in constructor/destructor so that |
48 | // thread isn't created during object construction by accident, causing |
49 | // newly created thread to access half-initialised object. Same applies |
50 | // to the destruction process: Thread should be terminated before object |
51 | // destruction begins, otherwise it can access half-destructed object. |
52 | |
53 | class thread_t |
54 | { |
55 | public: |
56 | inline thread_t () : |
57 | _tfn (NULL), |
58 | _arg (NULL), |
59 | _started (false), |
60 | _thread_priority (ZMQ_THREAD_PRIORITY_DFLT), |
61 | _thread_sched_policy (ZMQ_THREAD_SCHED_POLICY_DFLT) |
62 | { |
63 | memset (_name, 0, sizeof (_name)); |
64 | } |
65 | |
66 | #ifdef ZMQ_HAVE_VXWORKS |
67 | ~thread_t () |
68 | { |
69 | if (descriptor != NULL || descriptor > 0) { |
70 | taskDelete (descriptor); |
71 | } |
72 | } |
73 | #endif |
74 | |
75 | // Creates OS thread. 'tfn' is main thread function. It'll be passed |
76 | // 'arg' as an argument. |
77 | // Name is 16 characters max including terminating NUL. Thread naming is |
78 | // implemented only for pthread, and windows when a debugger is attached. |
79 | void start (thread_fn *tfn_, void *arg_, const char *name_); |
80 | |
81 | // Returns whether the thread was started, i.e. start was called. |
82 | bool get_started () const; |
83 | |
84 | // Returns whether the executing thread is the thread represented by the |
85 | // thread object. |
86 | bool is_current_thread () const; |
87 | |
88 | // Waits for thread termination. |
89 | void stop (); |
90 | |
91 | // Sets the thread scheduling parameters. Only implemented for |
92 | // pthread. Has no effect on other platforms. |
93 | void setSchedulingParameters (int priority_, |
94 | int scheduling_policy_, |
95 | const std::set<int> &affinity_cpus_); |
96 | |
97 | // These are internal members. They should be private, however then |
98 | // they would not be accessible from the main C routine of the thread. |
99 | void applySchedulingParameters (); |
100 | void applyThreadName (); |
101 | thread_fn *_tfn; |
102 | void *_arg; |
103 | char _name[16]; |
104 | |
105 | private: |
106 | bool _started; |
107 | |
108 | #ifdef ZMQ_HAVE_WINDOWS |
109 | HANDLE _descriptor; |
110 | #if defined _WIN32_WCE |
111 | DWORD _thread_id; |
112 | #else |
113 | unsigned int _thread_id; |
114 | #endif |
115 | #elif defined ZMQ_HAVE_VXWORKS |
116 | int _descriptor; |
117 | enum |
118 | { |
119 | DEFAULT_PRIORITY = 100, |
120 | DEFAULT_OPTIONS = 0, |
121 | DEFAULT_STACK_SIZE = 4000 |
122 | }; |
123 | #else |
124 | pthread_t _descriptor; |
125 | #endif |
126 | |
127 | // Thread scheduling parameters. |
128 | int _thread_priority; |
129 | int _thread_sched_policy; |
130 | std::set<int> _thread_affinity_cpus; |
131 | |
132 | ZMQ_NON_COPYABLE_NOR_MOVABLE (thread_t) |
133 | }; |
134 | } |
135 | |
136 | #endif |
137 | |