ed
error_context.cpp
Go to the documentation of this file.
1 #include "ed/error_context.h"
2 
3 #include <pthread.h>
4 #include <iostream>
5 
6 namespace ed
7 {
8 
9 // ----------------------------------------------------------------------------------------------------
10 
11 namespace
12 {
13 
14 void dataDestructor(void* data)
15 {
16  ErrorContextData* edata = static_cast<ErrorContextData*>(data);
17  delete edata;
18 }
19 
20 struct KeyHolder
21 {
22 
23  KeyHolder() {
24  pthread_key_create(&key, &dataDestructor);
25  }
26 
27  pthread_key_t key;
28 
29 };
30 
31  static KeyHolder key;
32 
33 }
34 
35 // ----------------------------------------------------------------------------------------------------
36 
37 ErrorContext::ErrorContext(const char* msg, const char* value)
38 {
39  ErrorContextData* _data = data();
40  if (!_data)
41  {
42  _data = new ErrorContextData;
43  pthread_setspecific(key.key, _data);
44  }
45 
47 
48 }
49 
51 {
52  ErrorContextData* _data = data();
53  if (!_data)
54  return;
55 
56  _data->stack.pop_back();
57 }
58 
59 void ErrorContext::change(const char* msg, const char* value)
60 {
61  ErrorContextData* _data = data();
62  _data->stack.back() = std::pair<const char*, const char*>(msg, value);
63 }
64 
66 {
67  return static_cast<ErrorContextData*>(pthread_getspecific(key.key));
68 }
69 
70 }
std::pair
ed::ErrorContextData
Definition: error_context.h:9
ed::ErrorContext::data
static ErrorContextData * data()
Definition: error_context.cpp:65
std::vector::back
T back(T... args)
iostream
std::vector::push_back
T push_back(T... args)
ed::ErrorContextData::stack
std::vector< std::pair< const char *, const char * > > stack
Definition: error_context.h:11
std::vector::pop_back
T pop_back(T... args)
ed::ErrorContext::ErrorContext
ErrorContext(const char *msg, const char *value=0)
Definition: error_context.cpp:37
error_context.h
ed
Definition: convex_hull.h:8
std::data
T data(T... args)
ed::ErrorContext::~ErrorContext
~ErrorContext()
Definition: error_context.cpp:50
ed::ErrorContext::change
void change(const char *msg, const char *value=0)
Definition: error_context.cpp:59