mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-19 02:33:33 +08:00
Data type registrator went the same way - using plain statics instead of in-place allocation at first call. For code size critical applications, GCC flag -fno-threadsafe-statics should be used
This commit is contained in:
@@ -139,39 +139,23 @@ GlobalDataTypeRegistry::RegistResult GlobalDataTypeRegistry::regist(DataTypeID i
|
|||||||
{
|
{
|
||||||
return RegistResultFrozen;
|
return RegistResultFrozen;
|
||||||
}
|
}
|
||||||
|
static Entry entry;
|
||||||
static union
|
|
||||||
{
|
{
|
||||||
uint8_t buffer[sizeof(Entry)];
|
const RegistResult remove_res = remove(&entry);
|
||||||
long long _aligner_1;
|
|
||||||
long double _aligner_2;
|
|
||||||
} storage;
|
|
||||||
static bool constructed = false;
|
|
||||||
if (!constructed)
|
|
||||||
{
|
|
||||||
new (storage.buffer) Entry();
|
|
||||||
constructed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Entry* const entry = reinterpret_cast<Entry*>(storage.buffer);
|
|
||||||
|
|
||||||
{
|
|
||||||
const RegistResult remove_res = remove(entry);
|
|
||||||
if (remove_res != RegistResultOk)
|
if (remove_res != RegistResultOk)
|
||||||
{
|
{
|
||||||
return remove_res;
|
return remove_res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
new (storage.buffer) Entry(DataTypeKind(Type::DataTypeKind), id, Type::getDataTypeSignature(),
|
entry = Entry(DataTypeKind(Type::DataTypeKind), id, Type::getDataTypeSignature(), Type::getDataTypeFullName());
|
||||||
Type::getDataTypeFullName());
|
|
||||||
{
|
{
|
||||||
const RegistResult remove_res = remove(entry);
|
const RegistResult remove_res = remove(&entry);
|
||||||
if (remove_res != RegistResultOk)
|
if (remove_res != RegistResultOk)
|
||||||
{
|
{
|
||||||
return remove_res;
|
return remove_res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return registImpl(entry);
|
return registImpl(&entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user