2 * Copyright 2016, Rene Gollent, rene@gollent.com.
3 * Distributed under the terms of the MIT License.
5 #include "TargetHostInterfaceRoster.h"
9 #include <AutoDeleter.h>
10 #include <AutoLocker.h>
12 #include "LocalTargetHostInterfaceInfo.h"
13 #include "TargetHostInterface.h"
14 #include "TargetHostInterfaceInfo.h"
17 /*static*/ TargetHostInterfaceRoster
*
18 TargetHostInterfaceRoster::sDefaultInstance
= NULL
;
21 TargetHostInterfaceRoster::TargetHostInterfaceRoster()
24 fInterfaceInfos(20, false),
25 fActiveInterfaces(20, false)
30 TargetHostInterfaceRoster::~TargetHostInterfaceRoster()
35 /*static*/ TargetHostInterfaceRoster
*
36 TargetHostInterfaceRoster::Default()
38 return sDefaultInstance
;
43 TargetHostInterfaceRoster::CreateDefault()
45 if (sDefaultInstance
!= NULL
)
48 TargetHostInterfaceRoster
* roster
49 = new(std::nothrow
) TargetHostInterfaceRoster
;
52 ObjectDeleter
<TargetHostInterfaceRoster
> rosterDeleter(roster
);
54 status_t error
= roster
->Init();
58 error
= roster
->RegisterInterfaceInfos();
62 sDefaultInstance
= rosterDeleter
.Detach();
68 TargetHostInterfaceRoster::DeleteDefault()
70 TargetHostInterfaceRoster
* roster
= sDefaultInstance
;
71 sDefaultInstance
= NULL
;
77 TargetHostInterfaceRoster::Init()
79 return fLock
.InitCheck();
84 TargetHostInterfaceRoster::RegisterInterfaceInfos()
86 TargetHostInterfaceInfo
* info
= NULL
;
87 BReference
<TargetHostInterfaceInfo
> interfaceReference
;
89 #undef REGISTER_INTERFACE_INFO
90 #define REGISTER_INTERFACE_INFO(type) \
91 info = new(std::nothrow) type##TargetHostInterfaceInfo; \
94 interfaceReference.SetTo(info, true); \
95 if (!fInterfaceInfos.AddItem(info)) \
97 interfaceReference.Detach();
99 REGISTER_INTERFACE_INFO(Local
)
106 TargetHostInterfaceRoster::CountInterfaceInfos() const
108 return fInterfaceInfos
.CountItems();
112 TargetHostInterfaceInfo
*
113 TargetHostInterfaceRoster::InterfaceInfoAt(int32 index
) const
115 return fInterfaceInfos
.ItemAt(index
);
120 TargetHostInterfaceRoster::CreateInterface(TargetHostInterfaceInfo
* info
,
121 Settings
* settings
, TargetHostInterface
*& _interface
)
123 // TODO: this should eventually verify that an active interface with
124 // matching settings/type doesn't already exist, and if so, return that
125 // directly rather than instantiating a new one, since i.e. the interface
126 // for the local host only requires one instance.
127 AutoLocker
<TargetHostInterfaceRoster
> locker(this);
128 TargetHostInterface
* interface
;
129 status_t error
= info
->CreateInterface(settings
, interface
);
133 error
= interface
->Run();
134 if (error
< B_OK
|| !fActiveInterfaces
.AddItem(interface
)) {
139 _interface
= interface
;
145 TargetHostInterfaceRoster::CountActiveInterfaces() const
147 return fActiveInterfaces
.CountItems();
152 TargetHostInterfaceRoster::ActiveInterfaceAt(int32 index
) const
154 return fActiveInterfaces
.ItemAt(index
);
159 TargetHostInterfaceRoster::CountRunningTeamDebuggers() const
162 for (int32 i
= 0; TargetHostInterface
* interface
= ActiveInterfaceAt(i
);
164 total
+= interface
->CountTeamDebuggers();