From 5aaf028cbcdd41c4cf436df4dbacffdea0a0df38 Mon Sep 17 00:00:00 2001
From: Dario Casalinuovo <b.vitruvio@gmail.com>
Date: Mon, 9 Mar 2015 20:32:13 +0100
Subject: [PATCH 2/3] Unregister SystemTimeSource when the media_addon_server
quit, better error checking and explicit initialization/deletion for some
attributes
---
src/servers/media_addon/MediaAddonServer.cpp | 36 ++++++++++++++++++++++------
1 file changed, 29 insertions(+), 7 deletions(-)
diff --git a/src/servers/media_addon/MediaAddonServer.cpp b/src/servers/media_addon/MediaAddonServer.cpp
index 1ffec50..48e4370 100644
a
|
b
|
private:
|
121 | 121 | thread_id fControlThread; |
122 | 122 | bool fStartup; |
123 | 123 | bool fStartupSound; |
| 124 | SystemTimeSource* fSystemTimeSource; |
124 | 125 | }; |
125 | 126 | |
126 | 127 | |
… |
… |
MediaAddonServer::MonitorHandler::AddOnDisabled(const add_on_entry_info* info)
|
203 | 204 | MediaAddonServer::MediaAddonServer(const char* signature) |
204 | 205 | : |
205 | 206 | BApplication(signature), |
| 207 | fMonitorHandler(NULL), |
| 208 | fPulseRunner(NULL), |
206 | 209 | fStartup(true), |
207 | | fStartupSound(true) |
| 210 | fStartupSound(true), |
| 211 | fSystemTimeSource(NULL) |
208 | 212 | { |
209 | 213 | CALLED(); |
210 | 214 | fMediaRoster = BMediaRoster::Roster(); |
… |
… |
MediaAddonServer::~MediaAddonServer()
|
227 | 231 | for (; iterator != fFileMap.end(); iterator++) |
228 | 232 | gDormantNodeManager->UnregisterAddOn(iterator->second); |
229 | 233 | |
230 | | // TODO: unregister system time source |
| 234 | delete fMonitorHandler; |
| 235 | delete fPulseRunner; |
231 | 236 | } |
232 | 237 | |
233 | 238 | |
234 | 239 | void |
235 | 240 | MediaAddonServer::ReadyToRun() |
236 | 241 | { |
237 | | if (!be_roster->IsRunning("application/x-vnd.Be.media-server")) { |
| 242 | if (!be_roster->IsRunning(B_MEDIA_SERVER_SIGNATURE)) { |
238 | 243 | // the media server is not running, let's quit |
239 | 244 | fprintf(stderr, "The media_server is not running!\n"); |
240 | 245 | Quit(); |
… |
… |
MediaAddonServer::ReadyToRun()
|
249 | 254 | |
250 | 255 | // The very first thing to do is to create the system time source, |
251 | 256 | // register it with the server, and make it the default SYSTEM_TIME_SOURCE |
252 | | BMediaNode *timeSource = new SystemTimeSource; |
253 | | status_t result = fMediaRoster->RegisterNode(timeSource); |
| 257 | fSystemTimeSource = new SystemTimeSource(); |
| 258 | status_t result = fMediaRoster->RegisterNode(fSystemTimeSource); |
254 | 259 | if (result != B_OK) { |
255 | 260 | fprintf(stderr, "Can't register system time source : %s\n", |
256 | 261 | strerror(result)); |
257 | 262 | debugger("Can't register system time source"); |
258 | 263 | } |
259 | 264 | |
260 | | if (timeSource->ID() != NODE_SYSTEM_TIMESOURCE_ID) |
| 265 | if (fSystemTimeSource->ID() != NODE_SYSTEM_TIMESOURCE_ID) |
261 | 266 | debugger("System time source got wrong node ID"); |
262 | | media_node node = timeSource->Node(); |
| 267 | media_node node = fSystemTimeSource->Node(); |
263 | 268 | result = MediaRosterEx(fMediaRoster)->SetNode(SYSTEM_TIME_SOURCE, &node); |
264 | 269 | if (result != B_OK) |
265 | 270 | debugger("Can't setup system time source as default"); |
… |
… |
MediaAddonServer::ReadyToRun()
|
277 | 282 | // the monitor handler needs a pulse to check if add-ons are ready |
278 | 283 | fPulseRunner = new BMessageRunner(fMonitorHandler, &pulse, 1000000LL); |
279 | 284 | |
| 285 | result = fPulseRunner->InitCheck(); |
| 286 | if (result != B_OK) |
| 287 | ERROR("Can't create the pulse runner"); |
| 288 | |
280 | 289 | fMonitorHandler->AddAddOnDirectories("media"); |
281 | 290 | |
282 | 291 | #ifdef USER_ADDON_PATH |
… |
… |
MediaAddonServer::QuitRequested()
|
313 | 322 | for (iterator = fInfoMap.begin(); iterator != fInfoMap.end(); iterator++) |
314 | 323 | _DestroyInstantiatedFlavors(iterator->second); |
315 | 324 | |
| 325 | // the System timesource should be removed before we quit the roster |
| 326 | if (fSystemTimeSource != NULL && |
| 327 | be_roster->IsRunning(B_MEDIA_SERVER_SIGNATURE)) { |
| 328 | status_t result = fMediaRoster->UnregisterNode(fSystemTimeSource); |
| 329 | if (result != B_OK) { |
| 330 | fprintf(stderr, "Error removing the system time source : %s\n", |
| 331 | strerror(result)); |
| 332 | ERROR("Can't remove the system time source"); |
| 333 | } |
| 334 | fSystemTimeSource->Release(); |
| 335 | fSystemTimeSource = NULL; |
| 336 | } |
| 337 | |
316 | 338 | BMediaRoster::CurrentRoster()->Lock(); |
317 | 339 | BMediaRoster::CurrentRoster()->Quit(); |
318 | 340 | |