mirror of
https://github.com/reactos/reactos.git
synced 2025-06-29 08:19:45 +00:00
68 lines
1.8 KiB
C++
68 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;
|
||
|
}
|