You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/06/11 10:00:28 UTC
[incubator-nuttx] 01/02: net/sock: move the psock calloc out of
sockfd_allocate
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 0d8e5b66fde3022a96479904734f01b1a32df7dd
Author: chao.an <an...@xiaomi.com>
AuthorDate: Fri Jun 11 12:16:24 2021 +0800
net/sock: move the psock calloc out of sockfd_allocate
Signed-off-by: chao.an <an...@xiaomi.com>
---
fs/socket/socket.c | 46 ++++++++++++++++++++++++----------------------
include/nuttx/net/net.h | 4 ++--
net/socket/accept.c | 17 ++++++++++++++---
3 files changed, 40 insertions(+), 27 deletions(-)
diff --git a/fs/socket/socket.c b/fs/socket/socket.c
index ad923ca..69718cb 100644
--- a/fs/socket/socket.c
+++ b/fs/socket/socket.c
@@ -150,7 +150,7 @@ static int sock_file_poll(FAR struct file *filep, FAR struct pollfd *fds,
* Allocate a socket descriptor
*
* Input Parameters:
- * psock A double pointer to socket structure to be allocated.
+ * psock A pointer to socket structure.
* oflags Open mode flags.
*
* Returned Value:
@@ -159,24 +159,16 @@ static int sock_file_poll(FAR struct file *filep, FAR struct pollfd *fds,
*
****************************************************************************/
-int sockfd_allocate(FAR struct socket **psock, int oflags)
+int sockfd_allocate(FAR struct socket *psock, int oflags)
{
int sockfd;
- *psock = kmm_zalloc(sizeof(**psock));
- if (*psock == NULL)
+ sockfd = files_allocate(&g_sock_inode, oflags, 0, psock, 0);
+ if (sockfd >= 0)
{
- return -ENOMEM;
- }
-
- sockfd = files_allocate(&g_sock_inode, oflags, 0, *psock, 0);
- if (sockfd < 0)
- {
- kmm_free(*psock);
+ inode_addref(&g_sock_inode);
}
- inode_addref(&g_sock_inode);
-
return sockfd;
}
@@ -261,13 +253,10 @@ int socket(int domain, int type, int protocol)
oflags |= O_CLOEXEC;
}
- /* Allocate a socket descriptor */
-
- sockfd = sockfd_allocate(&psock, oflags);
- if (sockfd < 0)
+ psock = kmm_zalloc(sizeof(*psock));
+ if (psock == NULL)
{
- nerr("ERROR: Failed to allocate a socket descriptor\n");
- ret = sockfd;
+ ret = -ENOMEM;
goto errout;
}
@@ -277,13 +266,26 @@ int socket(int domain, int type, int protocol)
if (ret < 0)
{
nerr("ERROR: psock_socket() failed: %d\n", ret);
- goto errout_with_sockfd;
+ goto errout_with_alloc;
+ }
+
+ /* Allocate a socket descriptor */
+
+ sockfd = sockfd_allocate(psock, oflags);
+ if (sockfd < 0)
+ {
+ nerr("ERROR: Failed to allocate a socket descriptor\n");
+ ret = sockfd;
+ goto errout_with_psock;
}
return sockfd;
-errout_with_sockfd:
- nx_close(sockfd);
+errout_with_psock:
+ psock_close(psock);
+
+errout_with_alloc:
+ kmm_free(psock);
errout:
set_errno(-ret);
diff --git a/include/nuttx/net/net.h b/include/nuttx/net/net.h
index 21c50df..cf7ba01 100644
--- a/include/nuttx/net/net.h
+++ b/include/nuttx/net/net.h
@@ -496,7 +496,7 @@ FAR struct iob_s *net_ioballoc(bool throttled, enum iob_user_e consumerid);
* Allocate a socket descriptor
*
* Input Parameters:
- * psock A double pointer to socket structure to be allocated.
+ * psock A pointer to socket structure.
* oflags Open mode flags.
*
* Returned Value:
@@ -505,7 +505,7 @@ FAR struct iob_s *net_ioballoc(bool throttled, enum iob_user_e consumerid);
*
****************************************************************************/
-int sockfd_allocate(FAR struct socket **psock, int oflags);
+int sockfd_allocate(FAR struct socket *psock, int oflags);
/****************************************************************************
* Name: sockfd_socket
diff --git a/net/socket/accept.c b/net/socket/accept.c
index 772a273..08107d9 100644
--- a/net/socket/accept.c
+++ b/net/socket/accept.c
@@ -35,6 +35,7 @@
#include <nuttx/cancelpt.h>
#include <nuttx/fs/fs.h>
+#include <nuttx/kmalloc.h>
#include <arch/irq.h>
#include "socket/socket.h"
@@ -230,8 +231,8 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen)
FAR struct socket *psock = sockfd_socket(sockfd);
FAR struct socket *newsock;
FAR struct file *filep;
- int newfd;
int errcode;
+ int newfd;
int ret;
/* accept() is a cancellation point */
@@ -259,15 +260,22 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen)
goto errout;
}
+ newsock = kmm_zalloc(sizeof(*newsock));
+ if (newsock == NULL)
+ {
+ errcode = ENOMEM;
+ goto errout;
+ }
+
/* Allocate a socket descriptor for the new connection now (so that it
* cannot fail later)
*/
- newfd = sockfd_allocate(&newsock, O_RDWR);
+ newfd = sockfd_allocate(newsock, O_RDWR);
if (newfd < 0)
{
errcode = ENFILE;
- goto errout;
+ goto errout_with_alloc;
}
ret = psock_accept(psock, addr, addrlen, newsock);
@@ -283,6 +291,9 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen)
errout_with_socket:
nx_close(newfd);
+errout_with_alloc:
+ kmm_free(newsock);
+
errout:
leave_cancellation_point();