introduced fifo_socket_enqueue_buffer which clones the buffer, enqueues it to the fifo and notifies the socket.

- changed the link, ipv4 and udp modules to use fifo_socket_enqueue_buffer


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20587 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Hugo Santos
2007-04-05 17:56:20 +00:00
parent a5e9026688
commit 0d5afa4dec
7 changed files with 40 additions and 40 deletions
+2
View File
@@ -90,6 +90,8 @@ struct net_stack_module_info {
ssize_t (*fifo_dequeue_buffer)(struct net_fifo *fifo, uint32 flags,
bigtime_t timeout, struct net_buffer **_buffer);
status_t (*clear_fifo)(struct net_fifo *fifo);
status_t (*fifo_socket_enqueue_buffer)(struct net_fifo *, struct net_socket *,
uint8 event, struct net_buffer *);
// timer
void (*init_timer)(struct net_timer *timer, net_timer_func hook, void *data);
@@ -202,19 +202,8 @@ RawSocket::BytesAvailable()
status_t
RawSocket::Write(net_buffer *source)
{
// we need to make a clone for that buffer and pass it to the socket
net_buffer *buffer = gBufferModule->clone(source, false);
TRACE(("ipv4::RawSocket::Write(): cloned buffer %p\n", buffer));
if (buffer == NULL)
return B_NO_MEMORY;
status_t status = sStackModule->fifo_enqueue_buffer(&fFifo, buffer);
if (status >= B_OK)
sStackModule->notify_socket(fSocket, B_SELECT_READ, BytesAvailable());
else
gBufferModule->free(buffer);
return status;
return sStackModule->fifo_socket_enqueue_buffer(&fFifo, fSocket,
B_SELECT_READ, source);
}
@@ -860,17 +860,9 @@ UdpEndpoint::StoreData(net_buffer *_buffer)
{
TRACE(("buffer %p passed to endpoint with (%s)\n", _buffer,
AddressString(sDomain, (sockaddr *)&socket->address, true).Data()));
net_buffer *buffer = gBufferModule->clone(_buffer, false);
if (buffer == NULL)
return B_NO_MEMORY;
status_t status = sStackModule->fifo_enqueue_buffer(&fFifo, buffer);
if (status >= B_OK)
sStackModule->notify_socket(socket, B_SELECT_READ, BytesAvailable());
else
gBufferModule->free(buffer);
return status;
return sStackModule->fifo_socket_enqueue_buffer(&fFifo, socket,
B_SELECT_READ, _buffer);
}
+2 -13
View File
@@ -40,19 +40,8 @@ link_monitor_data(void *cookie, net_buffer *packet)
{
link_protocol *protocol = (link_protocol *)cookie;
// we need to make a clone for that buffer and pass it to the socket
net_buffer *buffer = gNetBufferModule.clone(packet, false);
if (buffer == NULL)
return B_NO_MEMORY;
status_t status = fifo_enqueue_buffer(&protocol->fifo, buffer);
if (status >= B_OK)
notify_socket(protocol->socket, B_SELECT_READ,
protocol->fifo.current_bytes);
else
gNetBufferModule.free(buffer);
return status;
return fifo_socket_enqueue_buffer(&protocol->fifo, protocol->socket,
B_SELECT_READ, packet);
}
@@ -923,6 +923,7 @@ static net_stack_module_info sNetStackModule = {
fifo_enqueue_buffer,
fifo_dequeue_buffer,
clear_fifo,
fifo_socket_enqueue_buffer,
init_timer,
set_timer,
+29 -4
View File
@@ -134,11 +134,9 @@ uninit_fifo(net_fifo *fifo)
}
status_t
fifo_enqueue_buffer(net_fifo *fifo, net_buffer *buffer)
static status_t
_fifo_enqueue_buffer(net_fifo *fifo, net_buffer *buffer)
{
BenaphoreLocker locker(fifo->lock);
if (fifo->max_bytes > 0 && fifo->current_bytes + buffer->size > fifo->max_bytes)
return ENOBUFS;
@@ -155,6 +153,13 @@ fifo_enqueue_buffer(net_fifo *fifo, net_buffer *buffer)
return B_OK;
}
status_t
fifo_enqueue_buffer(net_fifo *fifo, net_buffer *buffer)
{
BenaphoreLocker locker(fifo->lock);
return _fifo_enqueue_buffer(fifo, buffer);
}
/*!
Gets the first buffer from the FIFO. If there is no buffer, it
@@ -243,6 +248,26 @@ clear_fifo(net_fifo *fifo)
}
status_t
fifo_socket_enqueue_buffer(net_fifo *fifo, net_socket *socket, uint8 event,
net_buffer *_buffer)
{
net_buffer *buffer = gNetBufferModule.clone(_buffer, false);
if (buffer == NULL)
return B_NO_MEMORY;
BenaphoreLocker locker(fifo->lock);
status_t status = _fifo_enqueue_buffer(fifo, buffer);
if (status < B_OK)
gNetBufferModule.free(buffer);
else
notify_socket(socket, event, fifo->current_bytes);
return status;
}
// #pragma mark - Timer
@@ -62,6 +62,8 @@ status_t fifo_enqueue_buffer(net_fifo *fifo, struct net_buffer *buffer);
ssize_t fifo_dequeue_buffer(net_fifo *fifo, uint32 flags, bigtime_t timeout,
struct net_buffer **_buffer);
status_t clear_fifo(net_fifo *fifo);
status_t fifo_socket_enqueue_buffer(net_fifo *, net_socket *, uint8 event,
net_buffer *);
// timer
void init_timer(net_timer *timer, net_timer_func hook, void *data);