[haiku-commits] haiku: hrev49035 - headers/private/media src/kits/media

  • From: pulkomandy@xxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 13 Apr 2015 22:03:51 +0200 (CEST)

hrev49035 adds 3 changesets to branch 'master'
old head: edcc37c64af67db04d4bacc7cd3d7b93423e95a9
new head: 384ae40aa53b91a9a3e55f8a366139f03dfdc9d2
overview:
http://cgit.haiku-os.org/haiku/log/?qt=range&q=384ae40aa53b+%5Eedcc37c64af6

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

8290e8d3e5cc: BBuffer: Unregister buffer when clone_area fail, fixes #6188.

Signed-off-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

4232706dc80d: Clean SharedBufferList.h.

Signed-off-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

384ae40aa53b: Correctly check when the BBuffer failed the registration with the
server.

Signed-off-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

[ Dario Casalinuovo <b.vitruvio@xxxxxxxxx> ]

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

4 files changed, 66 insertions(+), 50 deletions(-)
headers/private/media/SharedBufferList.h | 63 +++++++++++++++-------------
src/kits/media/Buffer.cpp | 28 +++++++------
src/kits/media/BufferCache.cpp | 4 +-
src/kits/media/BufferConsumer.cpp | 21 ++++++----

############################################################################

Commit: 8290e8d3e5cc656361a1788415a98f639e64901c
URL: http://cgit.haiku-os.org/haiku/commit/?id=8290e8d3e5cc
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Fri Apr 10 17:47:04 2015 UTC
Committer: Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Mon Apr 13 17:20:43 2015 UTC

Ticket: https://dev.haiku-os.org/ticket/6188

BBuffer: Unregister buffer when clone_area fail, fixes #6188.

Signed-off-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

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

diff --git a/src/kits/media/Buffer.cpp b/src/kits/media/Buffer.cpp
index abc6669..c942b26 100644
--- a/src/kits/media/Buffer.cpp
+++ b/src/kits/media/Buffer.cpp
@@ -187,15 +187,15 @@ BBuffer::Size()

BBuffer::BBuffer(const buffer_clone_info& info)
:
- // must all be NULL/0 if not correctly initialized
fBufferList(NULL),
+ fArea(-1),
fData(NULL),
fSize(0)
{
CALLED();

- fMediaHeader.buffer = 0;
- // must be 0 if not registered
+ // Must be -1 if not registered
+ fMediaHeader.buffer = -1;

// special case for BSmallBuffer
if (info.area == 0 && info.buffer == 0)
@@ -232,6 +232,18 @@ BBuffer::BBuffer(const buffer_clone_info& info)
ASSERT(reply.info.area > 0);
ASSERT(reply.info.size > 0);

+ fArea = clone_area("a cloned BBuffer", &fData, B_ANY_ADDRESS,
+ B_READ_AREA | B_WRITE_AREA, reply.info.area);
+ if (fArea < 0) {
+ ERROR("BBuffer::BBuffer: buffer cloning failed"
+ ", unregistering buffer\n");
+ server_unregister_buffer_command cmd;
+ cmd.team = BPrivate::current_team();
+ cmd.buffer_id = fMediaHeader.buffer;
+ SendToServer(SERVER_UNREGISTER_BUFFER, &cmd, sizeof(cmd));
+ return;
+ }
+
// the response from media server contains enough information
// to clone the memory for this buffer
fSize = reply.info.size;
@@ -239,16 +251,6 @@ BBuffer::BBuffer(const buffer_clone_info& info)
fOffset = reply.info.offset;
fMediaHeader.size_used = 0;
fMediaHeader.buffer = reply.info.buffer;
-
- fArea = clone_area("a cloned BBuffer", &fData, B_ANY_ADDRESS,
- B_READ_AREA | B_WRITE_AREA, reply.info.area);
- if (fArea < 0) {
- // TODO: should unregister buffer here
- ERROR("BBuffer::BBuffer: buffer cloning failed\n");
- fData = 0;
- return;
- }
-
fData = (char*)fData + fOffset;
}


############################################################################

Commit: 4232706dc80dad760d638e754d3cdaff9f8878f0
URL: http://cgit.haiku-os.org/haiku/commit/?id=4232706dc80d
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Tue Apr 7 16:15:04 2015 UTC
Committer: Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Mon Apr 13 17:21:35 2015 UTC

Clean SharedBufferList.h.

Signed-off-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

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

