This is Unofficial EPICS BASE Doxygen Site
thread.cpp
Go to the documentation of this file.
1 /* thread.h */
2 /*
3  * Copyright information and license terms for this software can be
4  * found in the file LICENSE that is included with the distribution
5  */
6 
7 #include <epicsThread.h>
8 #define epicsExportSharedSymbols
9 #include <pv/thread.h>
10 #include <pv/reftrack.h>
11 
12 namespace epics { namespace pvData {
13 
14 namespace detail {
15 struct FuncRunner : public epicsThreadRunable
16 {
17  typedef void (*fn_t)(void*);
19  void *arg;
20  FuncRunner(fn_t f, void *a) :fn(f), arg(a) {}
21  virtual ~FuncRunner(){}
22  virtual void run()
23  {
24  (*fn)(arg);
25  }
26 };
27 #if __cplusplus>=201103L
28 struct BindRunner : public epicsThreadRunable
29 {
30  typedef std::function<void()> fn_t;
31  fn_t fn;
32  BindRunner(fn_t&& f) : fn(std::move(f)) {}
33  virtual ~BindRunner() {}
34  virtual void run()
35  {
36  fn();
37  }
38 };
39 #endif
40 } // detail
41 
42 
43 Runnable& Thread::Config::x_getrunner()
44 {
45  if(!this->p_runner)
46  throw std::logic_error("Thread::Config missing run()");
47  return *this->p_runner;
48 }
49 
50 void Thread::Config::x_setdefault()
51 {
52  this->p_prio = epicsThreadPriorityLow;
53  this->p_autostart = true;
54  this->p_runner = NULL;
55  (*this).stack(epicsThreadStackBig);
56 }
57 
59 
60 Thread::Config::Config() {this->x_setdefault();}
61 
62 Thread::Config::Config(Runnable *r) {this->x_setdefault();this->run(r);}
63 
64 Thread::Config::Config(void(*fn)(void*), void *ptr) {this->x_setdefault();this->run(fn, ptr);}
65 
66 #if __cplusplus>=201103L
67 Thread::Config::Config(std::function<void()>&& fn) {this->x_setdefault();this->run(std::move(fn));}
68 #endif
69 
70 Thread::Config& Thread::Config::name(const std::string& n)
71 { this->p_strm.str(n); return *this; }
72 
74 { this->p_prio = p; return *this; }
75 
77 { this->p_stack = epicsThreadGetStackSize(s); return *this; }
78 
80 { this->p_autostart = a; return *this; }
81 
83 { this->p_runner = r; return *this; }
84 
85 Thread::Config& Thread::Config::run(void(*fn)(void*), void *ptr)
86 {
87  this->p_owned_runner.reset(new detail::FuncRunner(fn, ptr));
88  this->p_runner = this->p_owned_runner.get();
89  return *this;
90 }
91 
92 #if __cplusplus>=201103L
93 Thread::Config& Thread::Config::run(std::function<void()> &&fn)
94 {
95  this->p_owned_runner.reset(new detail::BindRunner(std::move(fn)));
96  this->p_runner = this->p_owned_runner.get();
97  return *this;
98 }
99 #endif
100 
101 Thread::Thread(std::string name,
102  ThreadPriority priority,
103  Runnable *runnable,
105  :epicsThread(*runnable,
106  name.c_str(),
107  epicsThreadGetStackSize(stkcls),
108  priority)
109 {
110  REFTRACE_INCREMENT(num_instances);
111  this->start();
112 }
113 
115  std::string name,
116  unsigned int stksize,
117  unsigned int priority)
118  :epicsThread(runnable,
119  name.c_str(),
120  stksize,
121  priority)
122 {
123  REFTRACE_INCREMENT(num_instances);
124  this->start();
125 }
126 
128  :epicsThread(c.x_getrunner(), c.p_strm.str().c_str(),
129  c.p_stack, c.p_prio)
130 {
131  REFTRACE_INCREMENT(num_instances);
132 #if __cplusplus>=201103L
133  p_owned = std::move(c.p_owned_runner);
134 #else
135  p_owned = c.p_owned_runner;
136 #endif
137  if(c.p_autostart)
138  this->start();
139 }
140 
142 {
143  this->exitWait();
144  REFTRACE_DECREMENT(num_instances);
145 }
146 
147 }} // epics::pvData
static size_t num_instances
Definition: thread.h:192
Config & stack(epicsThreadStackSizeClass s)
Definition: thread.cpp:76
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
#define NULL
Definition: catime.c:38
Config & prio(unsigned int p)
Definition: thread.cpp:73
#define str(v)
Config & name(const std::string &n)
Definition: thread.cpp:70
LIBCOM_API unsigned int epicsStdCall epicsThreadGetStackSize(epicsThreadStackSizeClass size)
Definition: osdThread.c:466
epicsThreadStackSizeClass
Definition: epicsThread.h:89
FuncRunner(fn_t f, void *a)
Definition: thread.cpp:20
#define epicsThreadPriorityLow
Definition: epicsThread.h:75
Create a new thread using the given.
Definition: thread.h:95
Thread(std::string name, ThreadPriority priority, Runnable *runnable, epicsThreadStackSizeClass stkcls=epicsThreadStackBig)
Definition: thread.cpp:101
Config & autostart(bool a)
Definition: thread.cpp:79
C++ and C descriptions for a thread.
epicsThreadRunable Runnable
Definition: thread.h:43
Config & run(Runnable *r)
Thread will execute Runnable::run()
Definition: thread.cpp:82