Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright Contributors to the OpenVDB Project | ||
2 | // SPDX-License-Identifier: MPL-2.0 | ||
3 | |||
4 | #include "openvdb.h" | ||
5 | #include "io/DelayedLoadMetadata.h" | ||
6 | #include "points/PointDataGrid.h" | ||
7 | #include "tools/PointIndexGrid.h" | ||
8 | #include "util/logging.h" | ||
9 | |||
10 | #include <atomic> | ||
11 | #include <mutex> | ||
12 | |||
13 | #ifdef OPENVDB_USE_BLOSC | ||
14 | #include <blosc.h> | ||
15 | #endif | ||
16 | |||
17 | #if OPENVDB_ABI_VERSION_NUMBER <= 6 | ||
18 | #error ABI <= 6 is no longer supported | ||
19 | #endif | ||
20 | |||
21 | // If using an OPENVDB_ABI_VERSION_NUMBER that has been deprecated, issue an | ||
22 | // error directive. This can be optionally suppressed by defining: | ||
23 | // OPENVDB_USE_DEPRECATED_ABI_<VERSION>=ON. | ||
24 | #ifndef OPENVDB_USE_DEPRECATED_ABI_7 | ||
25 | #if OPENVDB_ABI_VERSION_NUMBER == 7 | ||
26 | #error ABI = 7 is deprecated, CMake option OPENVDB_USE_DEPRECATED_ABI_7 suppresses this error | ||
27 | #endif | ||
28 | #endif | ||
29 | #ifndef OPENVDB_USE_DEPRECATED_ABI_8 | ||
30 | #if OPENVDB_ABI_VERSION_NUMBER == 8 | ||
31 | #error ABI = 8 is deprecated, CMake option OPENVDB_USE_DEPRECATED_ABI_8 suppresses this error | ||
32 | #endif | ||
33 | #endif | ||
34 | |||
35 | // If using a future OPENVDB_ABI_VERSION_NUMBER, issue an error directive. | ||
36 | // This can be optionally suppressed by defining: | ||
37 | // OPENVDB_USE_FUTURE_ABI_<VERSION>=ON. | ||
38 | #ifndef OPENVDB_USE_FUTURE_ABI_10 | ||
39 | #if OPENVDB_ABI_VERSION_NUMBER == 10 | ||
40 | #error ABI = 10 is still in active development and has not been finalized, \ | ||
41 | CMake option OPENVDB_USE_FUTURE_ABI_10 suppresses this error | ||
42 | #endif | ||
43 | #endif | ||
44 | |||
45 | namespace openvdb { | ||
46 | OPENVDB_USE_VERSION_NAMESPACE | ||
47 | namespace OPENVDB_VERSION_NAME { | ||
48 | |||
49 | namespace { | ||
50 | // Declare this at file scope to ensure thread-safe initialization. | ||
51 | std::mutex sInitMutex; | ||
52 | std::atomic<bool> sIsInitialized{false}; | ||
53 | } | ||
54 | |||
55 | /// @todo Change registerX() methods to simply be register()... | ||
56 |
1/2✓ Branch 11 taken 323 times.
✗ Branch 12 not taken.
|
1292 | template <typename GridT> struct RegisterGrid { inline void operator()() { GridT::registerGrid(); } }; |
57 |
2/4✓ Branch 17 taken 323 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 323 times.
✗ Branch 21 not taken.
|
1938 | template <typename MetaT> struct RegisterMeta { inline void operator()() { MetaT::registerType(); } }; |
58 |
1/2✓ Branch 8 taken 323 times.
✗ Branch 9 not taken.
|
969 | template <typename MapT> struct RegisterMap { inline void operator()() { MapT::registerMap(); } }; |
59 | |||
60 | void | ||
61 |
2/2✓ Branch 0 taken 323 times.
✓ Branch 1 taken 17 times.
|
340 | initialize() |
62 | { | ||
63 |
2/2✓ Branch 0 taken 323 times.
✓ Branch 1 taken 17 times.
|
340 | if (sIsInitialized.load(std::memory_order_acquire)) return; |
64 | std::lock_guard<std::mutex> lock(sInitMutex); | ||
65 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 323 times.
|
323 | if (sIsInitialized.load(std::memory_order_acquire)) return; // Double-checked lock |
66 | |||
67 | logging::initialize(); | ||
68 | |||
69 | // Register metadata. | ||
70 |
1/2✓ Branch 1 taken 323 times.
✗ Branch 2 not taken.
|
323 | Metadata::clearRegistry(); |
71 | MetaTypes::foreach<RegisterMeta>(); | ||
72 | |||
73 | // Register maps | ||
74 |
1/2✓ Branch 1 taken 323 times.
✗ Branch 2 not taken.
|
323 | math::MapRegistry::clear(); |
75 | MapTypes::foreach<RegisterMap>(); | ||
76 | |||
77 | // Register common grid types. | ||
78 |
1/2✓ Branch 1 taken 323 times.
✗ Branch 2 not taken.
|
323 | GridBase::clearRegistry(); |
79 | GridTypes::foreach<RegisterGrid>(); | ||
80 | |||
81 | // @note String grids types are deprecated but we still register them | ||
82 | // as supported serializable types for backward compatibility. This | ||
83 | // will likely be removed in a future major version | ||
84 | OPENVDB_NO_DEPRECATION_WARNING_BEGIN | ||
85 |
1/2✓ Branch 1 taken 323 times.
✗ Branch 2 not taken.
|
323 | StringGrid::registerGrid(); |
86 | OPENVDB_NO_DEPRECATION_WARNING_END | ||
87 | |||
88 | // Register types associated with point index grids. | ||
89 |
2/4✓ Branch 1 taken 323 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 323 times.
✗ Branch 5 not taken.
|
323 | Metadata::registerType(typeNameAsString<PointIndex32>(), Int32Metadata::createMetadata); |
90 |
2/4✓ Branch 1 taken 323 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 323 times.
✗ Branch 5 not taken.
|
323 | Metadata::registerType(typeNameAsString<PointIndex64>(), Int64Metadata::createMetadata); |
91 | |||
92 | // Register types associated with point data grids. | ||
93 |
1/2✓ Branch 1 taken 323 times.
✗ Branch 2 not taken.
|
323 | points::internal::initialize(); |
94 | |||
95 | #ifdef OPENVDB_USE_BLOSC | ||
96 |
1/2✓ Branch 1 taken 323 times.
✗ Branch 2 not taken.
|
323 | blosc_init(); |
97 |
2/4✓ Branch 1 taken 323 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 323 times.
|
323 | if (blosc_set_compressor("lz4") < 0) { |
98 | OPENVDB_LOG_WARN("Blosc LZ4 compressor is unavailable"); | ||
99 | } | ||
100 | /// @todo blosc_set_nthreads(int nthreads); | ||
101 | #endif | ||
102 | |||
103 | #ifdef __ICC | ||
104 | // Disable ICC "assignment to statically allocated variable" warning. | ||
105 | // This assignment is mutex-protected and therefore thread-safe. | ||
106 | __pragma(warning(disable:1711)) | ||
107 | #endif | ||
108 | |||
109 | sIsInitialized.store(true, std::memory_order_release); | ||
110 | |||
111 | #ifdef __ICC | ||
112 | __pragma(warning(default:1711)) | ||
113 | #endif | ||
114 | } | ||
115 | |||
116 | |||
117 | void | ||
118 | 342 | uninitialize() | |
119 | { | ||
120 | std::lock_guard<std::mutex> lock(sInitMutex); | ||
121 | #ifdef __ICC | ||
122 | // Disable ICC "assignment to statically allocated variable" warning. | ||
123 | // This assignment is mutex-protected and therefore thread-safe. | ||
124 | __pragma(warning(disable:1711)) | ||
125 | #endif | ||
126 | |||
127 | sIsInitialized.store(false, std::memory_order_seq_cst); // Do we need full memory order? | ||
128 | |||
129 | #ifdef __ICC | ||
130 | __pragma(warning(default:1711)) | ||
131 | #endif | ||
132 | |||
133 |
1/2✓ Branch 1 taken 342 times.
✗ Branch 2 not taken.
|
342 | Metadata::clearRegistry(); |
134 |
1/2✓ Branch 1 taken 342 times.
✗ Branch 2 not taken.
|
342 | GridBase::clearRegistry(); |
135 |
1/2✓ Branch 1 taken 342 times.
✗ Branch 2 not taken.
|
342 | math::MapRegistry::clear(); |
136 |
1/2✓ Branch 1 taken 342 times.
✗ Branch 2 not taken.
|
342 | points::internal::uninitialize(); |
137 | |||
138 | #ifdef OPENVDB_USE_BLOSC | ||
139 | // We don't want to destroy Blosc, because it might have been | ||
140 | // initialized by some other library. | ||
141 | //blosc_destroy(); | ||
142 | #endif | ||
143 | 342 | } | |
144 | |||
145 | } // namespace OPENVDB_VERSION_NAME | ||
146 | } // namespace openvdb | ||
147 |