Przeglądaj źródła

dfs v2 修改 fd_new 的 startfd 起始值为 0 ;修复 futex_wait 超时时间换算异常; (#7705)

Signed-off-by: yangfasheng <yangfasheng@live.com>
yangfasheng 1 rok temu
rodzic
commit
b4e59bac4e

+ 1 - 1
components/dfs/dfs_v2/src/dfs.c

@@ -197,7 +197,7 @@ int fdt_fd_new(struct dfs_fdtable *fdt)
     dfs_file_lock();
     dfs_file_lock();
 
 
     /* find an empty fd entry */
     /* find an empty fd entry */
-    idx = fd_alloc(fdt, DFS_STDIO_OFFSET);
+    idx = fd_alloc(fdt, 0);
     /* can't find an empty fd entry */
     /* can't find an empty fd entry */
     if (idx < 0)
     if (idx < 0)
     {
     {

+ 25 - 6
components/libc/posix/io/stdio/libc.c

@@ -30,15 +30,34 @@ int libc_system_init(void)
     dev_console = rt_console_get_device();
     dev_console = rt_console_get_device();
     if (dev_console)
     if (dev_console)
     {
     {
-        int fd = libc_stdio_set_console(dev_console->parent.name, O_RDWR);
-        if (fd < 0)
+        int fd, ret;
+        char name[STDIO_DEVICE_NAME_MAX];
+
+        rt_snprintf(name, sizeof(name) - 1, "/dev/%s", dev_console->parent.name);
+        name[STDIO_DEVICE_NAME_MAX - 1] = '\0';
+
+        fd = open(name, O_RDWR);
+        if (fd >= 0)
+        {
+            /* set fd (0, 1, 2) */
+            ret = sys_dup2(fd, 0);
+            if (ret != fd)
+            {
+                close(fd);
+            }
+            sys_dup2(ret, 1);
+            sys_dup2(ret, 2);
+
+            ret = libc_stdio_set_console(dev_console->parent.name, O_RDWR);
+            if (ret < 0)
+            {
+                return -1;
+            }
+        }
+        else
         {
         {
             return -1;
             return -1;
         }
         }
-        /* set fd (0, 1, 2) */
-        sys_dup2(fd, 0);
-        sys_dup2(fd, 1);
-        sys_dup2(fd, 2);
     }
     }
 #endif /* RT_USING_POSIX_STDIO */
 #endif /* RT_USING_POSIX_STDIO */
     return 0;
     return 0;

+ 6 - 1
components/lwp/lwp_futex.c

@@ -124,7 +124,12 @@ int futex_wait(struct rt_futex *futex, int value, const struct timespec *timeout
         /* with timeout */
         /* with timeout */
         if (timeout)
         if (timeout)
         {
         {
-            rt_int32_t time = rt_timespec_to_tick(timeout);
+            rt_int32_t time = timeout->tv_sec * RT_TICK_PER_SECOND + timeout->tv_nsec * RT_TICK_PER_SECOND / NANOSECOND_PER_SECOND;
+
+            if (time < 0)
+            {
+                time = 0;
+            }
 
 
             /* start the timer of thread */
             /* start the timer of thread */
             rt_timer_control(&(thread->thread_timer),
             rt_timer_control(&(thread->thread_timer),