Skip to content

Commit 500b507

Browse files
authored
Merge pull request #1620 from Idclip/siof_problems
Various Fixes around SIOF
2 parents 9c79ea2 + 52c7b9a commit 500b507

File tree

20 files changed

+151
-156
lines changed

20 files changed

+151
-156
lines changed

cmake/config/OpenVDBCXX.cmake

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,14 @@ if(OPENVDB_CXX_STRICT)
178178
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wall>")
179179
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wextra>")
180180
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wconversion>")
181+
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wnon-virtual-dtor>")
182+
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wover-aligned>")
183+
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wimplicit-fallthrough>")
184+
add_compile_options("$<$<AND:$<CXX_COMPILER_ID:GNU>,$<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,9.3.0>>:-Wimplicit-fallthrough>")
185+
# Only check global constructors for libraries (we should really check for
186+
# executables too but gtest relies on these types of constructors for its
187+
# framework).
188+
add_compile_options("$<$<AND:$<NOT:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>>,$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>>:-Wglobal-constructors>")
181189
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wno-sign-conversion>")
182190
# GNU
183191
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Werror>")
@@ -189,6 +197,7 @@ if(OPENVDB_CXX_STRICT)
189197
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wconversion>")
190198
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wdisabled-optimization>")
191199
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Woverloaded-virtual>")
200+
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wnon-virtual-dtor>")
192201
else()
193202
# NO OPENVDB_CXX_STRICT, suppress some warnings
194203
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")

openvdb/openvdb/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,6 @@ set(OPENVDB_LIBRARY_SOURCE_FILES
387387
points/StreamCompression.cc
388388
points/points.cc
389389
util/Formats.cc
390-
util/Util.cc
391390
)
392391

393392
set(OPENVDB_LIBRARY_INCLUDE_FILES

openvdb/openvdb/io/Archive.cc

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,13 @@ struct StreamState
9999
int halfFloat;
100100
int mappedFile;
101101
int metadata;
102+
};
103+
104+
inline StreamState& GetSteamState()
105+
{
106+
static StreamState sStreamState;
107+
return sStreamState;
102108
}
103-
sStreamState;
104109

105110
const long StreamState::MAGIC_NUMBER =
106111
long((uint64_t(OPENVDB_MAGIC) << 32) | (uint64_t(OPENVDB_MAGIC)));
@@ -654,14 +659,14 @@ uint32_t
654659
getFormatVersion(std::ios_base& is)
655660
{
656661
/// @todo get from StreamMetadata
657-
return static_cast<uint32_t>(is.iword(sStreamState.fileVersion));
662+
return static_cast<uint32_t>(is.iword(GetSteamState().fileVersion));
658663
}
659664

660665

