mirror of
https://github.com/reactos/reactos.git
synced 2025-04-21 20:50:29 +00:00

Imported from https://www.nuget.org/packages/Microsoft.Windows.SDK.CRTSource/10.0.22621.3 License: MIT
67 lines
1.8 KiB
C++
67 lines
1.8 KiB
C++
//
|
|
// shared_initialization.cpp
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// Shared initialization logic used by both the AppCRT and the DesktopCRT.
|
|
//
|
|
#include <corecrt_internal.h>
|
|
|
|
extern "C" bool __cdecl __acrt_execute_initializers(
|
|
__acrt_initializer const* const first,
|
|
__acrt_initializer const* const last
|
|
)
|
|
{
|
|
if (first == last)
|
|
return true;
|
|
|
|
// Execute the initializers in [first, last), in order:
|
|
__acrt_initializer const* it = first;
|
|
for (; it != last; ++it)
|
|
{
|
|
if (it->_initialize == nullptr)
|
|
continue;
|
|
|
|
if (!(it->_initialize)())
|
|
break;
|
|
}
|
|
|
|
// If we reached the end, all initializers completed successfully:
|
|
if (it == last)
|
|
return true;
|
|
|
|
// Otherwise, the initializer pointed to by it failed. We need to roll back
|
|
// the initialization by executing the uninitializers corresponding to each
|
|
// of the initializers that completed successfully:
|
|
for (; it != first; --it)
|
|
{
|
|
// During initialization roll back, we do not execute uninitializers
|
|
// that have no corresponding initializer:
|
|
if ((it - 1)->_initialize == nullptr || (it - 1)->_uninitialize == nullptr)
|
|
continue;
|
|
|
|
(it - 1)->_uninitialize(false);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
extern "C" bool __cdecl __acrt_execute_uninitializers(
|
|
__acrt_initializer const* const first,
|
|
__acrt_initializer const* const last
|
|
)
|
|
{
|
|
if (first == last)
|
|
return true;
|
|
|
|
// Execute the uninitializers in [first, last), in reverse order:
|
|
for (__acrt_initializer const* it = last; it != first; --it)
|
|
{
|
|
if ((it - 1)->_uninitialize == nullptr)
|
|
continue;
|
|
|
|
(it - 1)->_uninitialize(false);
|
|
}
|
|
|
|
return true;
|
|
}
|