From f90fc6a679fe64c73bd4b403c2a4cbadde37c9ad Mon Sep 17 00:00:00 2001 From: Adi Oanca Date: Sun, 31 Aug 2003 17:21:49 +0000 Subject: [PATCH] PortLink now uses a fixed buffer. Its base class is.... BSession... git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4424 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/app/PortLink.h | 118 ++++++++++++--------------------- 1 file changed, 44 insertions(+), 74 deletions(-) diff --git a/headers/private/app/PortLink.h b/headers/private/app/PortLink.h index 7fc1b811f8..5bedb4c404 100644 --- a/headers/private/app/PortLink.h +++ b/headers/private/app/PortLink.h @@ -1,88 +1,58 @@ -#ifndef _PORTLINK_H_ -#define _PORTLINK_H_ +#ifndef _PORTLINK_H +#define _PORTLINK_H -#include + +#include #include -#include -#include -#include + +#include "Session.h" class PortMessage; -/*! - \class PortLinkData PortLink.cpp - \brief Internal data storage class - - PortLinkData objects serve to hold attached data whilst it is waiting to be Flattened() - and then Flushed(). There is no need for this to be used outside the PortLink class. -*/ -class PortLinkData -{ +class PortLink : public BSession{ public: - PortLinkData(void); - ~PortLinkData(void); - status_t Set(const void *data, size_t size); - char *buffer; - size_t buffersize; -}; - - -class PortLink -{ -public: - class ReplyData - { - public: - ReplyData(void) { code=0; buffersize=0; buffer=NULL; } - ~ReplyData(void) { if(buffer) delete buffer; } - int32 code; - ssize_t buffersize; - int8 *buffer; - }; - PortLink(port_id port); - PortLink(const PortLink &link); - ~PortLink(void); - void SetOpCode(int32 code); - void SetPort(port_id port); - port_id GetPort(void); - status_t Flush(bigtime_t timeout=B_INFINITE_TIMEOUT); - int8* FlushWithReply(int32 *code, status_t *status, ssize_t *buffersize, - bigtime_t timeout=B_INFINITE_TIMEOUT); - status_t FlushWithReply(PortLink::ReplyData *data,bigtime_t timeout=B_INFINITE_TIMEOUT); - status_t FlushWithReply(PortMessage *msg,bigtime_t timeout=B_INFINITE_TIMEOUT); - - status_t Attach(const void *data, size_t size); - template status_t Attach(Type data) + class ReplyData { - int32 size=sizeof(Type); + public: + ReplyData(void) { code=0; buffersize=0; buffer=NULL; } + ~ReplyData(void) { if(buffer) delete buffer; } + + int32 code; + ssize_t buffersize; + int8 *buffer; + }; + + PortLink( port_id port ); + PortLink( const PortLink &link ); + virtual ~PortLink() { } - #ifdef CAPACITY_CHECKING - if(bufferlength+size>capacity) - return B_NO_MEMORY; - #endif + void SetOpCode( int32 code ); + void SetPort( port_id port ); + port_id GetPort(); + status_t Flush( bigtime_t timeout = B_INFINITE_TIMEOUT ); + int8* FlushWithReply( int32 *code, status_t *status, ssize_t *buffersize, + bigtime_t timeout=B_INFINITE_TIMEOUT ); + status_t FlushWithReply( PortLink::ReplyData *data,bigtime_t timeout=B_INFINITE_TIMEOUT ); + status_t FlushWithReply( PortMessage *msg,bigtime_t timeout=B_INFINITE_TIMEOUT ); - // create a new storage object and stash the data - PortLinkData *pld=new PortLinkData; - if(pld->Set(&data,size)==B_OK) - { - attachlist->AddItem(pld); - bufferlength+=size; + status_t Attach(const void *data, size_t size); + void MakeEmpty(); + template status_t Attach(Type data) + { + int32 size = sizeof(Type); + + if (4096 - fSendPosition > size){ + memcpy(fSendBuffer + fSendPosition, &data, size); + fSendPosition += size; + return B_OK; } - else - { - delete pld; - return B_ERROR; - } - return B_OK; + return B_NO_MEMORY; } - void MakeEmpty(void); -protected: - void FlattenData(int8 **buffer,int32 *size); - port_id target, replyport; - int32 opcode; - uint32 bufferlength,capacity; - bool port_ok; - BList *attachlist; + +private: + bool port_ok; }; +//extern _IMPEXP_BE _PortLink_ *main_session; + #endif