* socket_delete() now also supports deleting children that still have a parent;

added a potentially dangerous TODO, though (will look into this tomorrow).
* Improved output of the KDL command, and also include the child sockets in the
  list.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29986 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2009-04-07 00:15:52 +00:00
parent c121b41fd2
commit ab134c0a9a
@@ -51,6 +51,8 @@ struct net_socket_private
struct select_sync_pool* select_pool; struct select_sync_pool* select_pool;
mutex lock; mutex lock;
bool is_connected;
}; };
@@ -221,6 +223,16 @@ socket_receive_no_buffer(net_socket* socket, msghdr* header, void* data,
#ifdef ADD_DEBUGGER_COMMANDS #ifdef ADD_DEBUGGER_COMMANDS
static void
print_socket_line(net_socket_private* socket, const char* prefix)
{
kprintf("%s%p %2d.%2d.%2d %6ld %p %p %p%s\n", prefix, socket,
socket->family, socket->type, socket->protocol, socket->owner,
socket->first_protocol, socket->first_info, socket->parent,
socket->parent != NULL ? socket->is_connected ? " (c)" : " (p)" : "");
}
static int static int
dump_socket(int argc, char** argv) dump_socket(int argc, char** argv)
{ {
@@ -242,6 +254,7 @@ dump_socket(int argc, char** argv)
kprintf(" bound to device: %d\n", socket->bound_to_device); kprintf(" bound to device: %d\n", socket->bound_to_device);
kprintf(" owner: %ld\n", socket->owner); kprintf(" owner: %ld\n", socket->owner);
kprintf(" max backlog: %ld\n", socket->max_backlog); kprintf(" max backlog: %ld\n", socket->max_backlog);
kprintf(" is connected: %d\n", socket->is_connected);
kprintf(" child_count: %lu\n", socket->child_count); kprintf(" child_count: %lu\n", socket->child_count);
if (socket->child_count == 0) if (socket->child_count == 0)
@@ -250,13 +263,13 @@ dump_socket(int argc, char** argv)
kprintf(" pending children:\n"); kprintf(" pending children:\n");
SocketList::Iterator iterator = socket->pending_children.GetIterator(); SocketList::Iterator iterator = socket->pending_children.GetIterator();
while (net_socket_private* child = iterator.Next()) { while (net_socket_private* child = iterator.Next()) {
kprintf(" %p\n", child); print_socket_line(child, " ");
} }
kprintf(" connected children:\n"); kprintf(" connected children:\n");
iterator = socket->connected_children.GetIterator(); iterator = socket->connected_children.GetIterator();
while (net_socket_private* child = iterator.Next()) { while (net_socket_private* child = iterator.Next()) {
kprintf(" %p\n", child); print_socket_line(child, " ");
} }
return 0; return 0;
@@ -270,9 +283,18 @@ dump_sockets(int argc, char** argv)
SocketList::Iterator iterator = sSocketList.GetIterator(); SocketList::Iterator iterator = sSocketList.GetIterator();
while (net_socket_private* socket = iterator.Next()) { while (net_socket_private* socket = iterator.Next()) {
kprintf("%p %2d.%2d.%2d %6ld %p %p %p\n", socket, print_socket_line(socket, "");
socket->family, socket->type, socket->protocol, socket->owner,
socket->first_protocol, socket->first_info, socket->parent); SocketList::Iterator childIterator
= socket->pending_children.GetIterator();
while (net_socket_private* child = childIterator.Next()) {
print_socket_line(child, " ");
}
childIterator = socket->connected_children.GetIterator();
while (net_socket_private* child = childIterator.Next()) {
print_socket_line(child, " ");
}
} }
return 0; return 0;
@@ -552,9 +574,22 @@ void
socket_delete(net_socket* _socket) socket_delete(net_socket* _socket)
{ {
net_socket_private* socket = (net_socket_private*)_socket; net_socket_private* socket = (net_socket_private*)_socket;
net_socket_private* parent = (net_socket_private*)socket->parent;
if (socket->parent != NULL) if (parent != NULL) {
panic("socket still has a parent!"); // The socket still has a parent
// TODO: we need to make sure our parent isn't deleted right now,
// or in the process of deleting its children...
MutexLocker _(parent->lock);
if (socket->is_connected)
parent->connected_children.Remove(socket);
else
parent->pending_children.Remove(socket);
parent->child_count--;
socket->parent = NULL;
}
mutex_lock(&sSocketLock); mutex_lock(&sSocketLock);
sSocketList.Remove(socket); sSocketList.Remove(socket);
@@ -565,6 +600,7 @@ socket_delete(net_socket* _socket)
delete_children(socket->connected_children); delete_children(socket->connected_children);
put_domain_protocols(socket); put_domain_protocols(socket);
mutex_destroy(&socket->lock); mutex_destroy(&socket->lock);
delete socket; delete socket;
} }
@@ -652,6 +688,7 @@ socket_connected(net_socket* socket)
parent->pending_children.Remove((net_socket_private*)socket); parent->pending_children.Remove((net_socket_private*)socket);
parent->connected_children.Add((net_socket_private*)socket); parent->connected_children.Add((net_socket_private*)socket);
((net_socket_private*)socket)->is_connected = true;
// notify parent // notify parent
if (parent->select_pool) if (parent->select_pool)