Print this page
XXXX adding PID information to netstat output

@@ -73,10 +73,11 @@
         ASSERT(size > 0);
         ASSERT(size >= offset + sizeof (list_node_t));
 
         list->list_size = size;
         list->list_offset = offset;
+        list->list_numnodes = 0;
         list->list_head.list_next = list->list_head.list_prev =
             &list->list_head;
 }
 
 void

@@ -86,10 +87,11 @@
 
         ASSERT(list);
         ASSERT(list->list_head.list_next == node);
         ASSERT(list->list_head.list_prev == node);
 
+        list->list_numnodes = 0;
         node->list_next = node->list_prev = NULL;
 }
 
 void
 list_insert_after(list_t *list, void *object, void *nobject)

@@ -115,45 +117,50 @@
 
 void
 list_insert_head(list_t *list, void *object)
 {
         list_node_t *lold = &list->list_head;
+        list->list_numnodes++;
         list_insert_after_node(list, lold, object);
 }
 
 void
 list_insert_tail(list_t *list, void *object)
 {
         list_node_t *lold = &list->list_head;
+        list->list_numnodes++;
         list_insert_before_node(list, lold, object);
 }
 
 void
 list_remove(list_t *list, void *object)
 {
         list_node_t *lold = list_d2l(list, object);
         ASSERT(!list_empty(list));
         ASSERT(lold->list_next != NULL);
+        list->list_numnodes--;
         list_remove_node(lold);
 }
 
 void *
 list_remove_head(list_t *list)
 {
         list_node_t *head = list->list_head.list_next;
         if (head == &list->list_head)
                 return (NULL);
+        list->list_numnodes--;
         list_remove_node(head);
         return (list_object(list, head));
 }
 
 void *
 list_remove_tail(list_t *list)
 {
         list_node_t *tail = list->list_head.list_prev;
         if (tail == &list->list_head)
                 return (NULL);
+        list->list_numnodes--;
         list_remove_node(tail);
         return (list_object(list, tail));
 }
 
 void *

@@ -207,16 +214,18 @@
         ASSERT(dst->list_offset == src->list_offset);
 
         if (list_empty(src))
                 return;
 
+        dst->list_numnodes += src->list_numnodes;
         dstnode->list_prev->list_next = srcnode->list_next;
         srcnode->list_next->list_prev = dstnode->list_prev;
         dstnode->list_prev = srcnode->list_prev;
         srcnode->list_prev->list_next = dstnode;
 
         /* empty src list */
+        src->list_numnodes = 0;
         srcnode->list_next = srcnode->list_prev = srcnode;
 }
 
 void
 list_link_replace(list_node_t *lold, list_node_t *lnew)

@@ -247,5 +256,22 @@
 int
 list_is_empty(list_t *list)
 {
         return (list_empty(list));
 }
+
+ulong_t
+list_numnodes(list_t *list)
+{
+        /*
+        size_t sz = 0;
+        list_node_t *node;
+
+        node = &list->list_head;
+        while (node->list_next != &list->list_head) {
+                sz++;
+                node = node->list_next;
+        }
+        return (sz);
+        */
+        return (list->list_numnodes);
+}