[haiku-commits] haiku: hrev50901 - src/kits/media

  • From: b.vitruvio@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 25 Jan 2017 19:24:20 +0100 (CET)

hrev50901 adds 1 changeset to branch 'master'
old head: 0d47491d66fd7289e5bf23bb4676e4fa364ae345
new head: 11ed4f9fa1a3bdae576ccd83d8bb36f4f73c0c55
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=11ed4f9fa1a3+%5E0d47491d66fd

----------------------------------------------------------------------------

11ed4f9fa1a3: MediaRoster: Don't call NodeRegistered before FinishCreate
  
  * A TimeSource need an additional hook called FinishCreate to be
  able to create it's transfer area. This hook was called after the
  node registration making room for potential mismatch of the transfer
  buffer. Most media nodes such as an event looper call
  begin to work with time related functions just once the registration
  happens. It could cause shadowed timesource objects initialization
  to fail too.
  * Add a debugger call to prevent any node to use an unitialized
  TimeSource area, that would help to identify any remaining issue.

                                [ Dario Casalinuovo <b.vitruvio@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev50901
Commit:      11ed4f9fa1a3bdae576ccd83d8bb36f4f73c0c55
URL:         http://cgit.haiku-os.org/haiku/commit/?id=11ed4f9fa1a3
Author:      Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date:        Wed Jan 25 18:03:03 2017 UTC

----------------------------------------------------------------------------

2 files changed, 10 insertions(+), 9 deletions(-)
src/kits/media/MediaRoster.cpp | 10 +++++-----
src/kits/media/TimeSource.cpp  |  9 +++++----

----------------------------------------------------------------------------

diff --git a/src/kits/media/MediaRoster.cpp b/src/kits/media/MediaRoster.cpp
index c928736..a7f257f 100644
--- a/src/kits/media/MediaRoster.cpp
+++ b/src/kits/media/MediaRoster.cpp
@@ -2153,11 +2153,6 @@ BMediaRosterEx::RegisterNode(BMediaNode* node, 
media_addon_id addOnID,
        ASSERT(reply.node_id == node->Node().node);
        ASSERT(reply.node_id == node->ID());
 
-       // call the callback
-       node->NodeRegistered();
-
-       TRACE("BMediaRoster::RegisterNode: NodeRegistered callback finished\n");
-
        // if the BMediaNode also inherits from BTimeSource, we need to call
        // BTimeSource::FinishCreate()
        if ((node->Kinds() & B_TIME_SOURCE) != 0) {
@@ -2165,6 +2160,11 @@ BMediaRosterEx::RegisterNode(BMediaNode* node, 
media_addon_id addOnID,
                        timeSource->FinishCreate();
        }
 
+       // call the callback
+       node->NodeRegistered();
+
+       TRACE("BMediaRoster::RegisterNode: NodeRegistered callback finished\n");
+
        TRACE("BMediaRoster::RegisterNode: publishing inputs/outputs\n");
 
        // register existing inputs and outputs with the
diff --git a/src/kits/media/TimeSource.cpp b/src/kits/media/TimeSource.cpp
index 89f1e57..fa7e7be 100644
--- a/src/kits/media/TimeSource.cpp
+++ b/src/kits/media/TimeSource.cpp
@@ -227,8 +227,10 @@ BTimeSource::GetTime(bigtime_t* performance_time,
                return B_OK;
        }
 
-       int32 index;
-       index = _atomic_read(&fBuf->readindex);
+       if (fBuf == NULL)
+               debugger("BTimeSource::GetTime: fBuf == NULL");
+
+       int32 index = _atomic_read(&fBuf->readindex);
        index &= (TS_INDEX_COUNT - 1);
        *real_time = fBuf->realtime[index];
        *performance_time = fBuf->perftime[index];
@@ -359,8 +361,7 @@ BTimeSource::PublishTime(bigtime_t performance_time,
                return;
        }
 
-       int32 index;
-       index = atomic_add(&fBuf->writeindex, 1);
+       int32 index = atomic_add(&fBuf->writeindex, 1);
        index &= (TS_INDEX_COUNT - 1);
        fBuf->realtime[index] = real_time;
        fBuf->perftime[index] = performance_time;


Other related posts: