version 1.87, 2003/09/06 22:03:10 |
version 1.92, 2004/03/17 09:58:15 |
Line 90 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 90 __KERNEL_RCSID(0, "$NetBSD$"); |
|
#include <sys/resourcevar.h> |
#include <sys/resourcevar.h> |
#include <sys/pool.h> |
#include <sys/pool.h> |
#include <sys/event.h> |
#include <sys/event.h> |
|
#include <sys/poll.h> |
|
|
#include <uvm/uvm.h> |
#include <uvm/uvm.h> |
|
|
|
|
soinit(void) |
soinit(void) |
{ |
{ |
|
|
|
/* Set the initial adjusted socket buffer size. */ |
|
if (sb_max_set(sb_max)) |
|
panic("bad initial sb_max value: %lu\n", sb_max); |
|
|
pool_init(&socket_pool, sizeof(struct socket), 0, 0, 0, |
pool_init(&socket_pool, sizeof(struct socket), 0, 0, 0, |
"sockpl", NULL); |
"sockpl", NULL); |
|
|
Line 244 sodopendfree(struct socket *so) |
|
Line 249 sodopendfree(struct socket *so) |
|
pool_cache_put(&mbpool_cache, m); |
pool_cache_put(&mbpool_cache, m); |
} |
} |
|
|
for (;;) { |
|
m = so->so_pendfree; |
|
if (m == NULL) |
|
break; |
|
so->so_pendfree = m->m_next; |
|
splx(s); |
|
|
|
rv += m->m_ext.ext_size; |
|
sodoloanfree((m->m_flags & M_EXT_PAGES) ? |
|
m->m_ext.ext_pgs : NULL, m->m_ext.ext_buf, |
|
m->m_ext.ext_size); |
|
s = splvm(); |
|
pool_cache_put(&mbpool_cache, m); |
|
} |
|
|
|
splx(s); |
splx(s); |
return (rv); |
return (rv); |
} |
} |
Line 266 sodopendfree(struct socket *so) |
|
Line 256 sodopendfree(struct socket *so) |
|
void |
void |
soloanfree(struct mbuf *m, caddr_t buf, size_t size, void *arg) |
soloanfree(struct mbuf *m, caddr_t buf, size_t size, void *arg) |
{ |
{ |
struct socket *so = arg; |
|
int s; |
int s; |
|
|
if (m == NULL) { |
if (m == NULL) { |
Line 275 soloanfree(struct mbuf *m, caddr_t buf, |
|
Line 264 soloanfree(struct mbuf *m, caddr_t buf, |
|
} |
} |
|
|
s = splvm(); |
s = splvm(); |
m->m_next = so->so_pendfree; |
m->m_next = so_pendfree; |
so->so_pendfree = m; |
so_pendfree = m; |
splx(s); |
splx(s); |
if (sokvawaiters) |
if (sokvawaiters) |
wakeup(&socurkva); |
wakeup(&socurkva); |
Line 430 solisten(struct socket *so, int backlog) |
|
Line 419 solisten(struct socket *so, int backlog) |
|
void |
void |
sofree(struct socket *so) |
sofree(struct socket *so) |
{ |
{ |
struct mbuf *m; |
|
|
|
if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) |
if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) |
return; |
return; |
Line 445 sofree(struct socket *so) |
|
Line 433 sofree(struct socket *so) |
|
} |
} |
sbrelease(&so->so_snd); |
sbrelease(&so->so_snd); |
sorflush(so); |
sorflush(so); |
while ((m = so->so_pendfree) != NULL) { |
|
so->so_pendfree = m->m_next; |
|
m->m_next = so_pendfree; |
|
so_pendfree = m; |
|
} |
|
pool_put(&socket_pool, so); |
pool_put(&socket_pool, so); |
} |
} |
|
|
Line 1506 sogetopt(struct socket *so, int level, i |
|
Line 1489 sogetopt(struct socket *so, int level, i |
|
void |
void |
sohasoutofband(struct socket *so) |
sohasoutofband(struct socket *so) |
{ |
{ |
struct proc *p; |
fownsignal(so->so_pgid, SIGURG, POLL_PRI, POLLPRI|POLLRDBAND, so); |
ksiginfo_t ksi; |
|
memset(&ksi, 0, sizeof(ksi)); |
|
ksi.ksi_signo = SIGURG; |
|
|
|
if (so->so_pgid < 0) |
|
kgsignal(-so->so_pgid, &ksi, NULL); |
|
else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0) |
|
kpsignal(p, &ksi, NULL); |
|
selwakeup(&so->so_rcv.sb_sel); |
selwakeup(&so->so_rcv.sb_sel); |
} |
} |
|
|