#include "LazyInitializable.h"
LazyInitializable::LazyInitializable()
: fInitStatus(B_NO_INIT),
fInitSemaphore(-1)
{
fInitSemaphore = create_sem(1, "init semaphore");
if (fInitSemaphore < 0)
fInitStatus = fInitSemaphore;
}
LazyInitializable::LazyInitializable(bool init)
: fInitStatus(B_NO_INIT),
fInitSemaphore(-1)
{
if (init) {
fInitSemaphore = create_sem(1, "init semaphore");
if (fInitSemaphore < 0)
fInitStatus = fInitSemaphore;
} else
fInitStatus = B_OK;
}
LazyInitializable::~LazyInitializable()
{
if (fInitSemaphore >= 0)
delete_sem(fInitSemaphore);
}
status_t
LazyInitializable::Access()
{
if (fInitSemaphore >= 0) {
status_t error = B_OK;
do {
error = acquire_sem(fInitSemaphore);
} while (error == B_INTERRUPTED);
if (error == B_OK) {
fInitStatus = FirstTimeInit();
delete_sem(fInitSemaphore);
fInitSemaphore = -1;
}
}
return fInitStatus;
}
status_t
LazyInitializable::InitCheck() const
{
return fInitStatus;
}