Print this page
XXXX adding PID information to netstat output

*** 473,482 **** --- 473,484 ---- list_create(&so->so_acceptq_list, sizeof (struct sonode), offsetof(struct sonode, so_acceptq_node)); list_create(&so->so_acceptq_defer, sizeof (struct sonode), offsetof(struct sonode, so_acceptq_node)); + list_create(&so->so_pid_list, sizeof (pid_node_t), + offsetof(pid_node_t, pn_ref_link)); list_link_init(&so->so_acceptq_node); so->so_acceptq_len = 0; so->so_backlog = 0; so->so_listener = NULL;
*** 488,497 **** --- 490,500 ---- so->so_filter_top = NULL; so->so_filter_bottom = NULL; mutex_init(&so->so_lock, NULL, MUTEX_DEFAULT, NULL); mutex_init(&so->so_acceptq_lock, NULL, MUTEX_DEFAULT, NULL); + mutex_init(&so->so_pid_list_lock, NULL, MUTEX_DEFAULT, NULL); rw_init(&so->so_fallback_rwlock, NULL, RW_DEFAULT, NULL); cv_init(&so->so_state_cv, NULL, CV_DEFAULT, NULL); cv_init(&so->so_single_cv, NULL, CV_DEFAULT, NULL); cv_init(&so->so_read_cv, NULL, CV_DEFAULT, NULL);
*** 518,527 **** --- 521,531 ---- ASSERT(so->so_rcv_q_head == NULL); list_destroy(&so->so_acceptq_list); list_destroy(&so->so_acceptq_defer); + list_destroy(&so->so_pid_list); ASSERT(!list_link_active(&so->so_acceptq_node)); ASSERT(so->so_listener == NULL); ASSERT(so->so_filter_active == 0); ASSERT(so->so_filter_tx == 0);
*** 533,542 **** --- 537,547 ---- vn_free(vp); mutex_destroy(&so->so_lock); mutex_destroy(&so->so_acceptq_lock); + mutex_destroy(&so->so_pid_list_lock); rw_destroy(&so->so_fallback_rwlock); cv_destroy(&so->so_state_cv); cv_destroy(&so->so_single_cv); cv_destroy(&so->so_read_cv);
*** 624,633 **** --- 629,639 ---- void sonode_fini(struct sonode *so) { vnode_t *vp; + pid_node_t *pn; ASSERT(so->so_count == 0); if (so->so_rcv_timer_tid) { ASSERT(MUTEX_NOT_HELD(&so->so_lock));
*** 652,666 **** --- 658,724 ---- } /* Detach and destroy filters */ if (so->so_filter_top != NULL) sof_sonode_cleanup(so); + mutex_enter(&so->so_pid_list_lock); + while ((pn = list_head(&so->so_pid_list)) != NULL) { + list_remove(&so->so_pid_list, pn); + kmem_free(pn, sizeof (*pn)); + } + mutex_exit(&so->so_pid_list_lock); + ASSERT(list_is_empty(&so->so_acceptq_list)); ASSERT(list_is_empty(&so->so_acceptq_defer)); ASSERT(!list_link_active(&so->so_acceptq_node)); ASSERT(so->so_rcv_queued == 0); ASSERT(so->so_rcv_q_head == NULL); ASSERT(so->so_rcv_q_last_head == NULL); ASSERT(so->so_rcv_head == NULL); ASSERT(so->so_rcv_last_head == NULL); } + + void + sonode_insert_pid(struct sonode *so, pid_t pid) + { + pid_node_t *pn; + + mutex_enter(&so->so_pid_list_lock); + for (pn = list_head(&so->so_pid_list); + pn != NULL && pn->pn_pid != pid; + pn = list_next(&so->so_pid_list, pn)) + ; + + if (pn != NULL) { + pn->pn_count++; + } else { + pn = kmem_zalloc(sizeof (*pn), KM_SLEEP); + list_link_init(&pn->pn_ref_link); + pn->pn_pid = pid; + pn->pn_count = 1; + list_insert_tail(&so->so_pid_list, pn); + } + mutex_exit(&so->so_pid_list_lock); + } + + void + sonode_remove_pid(struct sonode *so, pid_t pid) + { + pid_node_t *pn; + + mutex_enter(&so->so_pid_list_lock); + for (pn = list_head(&so->so_pid_list); + pn != NULL && pn->pn_pid != pid; + pn = list_next(&so->so_pid_list, pn)) + ; + + if (pn != NULL) { + if (pn->pn_count > 1) { + pn->pn_count--; + } else { + list_remove(&so->so_pid_list, pn); + kmem_free(pn, sizeof (*pn)); + } + } + mutex_exit(&so->so_pid_list_lock); + }