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:
Fredrik Holmqvist
2010-12-27 16:17:54 +00:00
parent ecc8da6dfe
commit b44c75c5eb
@@ -18,8 +18,8 @@ class RingBuffer {
public:
RingBuffer(size_t size = 1024);
~RingBuffer();
ssize_t Read(void *buffer, size_t length);
ssize_t Write(const void *buffer, size_t length);
size_t Read(void *buffer, ssize_t length);
size_t Write(const void *buffer, ssize_t length);
size_t WritableAmount() 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_ns_device_info *device = (acpi_ns_device_info *)_cookie;
size_t bytesRead = 0;
size_t readable = 0;
RingBuffer &ringBuffer = *device->buffer;
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) {
if (!ringBuffer.Lock()) {
*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;
}
@@ -388,15 +379,15 @@ RingBuffer::~RingBuffer()
}
ssize_t
RingBuffer::Read(void *buffer, size_t size)
size_t
RingBuffer::Read(void *buffer, ssize_t size)
{
return ring_buffer_read(fBuffer, (uint8*)buffer, size);
}
ssize_t
RingBuffer::Write(const void *buffer, size_t size)
size_t
RingBuffer::Write(const void *buffer, ssize_t size)
{
return ring_buffer_write(fBuffer, (uint8*)buffer, size);
}