Coverage Report

Created: 2026-11-12 07:19

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dcmtk/oflog/libsrc/pointer.cc
Line
Count
Source
1
// Module:  Log4CPLUS
2
// File:    pointer.cxx
3
// Created: 6/2001
4
// Author:  Tad E. Smith
5
//
6
//
7
// Copyright 2001-2010 Tad E. Smith
8
//
9
// Licensed under the Apache License, Version 2.0 (the "License");
10
// you may not use this file except in compliance with the License.
11
// You may obtain a copy of the License at
12
//
13
//     http://www.apache.org/licenses/LICENSE-2.0
14
//
15
// Unless required by applicable law or agreed to in writing, software
16
// distributed under the License is distributed on an "AS IS" BASIS,
17
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
// See the License for the specific language governing permissions and
19
// limitations under the License.
20
21
#include "dcmtk/oflog/streams.h"
22
#include "dcmtk/oflog/helpers/pointer.h"
23
#include "dcmtk/oflog/thread/threads.h"
24
#include "dcmtk/oflog/thread/impl/syncimpl.h"
25
#include "dcmtk/oflog/config/windowsh.h"
26
#include <cassert>
27
#if defined (DCMTK_LOG4CPLUS_HAVE_INTRIN_H)
28
#include <intrin.h>
29
#endif
30
31
32
namespace dcmtk {
33
namespace log4cplus { namespace helpers {
34
35
36
///////////////////////////////////////////////////////////////////////////////
37
// log4cplus::helpers::SharedObject dtor
38
///////////////////////////////////////////////////////////////////////////////
39
40
SharedObject::~SharedObject()
41
0
{
42
0
    assert(count == 0);
43
0
}
44
45
46
47
///////////////////////////////////////////////////////////////////////////////
48
// log4cplus::helpers::SharedObject public methods
49
///////////////////////////////////////////////////////////////////////////////
50
51
void
52
SharedObject::addReference() const
53
132
{
54
#if defined (DCMTK_LOG4CPLUS_SINGLE_THREADED)
55
    ++count;
56
57
#elif defined (DCMTK_LOG4CPLUS_HAVE_CXX11_ATOMICS)
58
    STD_NAMESPACE atomic_fetch_add_explicit (&count, 1u,
59
        STD_NAMESPACE memory_order_relaxed);
60
61
#elif defined (DCMTK_LOG4CPLUS_HAVE___SYNC_ADD_AND_FETCH)
62
    __sync_add_and_fetch (&count, 1);
63
64
#elif defined (_WIN32) && defined (DCMTK_LOG4CPLUS_HAVE_INTRIN_H)
65
    _InterlockedIncrement (&count);
66
67
#elif defined (_WIN32)
68
    InterlockedIncrement (&count);
69
70
#else
71
    thread::MutexGuard guard (access_mutex);
72
    ++count;
73
74
#endif
75
132
}
76
77
78
void
79
SharedObject::removeReference() const
80
64
{
81
64
    assert (count > 0);
82
64
    bool destroy;
83
84
#if defined (DCMTK_LOG4CPLUS_SINGLE_THREADED)
85
    destroy = --count == 0;
86
87
#elif defined (DCMTK_LOG4CPLUS_HAVE_CXX11_ATOMICS)
88
    destroy = STD_NAMESPACE atomic_fetch_sub_explicit (&count, 1u,
89
        STD_NAMESPACE memory_order_release) == 1;
90
    if (DCMTK_LOG4CPLUS_UNLIKELY (destroy))
91
        STD_NAMESPACE atomic_thread_fence (STD_NAMESPACE memory_order_acquire);
92
93
#elif defined (DCMTK_LOG4CPLUS_HAVE___SYNC_SUB_AND_FETCH)
94
    destroy = __sync_sub_and_fetch (&count, 1) == 0;
95
96
#elif defined (_WIN32) && defined (DCMTK_LOG4CPLUS_HAVE_INTRIN_H)
97
    destroy = _InterlockedDecrement (&count) == 0;
98
99
#elif defined (_WIN32)
100
    destroy = InterlockedDecrement (&count) == 0;
101
102
#else
103
    {
104
        thread::MutexGuard guard (access_mutex);
105
        destroy = --count == 0;
106
    }
107
108
#endif
109
64
    if (DCMTK_LOG4CPLUS_UNLIKELY (destroy))
110
0
        delete this;
111
64
}
112
113
114
} } // namespace log4cplus { namespace helpers
115
} // end namespace dcmtk