2 * Copyright 2014, Rene Gollent, rene@gollent.com.
3 * Distributed under the terms of the MIT License.
7 #include "ImageDebugLoadingStateHandlerRoster.h"
11 #include <AutoDeleter.h>
12 #include <AutoLocker.h>
14 #include "DwarfLoadingStateHandler.h"
15 #include "ImageDebugInfoLoadingState.h"
16 #include "ImageDebugLoadingStateHandler.h"
17 #include "SpecificImageDebugInfoLoadingState.h"
20 /*static*/ ImageDebugLoadingStateHandlerRoster
*
21 ImageDebugLoadingStateHandlerRoster::sDefaultInstance
= NULL
;
24 ImageDebugLoadingStateHandlerRoster::ImageDebugLoadingStateHandlerRoster()
26 fLock("type handler roster")
31 ImageDebugLoadingStateHandlerRoster::~ImageDebugLoadingStateHandlerRoster()
36 /*static*/ ImageDebugLoadingStateHandlerRoster
*
37 ImageDebugLoadingStateHandlerRoster::Default()
39 return sDefaultInstance
;
44 ImageDebugLoadingStateHandlerRoster::CreateDefault()
46 if (sDefaultInstance
!= NULL
)
49 ImageDebugLoadingStateHandlerRoster
* roster
50 = new(std::nothrow
) ImageDebugLoadingStateHandlerRoster
;
53 ObjectDeleter
<ImageDebugLoadingStateHandlerRoster
> rosterDeleter(roster
);
55 status_t error
= roster
->Init();
59 error
= roster
->RegisterDefaultHandlers();
63 sDefaultInstance
= rosterDeleter
.Detach();
69 ImageDebugLoadingStateHandlerRoster::DeleteDefault()
71 ImageDebugLoadingStateHandlerRoster
* roster
= sDefaultInstance
;
72 sDefaultInstance
= NULL
;
78 ImageDebugLoadingStateHandlerRoster::Init()
80 return fLock
.InitCheck();
85 ImageDebugLoadingStateHandlerRoster::RegisterDefaultHandlers()
87 ImageDebugLoadingStateHandler
* handler
;
88 BReference
<ImageDebugLoadingStateHandler
> handlerReference
;
90 handler
= new(std::nothrow
) DwarfLoadingStateHandler();
93 handlerReference
.SetTo(handler
, true);
95 if (!RegisterHandler(handler
))
103 ImageDebugLoadingStateHandlerRoster::FindStateHandler(
104 SpecificImageDebugInfoLoadingState
* state
,
105 ImageDebugLoadingStateHandler
*& _handler
)
107 AutoLocker
<BLocker
> locker(fLock
);
110 ImageDebugLoadingStateHandler
* handler
= NULL
;
111 for (int32 i
= 0; (handler
= fStateHandlers
.ItemAt(i
)); i
++) {
112 if ((found
= handler
->SupportsState(state
)))
117 return B_ENTRY_NOT_FOUND
;
119 handler
->AcquireReference();
126 ImageDebugLoadingStateHandlerRoster::RegisterHandler(
127 ImageDebugLoadingStateHandler
* handler
)
129 if (!fStateHandlers
.AddItem(handler
))
132 handler
->AcquireReference();
138 ImageDebugLoadingStateHandlerRoster::UnregisterHandler(
139 ImageDebugLoadingStateHandler
* handler
)
141 if (fStateHandlers
.RemoveItem(handler
))
142 handler
->ReleaseReference();