diff options
author | rrs <rrs@FreeBSD.org> | 2008-06-15 12:31:23 +0000 |
---|---|---|
committer | rrs <rrs@FreeBSD.org> | 2008-06-15 12:31:23 +0000 |
commit | 257bc23f07a1cb68b85763c927a7e37c453fe682 (patch) | |
tree | 71cac4351754aa7eb6ca3c487904dee3e5b328af /sys/netinet | |
parent | b431d5267e06713f81d6a7977d22ef411fef6127 (diff) | |
download | FreeBSD-src-257bc23f07a1cb68b85763c927a7e37c453fe682.zip FreeBSD-src-257bc23f07a1cb68b85763c927a7e37c453fe682.tar.gz |
More prep for Vimage:
- only one functino to destroy an SCTP stack sctp_finish()
- Make it so this function also arranges for any threads
created by the image to do a kthread_exit()
Diffstat (limited to 'sys/netinet')
-rw-r--r-- | sys/netinet/sctp_pcb.c | 16 | ||||
-rw-r--r-- | sys/netinet/sctp_pcb.h | 2 | ||||
-rw-r--r-- | sys/netinet/sctp_usrreq.c | 17 | ||||
-rw-r--r-- | sys/netinet/sctp_var.h | 1 |
4 files changed, 17 insertions, 19 deletions
diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c index 3383ae4..5cdc812 100644 --- a/sys/netinet/sctp_pcb.c +++ b/sys/netinet/sctp_pcb.c @@ -5330,6 +5330,7 @@ sctp_pcb_init() #if defined(SCTP_USE_THREAD_BASED_ITERATOR) SCTP_BASE_INFO(iterator_running) = 0; + SCTP_BASE_INFO(threads_must_exit) = 0; sctp_startup_iterator(); #endif @@ -5357,6 +5358,11 @@ sctp_pcb_finish(void) int i; /* FIXME MT */ + SCTP_BASE_INFO(threads_must_exit) = 1; +#if defined(SCTP_USE_THREAD_BASED_ITERATOR) + /* Wake the thread up so it will exit now */ + sctp_wakeup_iterator(); +#endif /* * free the vrf/ifn/ifa lists and hashes (be sure address monitor is * destroyed first). @@ -5428,6 +5434,16 @@ sctp_pcb_finish(void) SCTP_ZONE_DESTROY(SCTP_BASE_INFO(ipi_zone_strmoq)); SCTP_ZONE_DESTROY(SCTP_BASE_INFO(ipi_zone_asconf)); SCTP_ZONE_DESTROY(SCTP_BASE_INFO(ipi_zone_asconf_ack)); + /* Get rid of other stuff to */ + if (SCTP_BASE_INFO(sctp_asochash) != NULL) + SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_asochash), SCTP_BASE_INFO(hashasocmark)); + if (SCTP_BASE_INFO(sctp_ephash) != NULL) + SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_ephash), SCTP_BASE_INFO(hashmark)); + if (SCTP_BASE_INFO(sctp_tcpephash) != NULL) + SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_tcpephash), SCTP_BASE_INFO(hashtcpmark)); + if (SCTP_BASE_INFO(sctp_restarthash) != NULL) + SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_restarthash), SCTP_BASE_INFO(hashrestartmark)); + } diff --git a/sys/netinet/sctp_pcb.h b/sys/netinet/sctp_pcb.h index 0f75acc..ef0cdf9 100644 --- a/sys/netinet/sctp_pcb.h +++ b/sys/netinet/sctp_pcb.h @@ -177,7 +177,7 @@ struct sctp_epinfo { struct sctpladdr addr_wq; struct sctpiterators iteratorhead; - + int threads_must_exit; /* ep zone info */ sctp_zone_t ipi_zone_ep; sctp_zone_t ipi_zone_asoc; diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index 1fb2b07..7d92968 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -98,23 +98,6 @@ sctp_finish(void) sctp_pcb_finish(); } -/* - * cleanup of the SCTP_BASE_INFO() structure. - * Assumes that the SCTP_BASE_INFO() lock is held. - */ -void -sctp_pcbinfo_cleanup(void) -{ - /* free the hash tables */ - if (SCTP_BASE_INFO(sctp_asochash) != NULL) - SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_asochash), SCTP_BASE_INFO(hashasocmark)); - if (SCTP_BASE_INFO(sctp_ephash) != NULL) - SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_ephash), SCTP_BASE_INFO(hashmark)); - if (SCTP_BASE_INFO(sctp_tcpephash) != NULL) - SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_tcpephash), SCTP_BASE_INFO(hashtcpmark)); - if (SCTP_BASE_INFO(sctp_restarthash) != NULL) - SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_restarthash), SCTP_BASE_INFO(hashrestartmark)); -} void diff --git a/sys/netinet/sctp_var.h b/sys/netinet/sctp_var.h index 38f476a..e66d74c 100644 --- a/sys/netinet/sctp_var.h +++ b/sys/netinet/sctp_var.h @@ -308,7 +308,6 @@ void sctp_init __P((void)); void sctp_finish(void); -void sctp_pcbinfo_cleanup(void); int sctp_flush(struct socket *, int); int sctp_shutdown __P((struct socket *)); void sctp_notify |