UserBuffer: generic userspace supplied buffer and copy management

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20501 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Hugo Santos 2007-04-01 17:35:43 +00:00
parent 962b0b887d
commit 298a7da920
2 changed files with 60 additions and 0 deletions

View File

@ -24,6 +24,30 @@ static thread_id sTimerThread;
static bigtime_t sTimerTimeout;
void *
UserBuffer::Copy(void *source, size_t length)
{
if (fStatus != B_OK)
return NULL;
if (fAvailable < length) {
fStatus = ENOBUFS;
return NULL;
}
fStatus = user_memcpy(fBuffer, source, length);
if (fStatus < B_OK)
return NULL;
void *current = fBuffer;
fAvailable -= length;
fBuffer += length;
return current;
}
uint16
compute_checksum(uint8 *_buffer, size_t length)
{

View File

@ -11,6 +11,42 @@
#include <net_stack.h>
class UserBuffer {
public:
UserBuffer(void *buffer, size_t size);
void *Copy(void *source, size_t size);
status_t Status() const;
size_t ConsumedAmount() const;
private:
uint8 *fBuffer;
size_t fBufferSize, fAvailable;
status_t fStatus;
};
inline
UserBuffer::UserBuffer(void *buffer, size_t size)
: fBuffer((uint8 *)buffer), fBufferSize(size),
fAvailable(size), fStatus(B_OK)
{
}
inline status_t
UserBuffer::Status() const
{
return fStatus;
}
inline size_t
UserBuffer::ConsumedAmount() const
{
return fBufferSize - fAvailable;
}
// checksums
uint16 compute_checksum(uint8 *_buffer, size_t length);