diff --git a/net/local/local.h b/net/local/local.h index cb9c00d5b8..8804c783e1 100644 --- a/net/local/local.h +++ b/net/local/local.h @@ -223,6 +223,40 @@ FAR struct local_conn_s *local_alloc(void); void local_free(FAR struct local_conn_s *conn); +/**************************************************************************** + * Name: local_addref + * + * Description: + * Increment the reference count on the underlying connection structure. + * + * Input Parameters: + * conn - Socket structure of the socket whose reference count will be + * incremented. + * + * Returned Value: + * None + * + ****************************************************************************/ + +void local_addref(FAR struct local_conn_s *conn); + +/**************************************************************************** + * Name: local_subref + * + * Description: + * Subtract the reference count on the underlying connection structure. + * + * Input Parameters: + * conn - Socket structure of the socket whose reference count will be + * incremented. + * + * Returned Value: + * None + * + ****************************************************************************/ + +void local_subref(FAR struct local_conn_s *conn); + /**************************************************************************** * Name: local_nextconn * diff --git a/net/local/local_accept.c b/net/local/local_accept.c index df727a34d2..9621335c81 100644 --- a/net/local/local_accept.c +++ b/net/local/local_accept.c @@ -144,6 +144,8 @@ int local_accept(FAR struct socket *psock, FAR struct sockaddr *addr, client = container_of(waiter, struct local_conn_s, u.client.lc_waiter); + local_addref(client); + /* Decrement the number of pending clients */ DEBUGASSERT(server->u.server.lc_pending > 0); @@ -163,7 +165,8 @@ int local_accept(FAR struct socket *psock, FAR struct sockaddr *addr, { /* Initialize the new connection structure */ - conn->lc_crefs = 1; + local_addref(conn); + conn->lc_proto = SOCK_STREAM; conn->lc_type = LOCAL_TYPE_PATHNAME; conn->lc_state = LOCAL_STATE_CONNECTED; @@ -246,6 +249,8 @@ int local_accept(FAR struct socket *psock, FAR struct sockaddr *addr, ret = net_sem_wait(&client->lc_donesem); } + local_subref(client); + return ret; } diff --git a/net/local/local_conn.c b/net/local/local_conn.c index 6d8cef1518..7a27c40661 100644 --- a/net/local/local_conn.c +++ b/net/local/local_conn.c @@ -225,4 +225,51 @@ void local_free(FAR struct local_conn_s *conn) kmm_free(conn); } +/**************************************************************************** + * Name: local_addref + * + * Description: + * Increment the reference count on the underlying connection structure. + * + * Input Parameters: + * psock - Socket structure of the socket whose reference count will be + * incremented. + * + * Returned Value: + * None + * + ****************************************************************************/ + +void local_addref(FAR struct local_conn_s *conn) +{ + DEBUGASSERT(conn->lc_crefs >= 0 && conn->lc_crefs < 255); + conn->lc_crefs++; +} + +/**************************************************************************** + * Name: local_subref + * + * Description: + * Subtract the reference count on the underlying connection structure. + * + * Input Parameters: + * psock - Socket structure of the socket whose reference count will be + * incremented. + * + * Returned Value: + * None + * + ****************************************************************************/ + +void local_subref(FAR struct local_conn_s *conn) +{ + DEBUGASSERT(conn->lc_crefs > 0 && conn->lc_crefs < 255); + + conn->lc_crefs--; + if (conn->lc_crefs == 0) + { + local_release(conn); + } +} + #endif /* CONFIG_NET && CONFIG_NET_LOCAL */ diff --git a/net/local/local_sockif.c b/net/local/local_sockif.c index 500b3ee6f0..77b5abb55e 100644 --- a/net/local/local_sockif.c +++ b/net/local/local_sockif.c @@ -49,7 +49,7 @@ static int local_setup(FAR struct socket *psock); static sockcaps_t local_sockcaps(FAR struct socket *psock); -static void local_addref(FAR struct socket *psock); +static void local_sockaddref(FAR struct socket *psock); static int local_bind(FAR struct socket *psock, FAR const struct sockaddr *addr, socklen_t addrlen); static int local_getsockname(FAR struct socket *psock, @@ -80,7 +80,7 @@ const struct sock_intf_s g_local_sockif = { local_setup, /* si_setup */ local_sockcaps, /* si_sockcaps */ - local_addref, /* si_addref */ + local_sockaddref, /* si_addref */ local_bind, /* si_bind */ local_getsockname, /* si_getsockname */ local_getpeername, /* si_getpeername */ @@ -137,8 +137,7 @@ static int local_sockif_alloc(FAR struct socket *psock) * count will be incremented only if the socket is dup'ed */ - DEBUGASSERT(conn->lc_crefs == 0); - conn->lc_crefs = 1; + local_addref(conn); /* Save the pre-allocated connection in the socket structure */ @@ -243,7 +242,7 @@ static sockcaps_t local_sockcaps(FAR struct socket *psock) } /**************************************************************************** - * Name: local_addref + * Name: local_sockaddref * * Description: * Increment the reference count on the underlying connection structure. @@ -257,15 +256,10 @@ static sockcaps_t local_sockcaps(FAR struct socket *psock) * ****************************************************************************/ -static void local_addref(FAR struct socket *psock) +static void local_sockaddref(FAR struct socket *psock) { - FAR struct local_conn_s *conn; - DEBUGASSERT(psock->s_domain == PF_LOCAL); - - conn = psock->s_conn; - DEBUGASSERT(conn->lc_crefs > 0 && conn->lc_crefs < 255); - conn->lc_crefs++; + local_addref(psock->s_conn); } /**************************************************************************** @@ -773,23 +767,11 @@ static int local_close(FAR struct socket *psock) #endif case SOCK_CTRL: { - FAR struct local_conn_s *conn = psock->s_conn; - /* Is this the last reference to the connection structure (there * could be more if the socket was dup'ed). */ - if (conn->lc_crefs <= 1) - { - conn->lc_crefs = 0; - local_release(conn); - } - else - { - /* No.. Just decrement the reference count */ - - conn->lc_crefs--; - } + local_subref(psock->s_conn); return OK; }