Debugger: Split into core library and application.
[haiku.git] / src / kits / debugger / debug_info / ImageDebugLoadingStateHandlerRoster.cpp
blob8745d218cfc05505b5498fedcb1c0b7107670cc1
1 /*
2 * Copyright 2014, Rene Gollent, rene@gollent.com.
3 * Distributed under the terms of the MIT License.
4 */
7 #include "ImageDebugLoadingStateHandlerRoster.h"
9 #include <new>
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;
43 /*static*/ status_t
44 ImageDebugLoadingStateHandlerRoster::CreateDefault()
46 if (sDefaultInstance != NULL)
47 return B_OK;
49 ImageDebugLoadingStateHandlerRoster* roster
50 = new(std::nothrow) ImageDebugLoadingStateHandlerRoster;
51 if (roster == NULL)
52 return B_NO_MEMORY;
53 ObjectDeleter<ImageDebugLoadingStateHandlerRoster> rosterDeleter(roster);
55 status_t error = roster->Init();
56 if (error != B_OK)
57 return error;
59 error = roster->RegisterDefaultHandlers();
60 if (error != B_OK)
61 return error;
63 sDefaultInstance = rosterDeleter.Detach();
64 return B_OK;
68 /*static*/ void
69 ImageDebugLoadingStateHandlerRoster::DeleteDefault()
71 ImageDebugLoadingStateHandlerRoster* roster = sDefaultInstance;
72 sDefaultInstance = NULL;
73 delete roster;
77 status_t
78 ImageDebugLoadingStateHandlerRoster::Init()
80 return fLock.InitCheck();
84 status_t
85 ImageDebugLoadingStateHandlerRoster::RegisterDefaultHandlers()
87 ImageDebugLoadingStateHandler* handler;
88 BReference<ImageDebugLoadingStateHandler> handlerReference;
90 handler = new(std::nothrow) DwarfLoadingStateHandler();
91 if (handler == NULL)
92 return B_NO_MEMORY;
93 handlerReference.SetTo(handler, true);
95 if (!RegisterHandler(handler))
96 return B_NO_MEMORY;
98 return B_OK;
102 status_t
103 ImageDebugLoadingStateHandlerRoster::FindStateHandler(
104 SpecificImageDebugInfoLoadingState* state,
105 ImageDebugLoadingStateHandler*& _handler)
107 AutoLocker<BLocker> locker(fLock);
109 bool found = false;
110 ImageDebugLoadingStateHandler* handler = NULL;
111 for (int32 i = 0; (handler = fStateHandlers.ItemAt(i)); i++) {
112 if ((found = handler->SupportsState(state)))
113 break;
116 if (!found)
117 return B_ENTRY_NOT_FOUND;
119 handler->AcquireReference();
120 _handler = handler;
121 return B_OK;
125 bool
126 ImageDebugLoadingStateHandlerRoster::RegisterHandler(
127 ImageDebugLoadingStateHandler* handler)
129 if (!fStateHandlers.AddItem(handler))
130 return false;
132 handler->AcquireReference();
133 return true;
137 void
138 ImageDebugLoadingStateHandlerRoster::UnregisterHandler(
139 ImageDebugLoadingStateHandler* handler)
141 if (fStateHandlers.RemoveItem(handler))
142 handler->ReleaseReference();