added new helper ProtocolSocket. Moved some stuff together to achieve better inlining.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20848 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Hugo Santos
2007-04-27 07:09:46 +00:00
parent 13593fb776
commit 4b55736dde
4 changed files with 64 additions and 48 deletions
+7 -22
View File
@@ -16,20 +16,13 @@
class SocketAddress { class SocketAddress {
public: public:
SocketAddress(net_address_module_info *module, sockaddr *address) SocketAddress(net_address_module_info *module, sockaddr *address)
: fModule(module), fAddress(NULL) : fModule(module), fAddress(address) {}
{
SetAddressTo(address);
}
SocketAddress(net_address_module_info *module, sockaddr_storage *address) SocketAddress(net_address_module_info *module, sockaddr_storage *address)
: fModule(module), fAddress(NULL) : fModule(module), fAddress((sockaddr *)address) {}
{
SetAddressTo((sockaddr *)address);
}
SocketAddress(const SocketAddress &address) SocketAddress(const SocketAddress &address)
: fModule(address.fModule), fAddress(address.fAddress) : fModule(address.fModule), fAddress(address.fAddress) {}
{}
void SetAddressTo(sockaddr *address) void SetAddressTo(sockaddr *address)
{ {
@@ -113,25 +106,17 @@ class ConstSocketAddress {
public: public:
ConstSocketAddress(net_address_module_info *module, ConstSocketAddress(net_address_module_info *module,
const sockaddr *address) const sockaddr *address)
: fModule(module), fAddress(NULL) : fModule(module), fAddress(address) {}
{
SetAddressTo(address);
}
ConstSocketAddress(net_address_module_info *module, ConstSocketAddress(net_address_module_info *module,
const sockaddr_storage *address) const sockaddr_storage *address)
: fModule(module), fAddress(NULL) : fModule(module), fAddress((sockaddr *)address) {}
{
SetAddressTo((sockaddr *)address);
}
ConstSocketAddress(const ConstSocketAddress &address) ConstSocketAddress(const ConstSocketAddress &address)
: fModule(address.fModule), fAddress(address.fAddress) : fModule(address.fModule), fAddress(address.fAddress) {}
{}
ConstSocketAddress(const SocketAddress &address) ConstSocketAddress(const SocketAddress &address)
: fModule(address.Module()), fAddress(*address) : fModule(address.Module()), fAddress(*address) {}
{}
void SetAddressTo(const sockaddr *address) void SetAddressTo(const sockaddr *address)
{ {
+48 -3
View File
@@ -14,9 +14,12 @@
#include <util/DoublyLinkedList.h> #include <util/DoublyLinkedList.h>
#include <net_buffer.h> #include <net_buffer.h>
#include <net_protocol.h>
#include <net_socket.h> #include <net_socket.h>
#include <net_stack.h> #include <net_stack.h>
#include <AddressUtilities.h>
class BenaphoreLocking { class BenaphoreLocking {
public: public:
typedef benaphore Type; typedef benaphore Type;
@@ -40,9 +43,52 @@ public:
}; };
class ProtocolSocket {
public:
ProtocolSocket(net_socket *socket);
status_t Open();
SocketAddress LocalAddress()
{ return SocketAddress(fDomain->address_module, &fSocket->address); }
ConstSocketAddress LocalAddress() const
{ return ConstSocketAddress(fDomain->address_module, &fSocket->address); }
SocketAddress PeerAddress()
{ return SocketAddress(fDomain->address_module, &fSocket->peer); }
ConstSocketAddress PeerAddress() const
{ return ConstSocketAddress(fDomain->address_module, &fSocket->peer); }
net_domain *Domain() const { return fDomain; }
net_address_module_info *AddressModule() const
{ return fDomain->address_module; }
protected:
net_socket *fSocket;
net_domain *fDomain;
};
inline ProtocolSocket::ProtocolSocket(net_socket *socket)
: fSocket(socket), fDomain(NULL) {}
inline status_t
ProtocolSocket::Open()
{
fDomain = fSocket->first_protocol->module->get_domain(
fSocket->first_protocol);
if (fDomain == NULL || fDomain->address_module == NULL)
return EAFNOSUPPORT;
return B_OK;
}
template<typename LockingBase = BenaphoreLocking, template<typename LockingBase = BenaphoreLocking,
typename ModuleBundle = NetModuleBundleGetter> typename ModuleBundle = NetModuleBundleGetter>
class DatagramSocket { class DatagramSocket : public ProtocolSocket {
public: public:
DatagramSocket(const char *name, net_socket *socket); DatagramSocket(const char *name, net_socket *socket);
virtual ~DatagramSocket(); virtual ~DatagramSocket();
@@ -83,7 +129,6 @@ protected:
typedef DoublyLinkedListCLink<net_buffer> NetBufferLink; typedef DoublyLinkedListCLink<net_buffer> NetBufferLink;
typedef DoublyLinkedList<net_buffer, NetBufferLink> BufferList; typedef DoublyLinkedList<net_buffer, NetBufferLink> BufferList;
net_socket *fSocket;
sem_id fNotify; sem_id fNotify;
BufferList fBuffers; BufferList fBuffers;
size_t fCurrentBytes; size_t fCurrentBytes;
@@ -98,7 +143,7 @@ protected:
DECL_DATAGRAM_SOCKET(inline)::DatagramSocket(const char *name, DECL_DATAGRAM_SOCKET(inline)::DatagramSocket(const char *name,
net_socket *socket) net_socket *socket)
: fSocket(socket), fCurrentBytes(0) : ProtocolSocket(socket), fCurrentBytes(0)
{ {
status_t status = LockingBase::Init(&fLock, name); status_t status = LockingBase::Init(&fLock, name);
if (status < B_OK) if (status < B_OK)
@@ -211,6 +211,7 @@ WaitList::Signal()
TCPEndpoint::TCPEndpoint(net_socket *socket) TCPEndpoint::TCPEndpoint(net_socket *socket)
: :
ProtocolSocket(socket),
fManager(NULL), fManager(NULL),
fReceiveList("tcp receive"), fReceiveList("tcp receive"),
fSendList("tcp send"), fSendList("tcp send"),
@@ -298,8 +299,9 @@ TCPEndpoint::Open()
{ {
TRACE("Open()"); TRACE("Open()");
if (Domain() == NULL || AddressModule() == NULL) status_t status = ProtocolSocket::Open();
return EAFNOSUPPORT; if (status < B_OK)
return status;
fManager = create_endpoint_manager(Domain()); fManager = create_endpoint_manager(Domain());
if (fManager == NULL) if (fManager == NULL)
@@ -10,10 +10,12 @@
#define TCP_ENDPOINT_H #define TCP_ENDPOINT_H
#include "tcp.h"
#include "BufferQueue.h" #include "BufferQueue.h"
#include "EndpointManager.h"
#include "tcp.h"
#include <AddressUtilities.h>
#include <ProtocolUtilities.h>
#include <net_protocol.h> #include <net_protocol.h>
#include <net_stack.h> #include <net_stack.h>
#include <util/AutoLock.h> #include <util/AutoLock.h>
@@ -23,8 +25,6 @@
#include <stddef.h> #include <stddef.h>
class EndpointManager;
class WaitList { class WaitList {
public: public:
WaitList(const char *name); WaitList(const char *name);
@@ -40,7 +40,7 @@ private:
}; };
class TCPEndpoint : public net_protocol { class TCPEndpoint : public net_protocol, public ProtocolSocket {
public: public:
TCPEndpoint(net_socket *socket); TCPEndpoint(net_socket *socket);
~TCPEndpoint(); ~TCPEndpoint();
@@ -69,16 +69,6 @@ class TCPEndpoint : public net_protocol {
tcp_state State() const { return fState; } tcp_state State() const { return fState; }
bool IsBound() const; bool IsBound() const;
SocketAddress LocalAddress()
{ return SocketAddress(AddressModule(), &socket->address); }
ConstSocketAddress LocalAddress() const
{ return ConstSocketAddress(AddressModule(), &socket->address); }
SocketAddress PeerAddress()
{ return SocketAddress(AddressModule(), &socket->peer); }
ConstSocketAddress PeerAddress() const
{ return ConstSocketAddress(AddressModule(), &socket->peer); }
void DeleteSocket(); void DeleteSocket();
status_t DelayedAcknowledge(); status_t DelayedAcknowledge();
@@ -89,12 +79,6 @@ class TCPEndpoint : public net_protocol {
int32 Spawn(TCPEndpoint *parent, tcp_segment_header& segment, int32 Spawn(TCPEndpoint *parent, tcp_segment_header& segment,
net_buffer *buffer); net_buffer *buffer);
net_domain *Domain() const
{ return socket->first_protocol->module->get_domain(
socket->first_protocol); }
net_address_module_info *AddressModule() const
{ return Domain()->address_module; }
private: private:
friend class EndpointManager; friend class EndpointManager;