661666
void
662667
Archive::setFormatVersion(std::istream& is)
663668
{
664-
is.iword(sStreamState.fileVersion) = mFileVersion; ///< @todo remove
669+
is.iword(GetSteamState().fileVersion) = mFileVersion; ///< @todo remove
665670
if (StreamMetadata::Ptr meta = getStreamMetadataPtr(is)) {
666671
meta->setFileVersion(mFileVersion);
667672
}
@@ -673,17 +678,17 @@ getLibraryVersion(std::ios_base& is)
673678
{
674679
/// @todo get from StreamMetadata
675680
VersionId version;
676-
version.first = static_cast<uint32_t>(is.iword(sStreamState.libraryMajorVersion));
677-
version.second = static_cast<uint32_t>(is.iword(sStreamState.libraryMinorVersion));
681+
version.first = static_cast<uint32_t>(is.iword(GetSteamState().libraryMajorVersion));
682+
version.second = static_cast<uint32_t>(is.iword(GetSteamState().libraryMinorVersion));
678683
return version;
679684
}
680685

681686

682687
void
683688
Archive::setLibraryVersion(std::istream& is)
684689
{
685-
is.iword(sStreamState.libraryMajorVersion) = mLibraryVersion.first; ///< @todo remove
686-
is.iword(sStreamState.libraryMinorVersion) = mLibraryVersion.second; ///< @todo remove
690+
is.iword(GetSteamState().libraryMajorVersion) = mLibraryVersion.first; ///< @todo remove
691+
is.iword(GetSteamState().libraryMinorVersion) = mLibraryVersion.second; ///< @todo remove
687692
if (StreamMetadata::Ptr meta = getStreamMetadataPtr(is)) {
688693
meta->setLibraryVersion(mLibraryVersion);
689694
}
@@ -703,9 +708,9 @@ getVersion(std::ios_base& is)
703708
void
704709
setCurrentVersion(std::istream& is)
705710
{
706-
is.iword(sStreamState.fileVersion) = OPENVDB_FILE_VERSION; ///< @todo remove
707-
is.iword(sStreamState.libraryMajorVersion) = OPENVDB_LIBRARY_MAJOR_VERSION; ///< @todo remove
708-
is.iword(sStreamState.libraryMinorVersion) = OPENVDB_LIBRARY_MINOR_VERSION; ///< @todo remove
711+
is.iword(GetSteamState().fileVersion) = OPENVDB_FILE_VERSION; ///< @todo remove
712+
is.iword(GetSteamState().libraryMajorVersion) = OPENVDB_LIBRARY_MAJOR_VERSION; ///< @todo remove
713+
is.iword(GetSteamState().libraryMinorVersion) = OPENVDB_LIBRARY_MINOR_VERSION; ///< @todo remove
709714
if (StreamMetadata::Ptr meta = getStreamMetadataPtr(is)) {
710715
meta->setFileVersion(OPENVDB_FILE_VERSION);
711716
meta->setLibraryVersion(VersionId(
@@ -717,9 +722,9 @@ setCurrentVersion(std::istream& is)
717722
void
718723
setVersion(std::ios_base& strm, const VersionId& libraryVersion, uint32_t fileVersion)
719724
{
720-
strm.iword(sStreamState.fileVersion) = fileVersion; ///< @todo remove
721-
strm.iword(sStreamState.libraryMajorVersion) = libraryVersion.first; ///< @todo remove
722-
strm.iword(sStreamState.libraryMinorVersion) = libraryVersion.second; ///< @todo remove
725+
strm.iword(GetSteamState().fileVersion) = fileVersion; ///< @todo remove
726+
strm.iword(GetSteamState().libraryMajorVersion) = libraryVersion.first; ///< @todo remove
727+
strm.iword(GetSteamState().libraryMinorVersion) = libraryVersion.second; ///< @todo remove
723728
if (StreamMetadata::Ptr meta = getStreamMetadataPtr(strm)) {
724729
meta->setFileVersion(fileVersion);
725730
meta->setLibraryVersion(libraryVersion);
@@ -743,14 +748,14 @@ uint32_t
743748
getDataCompression(std::ios_base& strm)
744749
{
745750
/// @todo get from StreamMetadata
746-
return uint32_t(strm.iword(sStreamState.dataCompression));
751+
return uint32_t(strm.iword(GetSteamState().dataCompression));
747752
}
748753

749754

750755
void
751756
setDataCompression(std::ios_base& strm, uint32_t c)
752757
{
753-
strm.iword(sStreamState.dataCompression) = c; ///< @todo remove
758+
strm.iword(GetSteamState().dataCompression) = c; ///< @todo remove
754759
if (StreamMetadata::Ptr meta = getStreamMetadataPtr(strm)) {
755760
meta->setCompression(c);
756761
}
@@ -832,14 +837,14 @@ bool
832837
getWriteGridStatsMetadata(std::ios_base& strm)
833838
{
834839
/// @todo get from StreamMetadata
835-
return strm.iword(sStreamState.writeGridStatsMetadata) != 0;
840+
return strm.iword(GetSteamState().writeGridStatsMetadata) != 0;
836841
}
837842

838843

839844
void
840845
setWriteGridStatsMetadata(std::ios_base& strm, bool writeGridStats)
841846
{
842-
strm.iword(sStreamState.writeGridStatsMetadata) = writeGridStats; ///< @todo remove
847+
strm.iword(GetSteamState().writeGridStatsMetadata) = writeGridStats; ///< @todo remove
843848
if (StreamMetadata::Ptr meta = getStreamMetadataPtr(strm)) {
844849
meta->setWriteGridStats(writeGridStats);
845850
}
@@ -853,7 +858,7 @@ uint32_t
853858
getGridClass(std::ios_base& strm)
854859
{
855860
/// @todo get from StreamMetadata
856-
const uint32_t val = static_cast<uint32_t>(strm.iword(sStreamState.gridClass));
861+
const uint32_t val = static_cast<uint32_t>(strm.iword(GetSteamState().gridClass));
857862
if (val >= NUM_GRID_CLASSES) return GRID_UNKNOWN;
858863
return val;
859864
}
@@ -862,7 +867,7 @@ getGridClass(std::ios_base& strm)
862867
void
863868
setGridClass(std::ios_base& strm, uint32_t cls)
864869
{
865-
strm.iword(sStreamState.gridClass) = long(cls); ///< @todo remove
870+
strm.iword(GetSteamState().gridClass) = long(cls); ///< @todo remove
866871
if (StreamMetadata::Ptr meta = getStreamMetadataPtr(strm)) {
867872
meta->setGridClass(cls);
868873
}
@@ -873,14 +878,14 @@ bool
873878
getHalfFloat(std::ios_base& strm)
874879
{
875880
/// @todo get from StreamMetadata
876-
return strm.iword(sStreamState.halfFloat) != 0;
881+
return strm.iword(GetSteamState().halfFloat) != 0;
877882
}
878883

879884

880885
void
881886
setHalfFloat(std::ios_base& strm, bool halfFloat)
882887
{
883-
strm.iword(sStreamState.halfFloat) = halfFloat; ///< @todo remove
888+
strm.iword(GetSteamState().halfFloat) = halfFloat; ///< @todo remove
884889
if (StreamMetadata::Ptr meta = getStreamMetadataPtr(strm)) {
885890
meta->setHalfFloat(halfFloat);
886891
}
@@ -891,14 +896,14 @@ const void*
891896
getGridBackgroundValuePtr(std::ios_base& strm)
892897
{
893898
/// @todo get from StreamMetadata
894-
return strm.pword(sStreamState.gridBackground);
899+
return strm.pword(GetSteamState().gridBackground);
895900
}
896901

897902

898903
void
899904
setGridBackgroundValuePtr(std::ios_base& strm, const void* background)
900905
{
901-
strm.pword(sStreamState.gridBackground) = const_cast<void*>(background); ///< @todo remove
906+
strm.pword(GetSteamState().gridBackground) = const_cast<void*>(background); ///< @todo remove
902907
if (StreamMetadata::Ptr meta = getStreamMetadataPtr(strm)) {
903908
meta->setBackgroundPtr(background);
904909
}
@@ -909,7 +914,7 @@ setGridBackgroundValuePtr(std::ios_base& strm, const void* background)
909914
MappedFile::Ptr
910915
getMappedFilePtr(std::ios_base& strm)
911916
{
912-
if (const void* ptr = strm.pword(sStreamState.mappedFile)) {
917+
if (const void* ptr = strm.pword(GetSteamState().mappedFile)) {
913918
return *static_cast<const MappedFile::Ptr*>(ptr);
914919
}
915920
return MappedFile::Ptr();
@@ -919,15 +924,15 @@ getMappedFilePtr(std::ios_base& strm)
919924
void
920925
setMappedFilePtr(std::ios_base& strm, io::MappedFile::Ptr& mappedFile)
921926
{
922-
strm.pword(sStreamState.mappedFile) = &mappedFile;
927+
strm.pword(GetSteamState().mappedFile) = &mappedFile;
923928
}
924929
#endif // OPENVDB_USE_DELAYED_LOADING
925930

926931

927932
StreamMetadata::Ptr
928933
getStreamMetadataPtr(std::ios_base& strm)
929934
{
930-
if (const void* ptr = strm.pword(sStreamState.metadata)) {
935+
if (const void* ptr = strm.pword(GetSteamState().metadata)) {
931936
return *static_cast<const StreamMetadata::Ptr*>(ptr);
932937
}
933938
return StreamMetadata::Ptr();
@@ -937,7 +942,7 @@ getStreamMetadataPtr(std::ios_base& strm)
937942
void
938943
setStreamMetadataPtr(std::ios_base& strm, StreamMetadata::Ptr& meta, bool transfer)
939944
{
940-
strm.pword(sStreamState.metadata) = &meta;
945+
strm.pword(GetSteamState().metadata) = &meta;
941946
if (transfer && meta) meta->transferTo(strm);
942947
}
943948

@@ -946,7 +951,7 @@ StreamMetadata::Ptr
946951
clearStreamMetadataPtr(std::ios_base& strm)
947952
{
948953
StreamMetadata::Ptr result = getStreamMetadataPtr(strm);
949-
strm.pword(sStreamState.metadata) = nullptr;
954+
strm.pword(GetSteamState().metadata) = nullptr;
950955
return result;
951956
}
952957

@@ -1201,8 +1206,8 @@ doReadGrid(GridBase::Ptr grid, const GridDescriptor& gd, std::istream& is, const
12011206

12021207
// Restore the file-level stream metadata on exit.
12031208
struct OnExit {
1204-
OnExit(std::ios_base& strm_): strm(&strm_), ptr(strm_.pword(sStreamState.metadata)) {}
1205-
~OnExit() { strm->pword(sStreamState.metadata) = ptr; }
1209+
OnExit(std::ios_base& strm_): strm(&strm_), ptr(strm_.pword(GetSteamState().metadata)) {}
1210+
~OnExit() { strm->pword(GetSteamState().metadata) = ptr; }
12061211
std::ios_base* strm;
12071212
void* ptr;
12081213
};
@@ -1426,8 +1431,8 @@ Archive::writeGrid(GridDescriptor& gd, GridBase::ConstPtr grid,
14261431
{
14271432
// Restore file-level stream metadata on exit.
14281433
struct OnExit {
1429-
OnExit(std::ios_base& strm_): strm(&strm_), ptr(strm_.pword(sStreamState.metadata)) {}
1430-
~OnExit() { strm->pword(sStreamState.metadata) = ptr; }
1434+
OnExit(std::ios_base& strm_): strm(&strm_), ptr(strm_.pword(GetSteamState().metadata)) {}
1435+
~OnExit() { strm->pword(GetSteamState().metadata) = ptr; }
14311436
std::ios_base* strm;
14321437
void* ptr;
14331438
};

openvdb/openvdb/math/ConjGradient.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ class SparseStencilMatrix
245245
class ConstRow;
246246
class RowEditor;
247247

248-
static const ValueType sZeroValue;
248+
static inline constexpr ValueType sZeroValue = zeroVal<ValueType>();
249249

250250
/// Construct an @a n x @a n matrix with at most @a STENCIL_SIZE nonzero elements per row.
251251
SparseStencilMatrix(SizeType n);
@@ -814,10 +814,6 @@ Vector<T>::str() const
814814
////////////////////////////////////////
815815

816816

817-
template<typename ValueType, SizeType STENCIL_SIZE>
818-
const ValueType SparseStencilMatrix<ValueType, STENCIL_SIZE>::sZeroValue = zeroVal<ValueType>();
819-
820-
821817
template<typename ValueType, SizeType STENCIL_SIZE>
822818
inline
823819
SparseStencilMatrix<ValueType, STENCIL_SIZE>::SparseStencilMatrix(SizeType numRows)

openvdb/openvdb/math/Coord.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ class Coord
3333
using Limits = std::numeric_limits<ValueType>;
3434

3535
Coord(): mVec{{0, 0, 0}} {}
36-
explicit Coord(Int32 xyz): mVec{{xyz, xyz, xyz}} {}
37-
Coord(Int32 x, Int32 y, Int32 z): mVec{{x, y, z}} {}
36+
constexpr explicit Coord(Int32 xyz): mVec{{xyz, xyz, xyz}} {}
37+
constexpr Coord(Int32 x, Int32 y, Int32 z): mVec{{x, y, z}} {}
3838
explicit Coord(const Vec3i& v): mVec{{v[0], v[1], v[2]}} {}
3939
explicit Coord(const Vec3I& v): mVec{{Int32(v[0]), Int32(v[1]), Int32(v[2])}} {}
4040
explicit Coord(const Int32* v): mVec{{v[0], v[1], v[2]}} {}

openvdb/openvdb/math/Maps.cc

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,33 @@ namespace OPENVDB_VERSION_NAME {
1010
namespace math {
1111

1212
namespace {
13-
14-
// Declare this at file scope to ensure thread-safe initialization.
15-
// NOTE: Do *NOT* move this into Maps.h or else we will need to pull in
16-
// Windows.h with things like 'rad2' defined!
17-
std::mutex sInitMapRegistryMutex;
18-
13+
inline std::mutex& GetMapRegistryMutex()
14+
{
15+
static std::mutex sInitMapRegistryMutex;
16+
return sInitMapRegistryMutex;
17+
}
1918
} // unnamed namespace
2019

2120

2221
////////////////////////////////////////
2322

2423

25-
// Caller is responsible for calling this function serially.
2624
MapRegistry*
27-
MapRegistry::staticInstance()
25+
MapRegistry::instance()
2826
{
2927
static MapRegistry registry;
3028
return &registry;
3129
}
3230

3331

34-
MapRegistry*
35-
MapRegistry::instance()
36-
{
37-
std::lock_guard<std::mutex> lock(sInitMapRegistryMutex);
38-
return staticInstance();
39-
}
40-
41-
4232
MapBase::Ptr
4333
MapRegistry::createMap(const Name& name)
4434
{
45-
std::lock_guard<std::mutex> lock(sInitMapRegistryMutex);
46-
MapDictionary::const_iterator iter = staticInstance()->mMap.find(name);
35+
std::lock_guard<std::mutex> lock(GetMapRegistryMutex());
36+
auto* reg = MapRegistry::instance();
37+
MapDictionary::const_iterator iter = reg->mMap.find(name);
4738

48-
if (iter == staticInstance()->mMap.end()) {
39+
if (iter == reg->mMap.end()) {
4940
OPENVDB_THROW(LookupError, "Cannot create map of unregistered type " << name);
5041
}
5142

@@ -56,37 +47,39 @@ MapRegistry::createMap(const Name& name)
5647
bool
5748
MapRegistry::isRegistered(const Name& name)
5849
{
59-
std::lock_guard<std::mutex> lock(sInitMapRegistryMutex);
60-
return (staticInstance()->mMap.find(name) != staticInstance()->mMap.end());
50+
std::lock_guard<std::mutex> lock(GetMapRegistryMutex());
51+
const auto* reg = MapRegistry::instance();
52+
return (reg->mMap.find(name) != reg->mMap.end());
6153
}
6254

6355

6456
void
6557
MapRegistry::registerMap(const Name& name, MapBase::MapFactory factory)
6658
{
67-
std::lock_guard<std::mutex> lock(sInitMapRegistryMutex);
59+
std::lock_guard<std::mutex> lock(GetMapRegistryMutex());
60+
auto* reg = MapRegistry::instance();
6861

69-
if (staticInstance()->mMap.find(name) != staticInstance()->mMap.end()) {
62+
if (reg->mMap.find(name) != reg->mMap.end()) {
7063
OPENVDB_THROW(KeyError, "Map type " << name << " is already registered");
7164
}
7265

73-
staticInstance()->mMap[name] = factory;
66+
reg->mMap[name] = factory;
7467
}
7568

7669

7770
void
7871
MapRegistry::unregisterMap(const Name& name)
7972
{
80-
std::lock_guard<std::mutex> lock(sInitMapRegistryMutex);
81-
staticInstance()->mMap.erase(name);
73+
std::lock_guard<std::mutex> lock(GetMapRegistryMutex());
74+
MapRegistry::instance()->mMap.erase(name);
8275
}
8376

8477

8578
void
8679
MapRegistry::clear()
8780
{
88-
std::lock_guard<std::mutex> lock(sInitMapRegistryMutex);
89-
staticInstance()->mMap.clear();
81+
std::lock_guard<std::mutex> lock(GetMapRegistryMutex());
82+
MapRegistry::instance()->mMap.clear();
9083
}
9184

9285

0 commit comments

Comments
 (0)