Sockets were not being closed when a task exits

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2070 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2009-09-16 20:29:00 +00:00
parent 01ba4b6d05
commit 12023242c8
3 changed files with 69 additions and 14 deletions

View File

@ -199,13 +199,13 @@ static inline void netclose_disconnect(FAR struct socket *psock)
****************************************************************************/
/****************************************************************************
* Function: net_close
* Function: net_closesocket
*
* Description:
* Performs the close operation on socket descriptors
* Performs the close operation on asocket instance
*
* Parameters:
* sockfd Socket descriptor of socket
* psock Socket instance
*
* Returned Value:
* 0 on success; -1 on error with errno set appropriately.
@ -214,9 +214,8 @@ static inline void netclose_disconnect(FAR struct socket *psock)
*
****************************************************************************/
int net_close(int sockfd)
int net_closesocket(FAR struct socket *psock)
{
FAR struct socket *psock = sockfd_socket(sockfd);
int err;
/* Verify that the sockfd corresponds to valid, allocated socket */
@ -298,7 +297,7 @@ int net_close(int sockfd)
/* Then release our reference on the socket structure containing the connection */
sockfd_release(sockfd);
sock_release(psock);
return OK;
errout:
@ -306,4 +305,25 @@ errout:
return ERROR;
}
/****************************************************************************
* Function: net_close
*
* Description:
* Performs the close operation on socket descriptors
*
* Parameters:
* sockfd Socket descriptor of socket
*
* Returned Value:
* 0 on success; -1 on error with errno set appropriately.
*
* Assumptions:
*
****************************************************************************/
int net_close(int sockfd)
{
return net_closesocket(sockfd_socket(sockfd));
}
#endif /* CONFIG_NET */

View File

@ -148,9 +148,14 @@ extern "C" {
/* net_sockets.c *************************************************************/
EXTERN int sockfd_allocate(int minsd);
EXTERN void sock_release(FAR struct socket *psock);
EXTERN void sockfd_release(int sockfd);
EXTERN FAR struct socket *sockfd_socket(int sockfd);
/* net_close.c ***************************************************************/
EXTERN int net_closesocket(FAR struct socket *psock);
/* sockopt support ***********************************************************/
#if defined(CONFIG_NET_SOCKOPTS) && !defined(CONFIG_DISABLE_CLOCK)

View File

@ -161,6 +161,8 @@ int net_addreflist(FAR struct socketlist *list)
int net_releaselist(FAR struct socketlist *list)
{
int crefs;
int ndx;
if (list)
{
/* Decrement the reference count on the list.
@ -182,12 +184,29 @@ int net_releaselist(FAR struct socketlist *list)
*/
if (crefs <= 0)
{
{
/* Close each open socket in the list
* REVISIT: net_closesocket() will attempt to use semaphores.
* If we actually are in the IDLE thread, then could this cause
* problems? Probably not, it the task has exited and crefs is
* zero, then there probably could not be a contender for the
* semaphore.
*/
for (ndx = 0; ndx < CONFIG_NSOCKET_DESCRIPTORS; ndx++)
{
FAR struct socket *psock = &list->sl_sockets[ndx];
if (psock->s_crefs > 0)
{
(void)net_closesocket(psock);
}
}
/* Destroy the semaphore and release the filelist */
(void)sem_destroy(&list->sl_sem);
sched_free(list);
}
}
}
return OK;
}
@ -226,14 +245,11 @@ int sockfd_allocate(int minsd)
return ERROR;
}
void sockfd_release(int sockfd)
void sock_release(FAR struct socket *psock)
{
FAR struct socket *psock;
/* Get the socket structure for this sockfd */
psock = sockfd_socket(sockfd);
#if CONFIG_DEBUG
if (psock)
#endif
{
/* Take the list semaphore so that there will be no accesses
* to this socket structure.
@ -262,6 +278,20 @@ void sockfd_release(int sockfd)
}
}
void sockfd_release(int sockfd)
{
/* Get the socket structure for this sockfd */
FAR struct socket *psock = sockfd_socket(sockfd);
/* Get the socket structure for this sockfd */
if (psock)
{
sock_release(psock);
}
}
FAR struct socket *sockfd_socket(int sockfd)
{
FAR struct socketlist *list;