xref: /haiku/src/add-ons/kernel/file_systems/userlandfs/shared/LazyInitializable.cpp (revision 93a78ecaa45114d68952d08c4778f073515102f2)
1 // LazyInitializable.cpp
2 
3 #include "LazyInitializable.h"
4 
5 // constructor
6 LazyInitializable::LazyInitializable()
7 	: fInitStatus(B_NO_INIT),
8 	  fInitSemaphore(-1)
9 {
10 	fInitSemaphore = create_sem(1, "init semaphore");
11 	if (fInitSemaphore < 0)
12 		fInitStatus = fInitSemaphore;
13 }
14 
15 // constructor
16 LazyInitializable::LazyInitializable(bool init)
17 	: fInitStatus(B_NO_INIT),
18 	  fInitSemaphore(-1)
19 {
20 	if (init) {
21 		fInitSemaphore = create_sem(1, "init semaphore");
22 		if (fInitSemaphore < 0)
23 			fInitStatus = fInitSemaphore;
24 	} else
25 		fInitStatus = B_OK;
26 }
27 
28 // destructor
29 LazyInitializable::~LazyInitializable()
30 {
31 	if (fInitSemaphore >= 0)
32 		delete_sem(fInitSemaphore);
33 }
34 
35 // Access
36 status_t
37 LazyInitializable::Access()
38 {
39 	if (fInitSemaphore >= 0) {
40 		status_t error = B_OK;
41 		do {
42 			error = acquire_sem(fInitSemaphore);
43 		} while (error == B_INTERRUPTED);
44 		if (error == B_OK) {
45 			// we are the first: initialize
46 			fInitStatus = FirstTimeInit();
47 			delete_sem(fInitSemaphore);
48 			fInitSemaphore = -1;
49 		}
50 	}
51 	return fInitStatus;
52 }
53 
54 // InitCheck
55 status_t
56 LazyInitializable::InitCheck() const
57 {
58 	return fInitStatus;
59 }
60 
61