提交 b0ccfa31 编写于 作者: Comeon_fly's avatar Comeon_fly

fix at_socket.c

上级 42248d81
...@@ -54,7 +54,6 @@ static rt_slist_t _socket_list = RT_SLIST_OBJECT_INIT(_socket_list); ...@@ -54,7 +54,6 @@ static rt_slist_t _socket_list = RT_SLIST_OBJECT_INIT(_socket_list);
struct at_socket *at_get_socket(int socket) struct at_socket *at_get_socket(int socket)
{ {
rt_base_t level; rt_base_t level;
size_t list_num = 0;
rt_slist_t *node = RT_NULL; rt_slist_t *node = RT_NULL;
struct at_socket *at_sock = RT_NULL; struct at_socket *at_sock = RT_NULL;
...@@ -62,9 +61,9 @@ struct at_socket *at_get_socket(int socket) ...@@ -62,9 +61,9 @@ struct at_socket *at_get_socket(int socket)
rt_slist_for_each(node, &_socket_list) rt_slist_for_each(node, &_socket_list)
{ {
if (socket == (list_num++)) at_sock = rt_slist_entry(node, struct at_socket, list);
if (socket == at_sock->socket)
{ {
at_sock = rt_slist_entry(node, struct at_socket, list);
if (at_sock && at_sock->magic == AT_SOCKET_MAGIC) if (at_sock && at_sock->magic == AT_SOCKET_MAGIC)
{ {
rt_hw_interrupt_enable(level); rt_hw_interrupt_enable(level);
...@@ -275,6 +274,34 @@ static void at_do_event_clean(struct at_socket *sock, at_event_t event) ...@@ -275,6 +274,34 @@ static void at_do_event_clean(struct at_socket *sock, at_event_t event)
} }
} }
static int alloc_empty_socket(rt_slist_t *l)
{
rt_base_t level;
rt_slist_t *node = RT_NULL;
rt_slist_t *pre_node = &_socket_list;
struct at_socket *at_sock = RT_NULL;
int idx = 0;
level = rt_hw_interrupt_disable();
rt_slist_init(l);
rt_slist_for_each(node, &_socket_list)
{
at_sock = rt_slist_entry(node, struct at_socket, list);
if(at_sock->socket != idx)
break;
idx++;
pre_node = node;
}
rt_slist_insert(pre_node, l);
rt_hw_interrupt_enable(level);
return idx;
}
static struct at_socket *alloc_socket_by_device(struct at_device *device) static struct at_socket *alloc_socket_by_device(struct at_device *device)
{ {
static rt_mutex_t at_slock = RT_NULL; static rt_mutex_t at_slock = RT_NULL;
...@@ -304,21 +331,9 @@ static struct at_socket *alloc_socket_by_device(struct at_device *device) ...@@ -304,21 +331,9 @@ static struct at_socket *alloc_socket_by_device(struct at_device *device)
goto __err; goto __err;
} }
/* add device socket to global socket list */
{
rt_base_t level;
level = rt_hw_interrupt_disable();
rt_slist_init(&(device->sockets[idx].list));
rt_slist_append(&_socket_list, &(device->sockets[idx].list));
rt_hw_interrupt_enable(level);
}
sock = &(device->sockets[idx]); sock = &(device->sockets[idx]);
/* the socket descriptor is the number of sockte lists */ /* the socket descriptor is the number of sockte lists */
sock->socket = rt_slist_len(&_socket_list) - 1; sock->socket = alloc_empty_socket(&(sock->list));
/* the socket operations is the specify operations of the device */ /* the socket operations is the specify operations of the device */
sock->ops = device->class->socket_ops; sock->ops = device->class->socket_ops;
/* the user-data is the at device socket descriptor */ /* the user-data is the at device socket descriptor */
...@@ -446,7 +461,6 @@ static int free_socket(struct at_socket *sock) ...@@ -446,7 +461,6 @@ static int free_socket(struct at_socket *sock)
/* delect socket from socket list */ /* delect socket from socket list */
{ {
rt_base_t level; rt_base_t level;
int list_num = 0;
rt_slist_t *node = RT_NULL; rt_slist_t *node = RT_NULL;
struct at_socket *at_sock = RT_NULL; struct at_socket *at_sock = RT_NULL;
...@@ -454,10 +468,10 @@ static int free_socket(struct at_socket *sock) ...@@ -454,10 +468,10 @@ static int free_socket(struct at_socket *sock)
rt_slist_for_each(node, &_socket_list) rt_slist_for_each(node, &_socket_list)
{ {
if (sock->socket == (list_num++)) at_sock = rt_slist_entry(node, struct at_socket, list);
if (sock->socket == at_sock->socket)
{ {
at_sock = rt_slist_entry(node, struct at_socket, list); if (at_sock && at_sock->magic == AT_SOCKET_MAGIC)
if (at_sock)
{ {
rt_slist_remove(&_socket_list, &at_sock->list); rt_slist_remove(&_socket_list, &at_sock->list);
break; break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册