libzypp  17.38.7
threaddata.cc
Go to the documentation of this file.
1 #include "private/threaddata_p.h"
4 #include <ostream> //for std::endl
5 #include <sstream>
6 #include <pthread.h>
7 
8 namespace zyppng
9 {
11  : _threadId( std::this_thread::get_id() ),
12  _nativeHandle( pthread_self() )
13  {
14  }
15 
17  {
18  static thread_local ThreadData data;
19  return data;
20  }
21 
22  const std::string &ThreadData::name() const
23  {
24  if ( _threadName.empty() ) {
25  std::stringstream strStr;
26  strStr << _threadId;
27  _threadName = strStr.str();
28  }
29  return _threadName;
30  }
31 
32  std::shared_ptr<EventDispatcher> ThreadData::ensureDispatcher( GMainContext *ctx )
33  {
34  auto sp = _dispatcher.lock();
35  if (!sp) {
36  MIL << "Creating the Event Dispatcher for thread: " << name() << "("<<_threadId<<")" << std::endl;
38  } else {
39  if ( ctx && ctx != sp->glibContext() ) MIL << "Ignoring passed GMainContext, because a Zypp Event Dispatcher was created before. This might be a bug!" << std::endl;
40  }
41  return sp;
42  }
43 
44  void ThreadData::setDispatcher( const std::shared_ptr<EventDispatcher> &disp )
45  {
46  if ( _dispatcher.lock() ) {
47  WAR << "Dispatcher was already created for the current thread" << std::endl;
48  return;
49  }
50  _dispatcher = disp;
51  }
52 
54  {
55  // length is restricted to 16 characters, including the terminating null byte ('\0')
56  pthread_setname_np( _nativeHandle, name().substr(0,15).c_str() );
57  }
58 
59  std::shared_ptr<EventDispatcher> ThreadData::dispatcher() {
60  auto sp = _dispatcher.lock();
61  if (!sp) {
62  MIL << "Requested Event Dispatcher for thread: " << name() << "("<<_threadId<<") but none was created." << std::endl;
63  }
64  return sp;
65  }
66 } // namespace zyppng
#define MIL
Definition: Logger.h:103
std::thread::id _threadId
Definition: threaddata_p.h:37
std::string _threadName
lazy initialized to _threadId if unset
Definition: threaddata_p.h:38
const std::string & name() const
Definition: threaddata.cc:22
Definition: ansi.h:854
std::shared_ptr< EventDispatcher > dispatcher()
Definition: threaddata.cc:59
std::thread::native_handle_type _nativeHandle
Definition: threaddata_p.h:39
std::shared_ptr< EventDispatcher > ensureDispatcher(GMainContext *ctx=0)
Definition: threaddata.cc:32
#define WAR
Definition: Logger.h:104
std::weak_ptr< EventDispatcher > _dispatcher
Definition: threaddata_p.h:40
static ZYPP_API ThreadData & current()
Definition: threaddata.cc:16
static std::shared_ptr< EventDispatcher > create(GMainContext *ctx=0)
void setDispatcher(const std::shared_ptr< EventDispatcher > &disp)
Definition: threaddata.cc:44
struct _GMainContext GMainContext