summaryrefslogtreecommitdiff
path: root/ACE/ace/Log_Category.cpp
blob: 58dcc538ab6567beb11d618e2ed61126a90bf1c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// $Id$

#include "ace/Log_Msg.h"
#include "ace/Log_Category.h"
#include "ace/Atomic_Op.h"
#include "ace/OS_NS_Thread.h"


#if !defined (__ACE_INLINE__)
#include "ace/Log_Category.inl"
#endif /* __ACE_INLINE__ */


ACE_BEGIN_VERSIONED_NAMESPACE_DECL

ACE_Log_Category::ACE_Log_Category(const char* name)
  : name_(name)
  , id_(0)
/// Default per-process priority mask
/// By default, all priorities are enabled.
  , priority_mask_(LM_SHUTDOWN
                   | LM_TRACE
                   | LM_DEBUG
                   | LM_INFO
                   | LM_NOTICE
                   | LM_WARNING
                   | LM_STARTUP
                   | LM_ERROR
                   | LM_CRITICAL
                   | LM_ALERT
                   | LM_EMERGENCY)
  , per_thr_obj_(this, 0)
{
}

ACE_Log_Category::~ACE_Log_Category()
{
#if defined (ACE_HAS_THREADS)
  ACE_GUARD (ACE_Thread_Mutex, ace_mon, this->keylock_);

  if (this->id_ > 0)
    {
      ACE_OS::thr_keyfree (this->key_);
    }
#endif
}

ACE_Log_Category_TSS::ACE_Log_Category_TSS(ACE_Log_Category* category, ACE_Log_Msg* logger)
  : category_(category)
  , logger_(logger)
  , priority_mask_(0)
{
}

ACE_Log_Category_TSS*
ACE_Log_Category::per_thr_obj()
{
#if defined (ACE_HAS_THREADS)
  {
    // Ensure that we are serialized!
    ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, this->keylock_, 0);

    // make sure we only create the key once!
    if (this->id_ == 0)
      {
        static ACE_Atomic_Op<ACE_Thread_Mutex, unsigned int> log_category_id_assigner(1);
        id_ = log_category_id_assigner++; // for atomic integers, post increment is more efficient

        if (ACE_OS::thr_keycreate (&this->key_,
                                   &ACE_Log_Category::tss_destroy) != 0)
          return 0; // Major problems, this should *never* happen!
      }
  }

  void *temp = 0;
  if (ACE_OS::thr_getspecific (this->key_, &temp) == -1)
    {
      return 0; // This should not happen!
    }
  if (temp != 0)
    return static_cast <ACE_Log_Category_TSS *> (temp);

  ACE_Log_Category_TSS * result;

  ACE_NEW_RETURN(result,
                 ACE_Log_Category_TSS(this, ACE_Log_Msg::instance()),
                 0);

 if (ACE_OS::thr_setspecific (this->key_,
                              result) != 0)
   {
     return 0;
   }

  return result;
#else // defined (ACE_HAS_THREADS)
  if (this->id_ == 0) {
    static unsigned int log_category_id_assigner = 0;
    id_ = log_category_id_assigner++;
    per_thr_obj_.logger_ = ACE_Log_Msg::instance();
  }
  return &per_thr_obj_;
#endif // defined (ACE_HAS_THREADS)
}

#if defined (ACE_HAS_THREADS)
void
ACE_Log_Category::tss_destroy(void * p)
{
  delete static_cast<ACE_Log_Category_TSS*>(p);
}
#endif // defined (ACE_HAS_THREADS)

ACE_Log_Category&
ACE_Log_Category::ace_lib()
{
  static ACE_Log_Category ace_lib_category("ACE");
  return ace_lib_category;
}

ACE_END_VERSIONED_NAMESPACE_DECL