Просмотр исходного кода

!75 修正wget不能正常下载的问题
Merge pull request !75 from jesven/fix_free_lwp

bernard 5 лет назад
Родитель
Сommit
15d267d360
2 измененных файлов с 59 добавлено и 58 удалено
  1. 58 58
      components/lwp/lwp_pid.c
  2. 1 0
      components/lwp/lwp_syscall.c

+ 58 - 58
components/lwp/lwp_pid.c

@@ -119,6 +119,63 @@ out:
     return lwp;
 }
 
+static void lwp_user_obj_free(struct rt_lwp *lwp)
+{
+    rt_base_t level = 0;
+    struct rt_list_node *list = RT_NULL, *node = RT_NULL;
+    struct rt_object *object = RT_NULL;
+
+    list = &(lwp->object_list), node = list->next;
+
+    level = rt_hw_interrupt_disable();
+    while (list != node)
+    {
+        object = rt_list_entry(node, struct rt_object, lwp_obj_list);
+        node = node->next;
+
+        /* remove from kernel object list */
+        switch (object->type)
+        {
+        case RT_Object_Class_Thread:
+        {
+            rt_thread_t tid = (rt_thread_t)object;
+            if (tid->stat != RT_THREAD_CLOSE)
+            {
+                rt_thread_delete(tid);
+            }
+            break;
+        }
+        case RT_Object_Class_Semaphore:
+            rt_sem_delete((rt_sem_t)object);
+            break;
+        case RT_Object_Class_Mutex:
+            rt_mutex_delete((rt_mutex_t)object);
+            break;
+        case RT_Object_Class_Event:
+            rt_event_delete((rt_event_t)object);
+            break;
+        case RT_Object_Class_MailBox:
+            rt_mb_delete((rt_mailbox_t)object);
+            break;
+        case RT_Object_Class_MessageQueue:
+            rt_mq_delete((rt_mq_t)object);
+            break;
+        case RT_Object_Class_Device:
+            rt_device_close((rt_device_t)object);
+            break;
+        case RT_Object_Class_Timer:
+            rt_timer_delete((rt_timer_t)object);
+            break;
+        case RT_Object_Class_Channel:
+            break;
+        default:
+            LOG_E("input object type(%d) error", object->type);
+            break;
+        }
+    }
+    rt_hw_interrupt_enable(level);
+}
+
 void lwp_free(struct rt_lwp* lwp)
 {
     rt_base_t level;
@@ -142,6 +199,7 @@ void lwp_free(struct rt_lwp* lwp)
     {
         /* auto clean fds */
         __exit_files(lwp);
+        lwp_user_obj_free(lwp);
         rt_free(lwp->fdt.fds);
         lwp->fdt.fds = RT_NULL;
     }
@@ -224,63 +282,6 @@ void lwp_free(struct rt_lwp* lwp)
     rt_hw_interrupt_enable(level);
 }
 
-void lwp_user_obj_free(struct rt_lwp *lwp)
-{
-    rt_base_t level;
-    struct rt_list_node *list = RT_NULL, *node = RT_NULL;
-    struct rt_object *object = RT_NULL;
-
-    list = &(lwp->object_list), node = list->next;
-
-    level = rt_hw_interrupt_disable();
-    for ( ;list != node; )
-    {
-        object = rt_list_entry(node, struct rt_object, lwp_obj_list);
-        node = node->next;
-
-        /* remove from kernel object list */
-        switch (object->type)
-        {
-        case RT_Object_Class_Thread:
-        {
-            rt_thread_t tid = (rt_thread_t)object;
-            if (tid->stat != RT_THREAD_CLOSE)
-            {
-                rt_thread_delete(tid);
-            }
-            break;
-        }
-        case RT_Object_Class_Semaphore:
-            rt_sem_delete((rt_sem_t)object);
-            break;
-        case RT_Object_Class_Mutex:
-            rt_mutex_delete((rt_mutex_t)object);
-            break;
-        case RT_Object_Class_Event:
-            rt_event_delete((rt_event_t)object);
-            break;
-        case RT_Object_Class_MailBox:
-            rt_mb_delete((rt_mailbox_t)object);
-            break;
-        case RT_Object_Class_MessageQueue:
-            rt_mq_delete((rt_mq_t)object);
-            break;
-        case RT_Object_Class_Device:
-            rt_device_close((rt_device_t)object);
-            break;
-        case RT_Object_Class_Timer:
-            rt_timer_delete((rt_timer_t)object);
-            break;
-        case RT_Object_Class_Channel:
-            break;
-        default:
-            LOG_E("input object type(%d) error", object->type);
-            break;
-        }
-    }
-    rt_hw_interrupt_enable(level);
-}
-
 void lwp_ref_inc(struct rt_lwp *lwp)
 {
     rt_base_t level;
@@ -311,7 +312,6 @@ void lwp_ref_dec(struct rt_lwp *lwp)
                 rt_raw_channel_send(gdb_get_server_channel(), &msg);
             }
 #endif
-            lwp_user_obj_free(lwp);
             lwp_free(lwp);
         }
     }

+ 1 - 0
components/lwp/lwp_syscall.c

@@ -1276,6 +1276,7 @@ int sys_getaddrinfo(const char *nodename, const char *servname, const struct mus
         /* set up addrinfo */
         res->ai_family = k_res->ai_family;
         res->ai_flags  = k_res->ai_flags;
+        res->ai_next = NULL;
 
         if (hints != NULL)
         {