Modified acpi namespace driver to match ring_buffer functions.
A bit confused about the signedness handling in ring_buffer internals though, int32 to size_t. Unnested the acpi_namespace_read function a bit and removed dead check for negative lengths from read. CID 4093. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39963 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -18,8 +18,8 @@ class RingBuffer {
|
|||||||
public:
|
public:
|
||||||
RingBuffer(size_t size = 1024);
|
RingBuffer(size_t size = 1024);
|
||||||
~RingBuffer();
|
~RingBuffer();
|
||||||
ssize_t Read(void *buffer, size_t length);
|
size_t Read(void *buffer, ssize_t length);
|
||||||
ssize_t Write(const void *buffer, size_t length);
|
size_t Write(const void *buffer, ssize_t length);
|
||||||
size_t WritableAmount() const;
|
size_t WritableAmount() const;
|
||||||
size_t ReadableAmount() const;
|
size_t ReadableAmount() const;
|
||||||
|
|
||||||
@@ -221,38 +221,29 @@ static status_t
|
|||||||
acpi_namespace_read(void *_cookie, off_t position, void *buf, size_t* num_bytes)
|
acpi_namespace_read(void *_cookie, off_t position, void *buf, size_t* num_bytes)
|
||||||
{
|
{
|
||||||
acpi_ns_device_info *device = (acpi_ns_device_info *)_cookie;
|
acpi_ns_device_info *device = (acpi_ns_device_info *)_cookie;
|
||||||
size_t bytesRead = 0;
|
|
||||||
size_t readable = 0;
|
|
||||||
|
|
||||||
RingBuffer &ringBuffer = *device->buffer;
|
RingBuffer &ringBuffer = *device->buffer;
|
||||||
|
|
||||||
if (ringBuffer.Lock()) {
|
if (!ringBuffer.Lock()) {
|
||||||
readable = ringBuffer.ReadableAmount();
|
|
||||||
|
|
||||||
if (readable <= 0) {
|
|
||||||
ringBuffer.Unlock();
|
|
||||||
status_t status = acquire_sem_etc(device->read_sem, 1, B_CAN_INTERRUPT, 0);
|
|
||||||
if (status == B_INTERRUPTED) {
|
|
||||||
*num_bytes = 0;
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
if (!ringBuffer.Lock()) {
|
|
||||||
*num_bytes = 0;
|
|
||||||
return B_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bytesRead = ringBuffer.Read(buf, *num_bytes);
|
|
||||||
ringBuffer.Unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bytesRead < 0) {
|
|
||||||
*num_bytes = 0;
|
*num_bytes = 0;
|
||||||
return bytesRead;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
*num_bytes = bytesRead;
|
if (ringBuffer.ReadableAmount() == 0) {
|
||||||
|
ringBuffer.Unlock();
|
||||||
|
status_t status = acquire_sem_etc(device->read_sem, 1, B_CAN_INTERRUPT, 0);
|
||||||
|
if (status != B_OK) {
|
||||||
|
*num_bytes = 0;
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
if (!ringBuffer.Lock()) {
|
||||||
|
*num_bytes = 0;
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*num_bytes = ringBuffer.Read(buf, *num_bytes);
|
||||||
|
ringBuffer.Unlock();
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,15 +379,15 @@ RingBuffer::~RingBuffer()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ssize_t
|
size_t
|
||||||
RingBuffer::Read(void *buffer, size_t size)
|
RingBuffer::Read(void *buffer, ssize_t size)
|
||||||
{
|
{
|
||||||
return ring_buffer_read(fBuffer, (uint8*)buffer, size);
|
return ring_buffer_read(fBuffer, (uint8*)buffer, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ssize_t
|
size_t
|
||||||
RingBuffer::Write(const void *buffer, size_t size)
|
RingBuffer::Write(const void *buffer, ssize_t size)
|
||||||
{
|
{
|
||||||
return ring_buffer_write(fBuffer, (uint8*)buffer, size);
|
return ring_buffer_write(fBuffer, (uint8*)buffer, size);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user