BBuffer: Unregister buffer when clone_area fail, fixes #6188.
Signed-off-by: Adrien Destugues <[email protected]>
This commit is contained in:
committed by
Adrien Destugues
parent
edcc37c64a
commit
8290e8d3e5
+15
-13
@@ -187,15 +187,15 @@ BBuffer::Size()
|
|||||||
|
|
||||||
BBuffer::BBuffer(const buffer_clone_info& info)
|
BBuffer::BBuffer(const buffer_clone_info& info)
|
||||||
:
|
:
|
||||||
// must all be NULL/0 if not correctly initialized
|
|
||||||
fBufferList(NULL),
|
fBufferList(NULL),
|
||||||
|
fArea(-1),
|
||||||
fData(NULL),
|
fData(NULL),
|
||||||
fSize(0)
|
fSize(0)
|
||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
|
|
||||||
fMediaHeader.buffer = 0;
|
// Must be -1 if not registered
|
||||||
// must be 0 if not registered
|
fMediaHeader.buffer = -1;
|
||||||
|
|
||||||
// special case for BSmallBuffer
|
// special case for BSmallBuffer
|
||||||
if (info.area == 0 && info.buffer == 0)
|
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.area > 0);
|
||||||
ASSERT(reply.info.size > 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
|
// the response from media server contains enough information
|
||||||
// to clone the memory for this buffer
|
// to clone the memory for this buffer
|
||||||
fSize = reply.info.size;
|
fSize = reply.info.size;
|
||||||
@@ -239,16 +251,6 @@ BBuffer::BBuffer(const buffer_clone_info& info)
|
|||||||
fOffset = reply.info.offset;
|
fOffset = reply.info.offset;
|
||||||
fMediaHeader.size_used = 0;
|
fMediaHeader.size_used = 0;
|
||||||
fMediaHeader.buffer = reply.info.buffer;
|
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;
|
fData = (char*)fData + fOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user