Ticket #11858: 0002-Unregister-SystemTimeSource-when-the-media_addon_ser.patch

File 0002-Unregister-SystemTimeSource-when-the-media_addon_ser.patch, 3.8 KB (added by Barrett, 9 years ago)
  • src/servers/media_addon/MediaAddonServer.cpp

    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:  
    121121            thread_id           fControlThread;
    122122            bool                fStartup;
    123123            bool                fStartupSound;
     124            SystemTimeSource*   fSystemTimeSource;
    124125};
    125126
    126127
    MediaAddonServer::MonitorHandler::AddOnDisabled(const add_on_entry_info* info)  
    203204MediaAddonServer::MediaAddonServer(const char* signature)
    204205    :
    205206    BApplication(signature),
     207    fMonitorHandler(NULL),
     208    fPulseRunner(NULL),
    206209    fStartup(true),
    207     fStartupSound(true)
     210    fStartupSound(true),
     211    fSystemTimeSource(NULL)
    208212{
    209213    CALLED();
    210214    fMediaRoster = BMediaRoster::Roster();
    MediaAddonServer::~MediaAddonServer()  
    227231    for (; iterator != fFileMap.end(); iterator++)
    228232        gDormantNodeManager->UnregisterAddOn(iterator->second);
    229233
    230     // TODO: unregister system time source
     234    delete fMonitorHandler;
     235    delete fPulseRunner;
    231236}
    232237
    233238
    234239void
    235240MediaAddonServer::ReadyToRun()
    236241{
    237     if (!be_roster->IsRunning("application/x-vnd.Be.media-server")) {
     242    if (!be_roster->IsRunning(B_MEDIA_SERVER_SIGNATURE)) {
    238243        // the media server is not running, let's quit
    239244        fprintf(stderr, "The media_server is not running!\n");
    240245        Quit();
    MediaAddonServer::ReadyToRun()  
    249254
    250255    // The very first thing to do is to create the system time source,
    251256    // 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);
    254259    if (result != B_OK) {
    255260        fprintf(stderr, "Can't register system time source : %s\n",
    256261            strerror(result));
    257262        debugger("Can't register system time source");
    258263    }
    259264
    260     if (timeSource->ID() != NODE_SYSTEM_TIMESOURCE_ID)
     265    if (fSystemTimeSource->ID() != NODE_SYSTEM_TIMESOURCE_ID)
    261266        debugger("System time source got wrong node ID");
    262     media_node node = timeSource->Node();
     267    media_node node = fSystemTimeSource->Node();
    263268    result = MediaRosterEx(fMediaRoster)->SetNode(SYSTEM_TIME_SOURCE, &node);
    264269    if (result != B_OK)
    265270        debugger("Can't setup system time source as default");
    MediaAddonServer::ReadyToRun()  
    277282    // the monitor handler needs a pulse to check if add-ons are ready
    278283    fPulseRunner = new BMessageRunner(fMonitorHandler, &pulse, 1000000LL);
    279284
     285    result = fPulseRunner->InitCheck();
     286    if (result != B_OK)
     287        ERROR("Can't create the pulse runner");
     288
    280289    fMonitorHandler->AddAddOnDirectories("media");
    281290
    282291#ifdef USER_ADDON_PATH
    MediaAddonServer::QuitRequested()  
    313322    for (iterator = fInfoMap.begin(); iterator != fInfoMap.end(); iterator++)
    314323        _DestroyInstantiatedFlavors(iterator->second);
    315324
     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
    316338    BMediaRoster::CurrentRoster()->Lock();
    317339    BMediaRoster::CurrentRoster()->Quit();
    318340