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:
@@ -24,6 +24,30 @@ static thread_id sTimerThread;
|
|||||||
static bigtime_t sTimerTimeout;
|
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
|
uint16
|
||||||
compute_checksum(uint8 *_buffer, size_t length)
|
compute_checksum(uint8 *_buffer, size_t length)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,6 +11,42 @@
|
|||||||
|
|
||||||
#include <net_stack.h>
|
#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
|
// checksums
|
||||||
uint16 compute_checksum(uint8 *_buffer, size_t length);
|
uint16 compute_checksum(uint8 *_buffer, size_t length);
|
||||||
|
|||||||
Reference in New Issue
Block a user