version 1.164.2.2, 2008/09/18 04:31:44 |
version 1.164.2.3, 2008/10/10 22:34:14 |
Line 77 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 77 __KERNEL_RCSID(0, "$NetBSD$"); |
|
#include <sys/proc.h> |
#include <sys/proc.h> |
#include <sys/file.h> |
#include <sys/file.h> |
#include <sys/filedesc.h> |
#include <sys/filedesc.h> |
#include <sys/malloc.h> |
#include <sys/kmem.h> |
#include <sys/mbuf.h> |
#include <sys/mbuf.h> |
#include <sys/domain.h> |
#include <sys/domain.h> |
#include <sys/kernel.h> |
#include <sys/kernel.h> |
Line 639 soclose(struct socket *so) |
|
Line 639 soclose(struct socket *so) |
|
error = 0; |
error = 0; |
solock(so); |
solock(so); |
if (so->so_options & SO_ACCEPTCONN) { |
if (so->so_options & SO_ACCEPTCONN) { |
do { |
for (;;) { |
while ((so2 = TAILQ_FIRST(&so->so_q0)) != 0) { |
if ((so2 = TAILQ_FIRST(&so->so_q0)) != 0) { |
KASSERT(solocked2(so, so2)); |
KASSERT(solocked2(so, so2)); |
(void) soqremque(so2, 0); |
(void) soqremque(so2, 0); |
/* soabort drops the lock. */ |
/* soabort drops the lock. */ |
(void) soabort(so2); |
(void) soabort(so2); |
solock(so); |
solock(so); |
|
continue; |
} |
} |
while ((so2 = TAILQ_FIRST(&so->so_q)) != 0) { |
if ((so2 = TAILQ_FIRST(&so->so_q)) != 0) { |
KASSERT(solocked2(so, so2)); |
KASSERT(solocked2(so, so2)); |
(void) soqremque(so2, 1); |
(void) soqremque(so2, 1); |
/* soabort drops the lock. */ |
/* soabort drops the lock. */ |
(void) soabort(so2); |
(void) soabort(so2); |
solock(so); |
solock(so); |
|
continue; |
} |
} |
} while (!TAILQ_EMPTY(&so->so_q0)); |
break; |
|
} |
} |
} |
if (so->so_pcb == 0) |
if (so->so_pcb == 0) |
goto discard; |
goto discard; |
Line 1860 sockopt_alloc(struct sockopt *sopt, size |
|
Line 1863 sockopt_alloc(struct sockopt *sopt, size |
|
KASSERT(sopt->sopt_size == 0); |
KASSERT(sopt->sopt_size == 0); |
|
|
if (len > sizeof(sopt->sopt_buf)) |
if (len > sizeof(sopt->sopt_buf)) |
sopt->sopt_data = malloc(len, M_SOOPTS, M_WAITOK | M_ZERO); |
sopt->sopt_data = kmem_zalloc(len, KM_SLEEP); |
else |
else |
sopt->sopt_data = sopt->sopt_buf; |
sopt->sopt_data = sopt->sopt_buf; |
|
|
Line 1890 sockopt_destroy(struct sockopt *sopt) |
|
Line 1893 sockopt_destroy(struct sockopt *sopt) |
|
{ |
{ |
|
|
if (sopt->sopt_data != sopt->sopt_buf) |
if (sopt->sopt_data != sopt->sopt_buf) |
free(sopt->sopt_data, M_SOOPTS); |
kmem_free(sopt->sopt_data, sopt->sopt_size); |
|
|
memset(sopt, 0, sizeof(*sopt)); |
memset(sopt, 0, sizeof(*sopt)); |
} |
} |