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:
parent
962b0b887d
commit
298a7da920
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user