diff --git a/headers/private/media/SharedBufferList.h
b/headers/private/media/SharedBufferList.h
index c5b93b1..8c84a78 100644
--- a/headers/private/media/SharedBufferList.h
+++ b/headers/private/media/SharedBufferList.h
@@ -13,28 +13,34 @@
namespace BPrivate {


-class SharedBufferList {
+class SharedBufferList
+{
public:
- static area_id Create(SharedBufferList**
_list);
- static SharedBufferList* Get();
- static void Invalidate();
-
- void Put();
- void
DeleteGroupAndPut(sem_id groupReclaimSem);
-
- status_t Lock();
- status_t Unlock();
-
- status_t AddBuffer(sem_id
groupReclaimSem,
-
BBuffer* buffer);
- status_t RequestBuffer(sem_id
groupReclaimSem,
- int32
buffersInGroup, size_t size,
-
media_buffer_id wantID, BBuffer** _buffer,
-
bigtime_t timeout);
- status_t RecycleBuffer(BBuffer*
buffer);
- status_t GetBufferList(sem_id
groupReclaimSem,
- int32
bufferCount, BBuffer** buffers);
+ static area_id
Create(SharedBufferList** _list);
+ static SharedBufferList* Get();
+ static void Invalidate();

+ void Put();
+ void
DeleteGroupAndPut(
+
sem_id groupReclaimSem);
+
+ status_t Lock();
+ status_t
Unlock();
+
+ status_t
AddBuffer(sem_id groupReclaimSem,
+
BBuffer* buffer);
+
+ status_t
RequestBuffer(sem_id groupReclaimSem,
+
int32 buffersInGroup, size_t size,
+
media_buffer_id wantID,
+
BBuffer** _buffer,
+
bigtime_t timeout);
+
+ status_t
RecycleBuffer(BBuffer* buffer);
+
+ status_t
GetBufferList(sem_id groupReclaimSem,
+
int32 bufferCount,
+
BBuffer** buffers);
private:
struct _shared_buffer_info {
media_buffer_id id;
@@ -45,19 +51,20 @@ private:
sem_id reclaim_sem;
};

+ // 16 bytes per buffer, 8 pages in total (one entry less for the list)
enum { kMaxBuffers = 2047 };
- // 16 bytes per buffer, 8 pages in total (one entry less for
the list)

- status_t _Init();
- void
_RequestBufferInOtherGroups(
- sem_id
groupReclaimSem, media_buffer_id id);
+ status_t _Init();
+ void
_RequestBufferInOtherGroups(
+
sem_id groupReclaimSem,
+
media_buffer_id id);

private:
- sem_id fSemaphore;
- int32 fAtom;
+ sem_id
fSemaphore;
+ int32 fAtom;

- _shared_buffer_info fInfos[kMaxBuffers];
- int32 fCount;
+ _shared_buffer_info
fInfos[kMaxBuffers];
+ int32 fCount;
};



############################################################################

Revision: hrev49035
Commit: 384ae40aa53b91a9a3e55f8a366139f03dfdc9d2
URL: http://cgit.haiku-os.org/haiku/commit/?id=384ae40aa53b
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Thu Apr 9 22:04:24 2015 UTC
Committer: Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Mon Apr 13 17:22:26 2015 UTC

Correctly check when the BBuffer failed the registration with the server.

Signed-off-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

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

diff --git a/src/kits/media/BufferCache.cpp b/src/kits/media/BufferCache.cpp
index 10947df..69d5eda 100644
--- a/src/kits/media/BufferCache.cpp
+++ b/src/kits/media/BufferCache.cpp
@@ -42,8 +42,10 @@ BufferCache::GetBuffer(media_buffer_id id)
buffer_clone_info info;
info.buffer = id;
BBuffer* buffer = new(std::nothrow) BBuffer(info);
- if (buffer == NULL)
+ if (buffer == NULL || buffer->Data() == NULL) {
+ delete buffer;
return NULL;
+ }

try {
fMap.insert(std::make_pair(id, buffer));
diff --git a/src/kits/media/BufferConsumer.cpp
b/src/kits/media/BufferConsumer.cpp
index 29ae9a2..edd5b57 100644
--- a/src/kits/media/BufferConsumer.cpp
+++ b/src/kits/media/BufferConsumer.cpp
@@ -385,14 +385,19 @@ BBufferConsumer::HandleMessage(int32 message, const void*
data, size_t size)
= static_cast<const
consumer_buffer_received_command*>(data);

BBuffer* buffer =
fBufferCache->GetBuffer(command->buffer);
- buffer->SetHeader(&command->header);
-
- PRINT(4, "calling BBufferConsumer::BufferReceived
buffer %ld at "
- "perf %Ld and TimeSource()->Now() is %Ld\n",
- buffer->Header()->buffer,
buffer->Header()->start_time,
- TimeSource()->Now());
-
- BufferReceived(buffer);
+ if (buffer == NULL) {
+
ERROR("BBufferConsumer::CONSUMER_BUFFER_RECEIVED can't"
+ "find the buffer\n");
+ } else {
+ buffer->SetHeader(&command->header);
+
+ PRINT(4, "calling
BBufferConsumer::BufferReceived buffer %ld "
+ "at perf %Ld and TimeSource()->Now() is
%Ld\n",
+ buffer->Header()->buffer,
buffer->Header()->start_time,
+ TimeSource()->Now());
+
+ BufferReceived(buffer);
+ }
return B_OK;
}



Other related posts: