bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 14/18] Fix initialization from incompatible pointer type


From: Marin Ramesa
Subject: [PATCH 14/18] Fix initialization from incompatible pointer type
Date: Fri, 6 Dec 2013 16:29:56 +0100

Fix initialization from incompatible pointer type in the initialization
of the field dev_name_list in i386/i386at/conf.c.

This patch has one questionable addition, that is the cast from io_req_t
to a pointer to uio struct in the function kdread().

* device/conf.h: Include sys/types.h.
Include mach/port.h.
Include mach/vm_prot.h.
Use forward structure declaration for io_req_t to avoid inclusion loop.
(dev_ops): Modify so that correct return and argument types are listed. 
(nulldev_open, nulldev_close, nulldev_read, nulldev_getstat, nulldev_setstat, 
nulldev_portdeath): Add prototypes.
(nomap): Modify argument and return types.
* device/dev_name.c (nulldev_open, nulldev_close, nulldev_read, 
nulldev_getstat, nulldev_setstat, nulldev_portdeath): New functions.
(nomap): Modify argument and return types.  
* device/ds_routines.c (*device->dev_ops->d_close): New parameter to the call.  
* device/kmsg.c (kmsgclose): Modify argument and return types and drop the 
D_SUCCESS return value.
* device/kmsg.h (kmsgclose): Modify argument and return types. 
* i386/i386at/com.c (comopen, comclose, comread): Modify argument and return 
types and drop the zero return value.
* i386/i386at/com.h (comopen, comclose, comread): Modify argument and return 
types. 
* i386/i386at/conf.c (dev_name_list): Modify field initialization.
* i386/i386at/kd.c (kdread, kdmmap): Modify argument and return types and cast 
from io_req_t to a pointer to uio struct.
* i386/i386at/kd.h (kdread, kdmmap): Modify argument and return types.
* i386/i386at/kd_event.c (kbdopen, kbdclose): Modify argument and return types.
* i386/i386at/kd_event.h (kbdopen, kbdclose): Likewise.
* i386/i386at/kd_mouse.c (mouseopen, mouseclose): Modify argument types.
* i386/i386at/kd_mouse.h (mouseopen, mouseclose): Likewise.
* i386/i386at/lpr.c (lpropen, lprread): Likewise.
* i386/i386at/lpr.h (lpropen, lprread): Likewise.
* i386/i386at/mem.c (memmmap): Likewise.
* i386/i386at/mem.h (memmmap): Likewise.
* i386/i386at/model_dep.c (timemmap): Likewise.
* i386/i386at/model_dep.h (timemmap): Likewise.
* kern/mach_clock.c (timeopen, timeclose): Modify argument and return types and 
drop the zero return value. 
* kern/mach_clock.h: Include sys/types.h.
Use forward structure declaration for io_req_t to avoid inclusion loop.
(timeopen, timeclose): Modify argument and return types.

---
 device/conf.h           | 34 ++++++++++++++++++++++++----------
 device/dev_name.c       | 37 ++++++++++++++++++++++++++++++++++---
 device/ds_routines.c    |  2 +-
 device/kmsg.c           |  6 +++---
 device/kmsg.h           |  2 +-
 i386/i386at/com.c       | 12 ++++++------
 i386/i386at/com.h       |  6 +++---
 i386/i386at/conf.c      | 28 ++++++++++++++--------------
 i386/i386at/kd.c        |  8 ++++----
 i386/i386at/kd.h        |  4 ++--
 i386/i386at/kd_event.c  |  5 +++--
 i386/i386at/kd_event.h  |  4 ++--
 i386/i386at/kd_mouse.c  |  5 +++--
 i386/i386at/kd_mouse.h  |  4 ++--
 i386/i386at/lpr.c       |  4 ++--
 i386/i386at/lpr.h       |  4 ++--
 i386/i386at/mem.c       |  4 ++--
 i386/i386at/mem.h       |  2 +-
 i386/i386at/model_dep.c |  4 ++--
 i386/i386at/model_dep.h |  2 +-
 kern/mach_clock.c       |  6 +++---
 kern/mach_clock.h       |  7 +++++--
 22 files changed, 120 insertions(+), 70 deletions(-)

diff --git a/device/conf.h b/device/conf.h
index e91e099..921e53b 100644
--- a/device/conf.h
+++ b/device/conf.h
@@ -32,22 +32,30 @@
 #define        _DEVICE_CONF_H_
 
 #include <mach/machine/vm_types.h>
+#include <sys/types.h>
+#include <mach/port.h>
+#include <mach/vm_prot.h>
+
+struct io_req;
+typedef struct io_req *io_req_t;
+
+typedef int io_return_t;
 
 /*
  * Operations list for major device types.
  */
 struct dev_ops {
-       char *          d_name;         /* name for major device */
-       int             (*d_open)();    /* open device */
-       int             (*d_close)();   /* close device */
-       int             (*d_read)();    /* read */
+       char *          d_name;                                 /* name for 
major device */
+       int             (*d_open)(dev_t, int, io_req_t);        /* open device 
*/
+       void            (*d_close)(int, int);                   /* close device 
*/
+       int             (*d_read)(dev_t, io_req_t);             /* read */
        int             (*d_write)();   /* write */
-       int             (*d_getstat)(); /* get status/control */
-       int             (*d_setstat)(); /* set status/control */
-       vm_offset_t     (*d_mmap)();    /* map memory */
+       io_return_t     (*d_getstat)(dev_t, int, int *, natural_t *);   /* get 
status/control */
+       io_return_t     (*d_setstat)(dev_t, int, int *, natural_t);     /* set 
status/control */
+       int             (*d_mmap)(dev_t, off_t, vm_prot_t);             /* map 
memory */
        int             (*d_async_in)();/* asynchronous input setup */
        int             (*d_reset)();   /* reset device */
-       int             (*d_port_death)();
+       int             (*d_port_death)(dev_t, mach_port_t);
                                        /* clean up reply ports */
        int             d_subdev;       /* number of sub-devices per
                                           unit */
@@ -58,9 +66,15 @@ typedef struct dev_ops *dev_ops_t;
 /*
  * Routines for null entries.
  */
-extern int     nulldev();              /* no operation - OK */
+extern int     nulldev(void);                                                  
/* no operation - OK */
+extern int     nulldev_open(dev_t dev, int flag, io_req_t ior);                
/* no operation - OK */
+extern void    nulldev_close(int dev, int flag);                               
/* no operation - OK */
+extern int     nulldev_read(dev_t dev, io_req_t ior);                          
/* no operation - OK */
+extern io_return_t nulldev_getstat(dev_t dev, int flavor, int *data, natural_t 
*count); /* no operation - OK */
+extern io_return_t nulldev_setstat(dev_t dev, int flavor, int *data, natural_t 
count);  /* no operation - OK */
+extern int nulldev_portdeath(dev_t dev, mach_port_t port);                     
        /* no operation - OK */
 extern int     nodev();                /* no operation - error */
-extern vm_offset_t nomap();            /* no operation - error */
+extern int nomap(dev_t dev, off_t off, int prot);              /* no operation 
- error */
 
 /*
  * Flavor constants for d_dev_info routine
diff --git a/device/dev_name.c b/device/dev_name.c
index de9e360..3f37533 100644
--- a/device/dev_name.c
+++ b/device/dev_name.c
@@ -39,7 +39,38 @@
 /*
  * Routines placed in empty entries in the device tables
  */
-int nulldev()
+int nulldev(void)
+{
+       return (D_SUCCESS);
+}
+
+int nulldev_open(dev_t dev, int flag, io_req_t ior)
+{
+       return (D_SUCCESS);
+}
+
+void nulldev_close(int dev, int flag)
+{
+       return;
+}
+
+int nulldev_read(dev_t dev, io_req_t ior)
+{
+       return (D_SUCCESS);
+}
+
+
+io_return_t nulldev_getstat(dev_t dev, int flavor, int *data, natural_t *count)
+{
+       return (D_SUCCESS);
+}
+
+io_return_t nulldev_setstat(dev_t dev, int flavor, int *data, natural_t count)
+{
+       return (D_SUCCESS);
+}
+
+int nulldev_portdeath(dev_t dev, mach_port_t port)
 {
        return (D_SUCCESS);
 }
@@ -49,8 +80,8 @@ int nodev()
        return (D_INVALID_OPERATION);
 }
 
-vm_offset_t
-nomap()
+int
+nomap(dev_t dev, off_t off, int prot)
 {
        return (D_INVALID_OPERATION);
 }
diff --git a/device/ds_routines.c b/device/ds_routines.c
index ee575e5..cc24add 100644
--- a/device/ds_routines.c
+++ b/device/ds_routines.c
@@ -639,7 +639,7 @@ device_close(device)
        /*
         * Close the device
         */
-       (*device->dev_ops->d_close)(device->dev_number);
+       (*device->dev_ops->d_close)(device->dev_number, 0);
 
        /*
         * Finally mark it closed.  If someone else is trying
diff --git a/device/kmsg.c b/device/kmsg.c
index c8bd897..586db24 100644
--- a/device/kmsg.c
+++ b/device/kmsg.c
@@ -77,14 +77,14 @@ kmsgopen (dev_t dev, int flag, io_req_t ior)
 }
 
 /* Kernel Message Close Handler */
-io_return_t
-kmsgclose (dev_t dev, int flag)
+void
+kmsgclose (int dev, int flag)
 {
   simple_lock (&kmsg_lock);
   kmsg_in_use = 0;
   
   simple_unlock (&kmsg_lock);
-  return D_SUCCESS;
+  return;
 }
 
 static boolean_t kmsg_read_done (io_req_t ior);
diff --git a/device/kmsg.h b/device/kmsg.h
index b8c1f36..8d8526b 100644
--- a/device/kmsg.h
+++ b/device/kmsg.h
@@ -8,7 +8,7 @@
 #include <device/io_req.h>
 
 io_return_t kmsgopen (dev_t dev, int flag, io_req_t ior);
-io_return_t kmsgclose (dev_t dev, int flag);
+void kmsgclose (int dev, int flag);
 io_return_t kmsgread (dev_t dev, io_req_t ior);
 io_return_t kmsggetstat (dev_t dev, int flavor,
                         int *data, unsigned int *count);
diff --git a/i386/i386at/com.c b/i386/i386at/com.c
index 7b184e3..2e4acb5 100644
--- a/i386/i386at/com.c
+++ b/i386/i386at/com.c
@@ -318,8 +318,8 @@ boolean_t com_reprobe(
        return FALSE;
 }
 
-io_return_t comopen(
-       int dev,
+int comopen(
+       dev_t dev,
        int flag,
        io_req_t ior)
 {
@@ -398,7 +398,7 @@ io_return_t comopen(
        return result;
 }
 
-io_return_t comclose(dev, flag)
+void comclose(dev, flag)
 int dev;
 int flag;
 {
@@ -414,11 +414,11 @@ int flag;
                if (comfifo[minor(dev)] != 0)
                        outb(INTR_ID(addr), 0x00); /* Disable fifos */
        }
-       return 0;
+       return;
 }
 
-io_return_t comread(dev, ior)
-int    dev;
+int comread(dev, ior)
+dev_t  dev;
 io_req_t ior;
 {
        return char_read(&com_tty[minor(dev)], ior);
diff --git a/i386/i386at/com.h b/i386/i386at/com.h
index ae9434d..3762c1f 100644
--- a/i386/i386at/com.h
+++ b/i386/i386at/com.h
@@ -71,9 +71,9 @@ comsetstat(
        int             *data,
        natural_t       count);
 
-extern io_return_t comopen(int dev, int flag, io_req_t ior);
-extern io_return_t comclose(int dev, int flag);
-extern io_return_t comread(int dev, io_req_t ior);
+extern int comopen(dev_t dev, int flag, io_req_t ior);
+extern void comclose(int dev, int flag);
+extern int comread(dev_t dev, io_req_t ior);
 extern io_return_t comwrite(int dev, io_req_t ior);
 extern io_return_t comportdeath(dev_t dev, mach_port_t port);
 
diff --git a/i386/i386at/conf.c b/i386/i386at/conf.c
index 4fcd81e..eea2d1f 100644
--- a/i386/i386at/conf.c
+++ b/i386/i386at/conf.c
@@ -81,9 +81,9 @@ struct dev_ops        dev_name_list[] =
        /* We don't assign a console here, when we find one via
           cninit() we stick something appropriate here through the
           indirect list */
-       { "cn",         nulldev,        nulldev,        nulldev,
-         nulldev,      nulldev,        nulldev,        nomap,
-         nodev,        nulldev,        nulldev,        0,
+       { "cn",         nulldev_open,   nulldev_close,  nulldev_read,
+         nulldev,      nulldev_getstat, nulldev_setstat, nomap,
+         nodev,        nulldev,        nulldev_portdeath, 0,
          nodev },
 
 #ifndef        MACH_HYP
@@ -93,9 +93,9 @@ struct dev_ops        dev_name_list[] =
          nodev },
 #endif /* MACH_HYP */
 
-       { timename,     timeopen,       timeclose,      nulldev,
-         nulldev,      nulldev,        nulldev,        timemmap,
-         nodev,        nulldev,        nulldev,        0,
+       { timename,     timeopen,       timeclose,      nulldev_read,
+         nulldev,      nulldev_getstat, nulldev_setstat, timemmap,
+         nodev,        nulldev,        nulldev_portdeath,      0,
          nodev },
 
 #ifndef        MACH_HYP
@@ -114,25 +114,25 @@ struct dev_ops    dev_name_list[] =
 #endif
 
        { mousename,    mouseopen,      mouseclose,     mouseread,
-         nodev,        mousegetstat,   nulldev,        nomap,
-         nodev,        nulldev,        nulldev,        0,
+         nodev,        mousegetstat,   nulldev_setstat, nomap,
+         nodev,        nulldev,        nulldev_portdeath, 0,
          nodev },
 
        { kbdname,      kbdopen,        kbdclose,       kbdread,
          nodev,        kbdgetstat,     kbdsetstat,     nomap,
-         nodev,        nulldev,        nulldev,        0,
+         nodev,        nulldev,        nulldev_portdeath, 0,
          nodev },
 
-       { memname,      nulldev,        nulldev,        nodev,
-         nodev,        nodev,          nodev,          memmmap,
-         nodev,        nulldev,        nulldev,        0,
+       { memname,      nulldev_open,   nulldev_close,  nulldev_read,
+         nodev,        nulldev_getstat, nulldev_setstat, memmmap,
+         nodev,        nulldev,        nulldev_portdeath, 0,
          nodev },
 #endif /* MACH_HYP */
 
 #ifdef MACH_KMSG
         { kmsgname,     kmsgopen,       kmsgclose,       kmsgread,
-          nodev,        kmsggetstat,    nodev,           nomap,
-          nodev,        nulldev,        nulldev,         0,
+          nodev,        kmsggetstat,    nulldev_setstat, nomap,
+          nodev,        nulldev,        nulldev_portdeath, 0,
           nodev },
 #endif
 
diff --git a/i386/i386at/kd.c b/i386/i386at/kd.c
index 5605257..b8b0e71 100644
--- a/i386/i386at/kd.c
+++ b/i386/i386at/kd.c
@@ -525,14 +525,14 @@ int       flag;
 /*ARGSUSED*/
 int
 kdread(dev, uio)
-int    dev;
-struct uio     *uio;
+dev_t  dev;
+io_req_t uio;
 {
        struct  tty     *tp;
 
        tp = &kd_tty;
        tp->t_state |= TS_CARR_ON;
-       return((*linesw[kd_tty.t_line].l_read)(tp, uio));
+       return((*linesw[kd_tty.t_line].l_read)(tp, (struct uio *)uio));
 }
 
 
@@ -565,7 +565,7 @@ int
 kdmmap(dev, off, prot)
        dev_t dev;
        off_t off;
-       int prot;
+       vm_prot_t prot;
 {
        if ((u_int) off >= (128*1024))
                return(-1);
diff --git a/i386/i386at/kd.h b/i386/i386at/kd.h
index d97fdd5..fa3e7d4 100644
--- a/i386/i386at/kd.h
+++ b/i386/i386at/kd.h
@@ -750,7 +750,7 @@ extern void kdb_kintr(void);
 
 extern int kdopen(dev_t dev, int flag, io_req_t ior);
 extern void kdclose(int dev, int flag);
-extern int kdread(int dev, struct uio *uio);
+extern int kdread(dev_t dev, io_req_t uio);
 extern int kdwrite(int dev, struct uio *uio);
 
 extern io_return_t kdgetstat(
@@ -766,7 +766,7 @@ extern io_return_t kdsetstat(
        natural_t       count);
 
 extern int kdportdeath(dev_t dev, mach_port_t port);
-extern int kdmmap(dev_t dev, off_t off, int prot);
+extern int kdmmap(dev_t dev, off_t off, vm_prot_t prot);
 
 boolean_t kdcheckmagic(Scancode scancode);
 
diff --git a/i386/i386at/kd_event.c b/i386/i386at/kd_event.c
index db14225..425afb1 100644
--- a/i386/i386at/kd_event.c
+++ b/i386/i386at/kd_event.c
@@ -110,9 +110,10 @@ kbdinit()
 
 /*ARGSUSED*/
 int
-kbdopen(dev, flags)
+kbdopen(dev, flags, ior)
        dev_t dev;
        int flags;
+       io_req_t ior;
 {
        spl_t o_pri = spltty();
        kdinit();
@@ -131,7 +132,7 @@ kbdopen(dev, flags)
 /*ARGSUSED*/
 void
 kbdclose(dev, flags)
-       dev_t dev;
+       int dev;
        int flags;
 {
        spl_t s = SPLKD();
diff --git a/i386/i386at/kd_event.h b/i386/i386at/kd_event.h
index f1295cb..5298567 100644
--- a/i386/i386at/kd_event.h
+++ b/i386/i386at/kd_event.h
@@ -30,8 +30,8 @@ extern void X_kdb_enter (void);
 
 extern void X_kdb_exit (void);
 
-extern int kbdopen(dev_t dev, int flags);
-extern void kbdclose(dev_t dev, int flags);
+extern int kbdopen(dev_t dev, int flags, io_req_t ior);
+extern void kbdclose(int dev, int flags);
 extern int kbdread(dev_t dev, io_req_t ior);
 
 extern io_return_t kbdgetstat(
diff --git a/i386/i386at/kd_mouse.c b/i386/i386at/kd_mouse.c
index 5a80474..178c470 100644
--- a/i386/i386at/kd_mouse.c
+++ b/i386/i386at/kd_mouse.c
@@ -147,9 +147,10 @@ int track_man[10];
 
 /*ARGSUSED*/
 int
-mouseopen(dev, flags)
+mouseopen(dev, flags, ior)
        dev_t dev;
        int flags;
+       io_req_t ior;
 {
        if (mouse_in_use)
                return (D_ALREADY_OPEN);
@@ -238,7 +239,7 @@ kd_mouse_open(dev, mouse_pic)
  */
 void
 mouseclose(dev, flags)
-       dev_t dev;
+       int dev;
        int flags;
 {
        switch (mouse_type) {
diff --git a/i386/i386at/kd_mouse.h b/i386/i386at/kd_mouse.h
index ad07c6c..ec4fe7a 100644
--- a/i386/i386at/kd_mouse.h
+++ b/i386/i386at/kd_mouse.h
@@ -54,8 +54,8 @@ extern void mouse_packet_mouse_system_mouse (u_char 
*mousebuf);
 
 extern void mouse_packet_ibm_ps2_mouse (u_char *mousebuf);
 
-extern int mouseopen(dev_t dev, int flags);
-extern void mouseclose(dev_t dev, int flags);
+extern int mouseopen(dev_t dev, int flags, io_req_t ior);
+extern void mouseclose(int dev, int flags);
 extern int mouseread(dev_t dev, io_req_t ior);
 
 extern io_return_t mousegetstat(
diff --git a/i386/i386at/lpr.c b/i386/i386at/lpr.c
index 3942335..8e065c2 100644
--- a/i386/i386at/lpr.c
+++ b/i386/i386at/lpr.c
@@ -106,7 +106,7 @@ void lprattach(struct bus_device *dev)
 
 int
 lpropen(dev, flag, ior)
-int dev;
+dev_t dev;
 int flag;
 io_req_t ior;
 {
@@ -151,7 +151,7 @@ u_short             addr =  (u_short) 
lprinfo[unit]->address;
 
 int
 lprread(dev, ior)
-int    dev;
+dev_t  dev;
 io_req_t ior;
 {
        return char_read(&lpr_tty[minor(dev)], ior);
diff --git a/i386/i386at/lpr.h b/i386/i386at/lpr.h
index 820d0ab..0ca862a 100644
--- a/i386/i386at/lpr.h
+++ b/i386/i386at/lpr.h
@@ -57,9 +57,9 @@ lprsetstat(
 
 void lprpr_addr(unsigned short addr);
 
-extern int lpropen(int dev, int flag, io_req_t ior);
+extern int lpropen(dev_t dev, int flag, io_req_t ior);
 extern void lprclose(int dev, int flag);
-extern int lprread(int dev, io_req_t ior);
+extern int lprread(dev_t dev, io_req_t ior);
 extern int lprwrite(int        dev, io_req_t ior);
 extern int lprportdeath(dev_t dev, mach_port_t port);
 
diff --git a/i386/i386at/mem.c b/i386/i386at/mem.c
index 5e51676..64a5f0b 100644
--- a/i386/i386at/mem.c
+++ b/i386/i386at/mem.c
@@ -32,8 +32,8 @@
 /*ARGSUSED*/
 int
 memmmap(dev, off, prot)
-int            dev;
-vm_offset_t    off;
+dev_t          dev;
+off_t          off;
 vm_prot_t      prot;
 {
        if (off == 0)
diff --git a/i386/i386at/mem.h b/i386/i386at/mem.h
index 3d6a96c..5444cc5 100644
--- a/i386/i386at/mem.h
+++ b/i386/i386at/mem.h
@@ -19,6 +19,6 @@
 #ifndef _MEM_H_
 #define _MEM_H_
 
-extern int memmmap(int dev, vm_offset_t off, vm_prot_t prot);
+extern int memmmap(dev_t dev, off_t off, vm_prot_t prot);
 
 #endif /* _MEM_H_ */
diff --git a/i386/i386at/model_dep.c b/i386/i386at/model_dep.c
index 1f1785e..93b0127 100644
--- a/i386/i386at/model_dep.c
+++ b/i386/i386at/model_dep.c
@@ -616,8 +616,8 @@ void c_boot_entry(vm_offset_t bi)
 
 int
 timemmap(dev, off, prot)
-       int dev;
-       int off;
+       dev_t dev;
+       off_t off;
        vm_prot_t prot;
 {
        extern time_value_t *mtime;
diff --git a/i386/i386at/model_dep.h b/i386/i386at/model_dep.h
index 7357314..2d2d342 100644
--- a/i386/i386at/model_dep.h
+++ b/i386/i386at/model_dep.h
@@ -21,7 +21,7 @@
 
 #include <mach/vm_prot.h>
 
-extern int timemmap(int dev, int off, vm_prot_t prot);
+extern int timemmap(dev_t dev, off_t off, vm_prot_t prot);
 
 /*
  * Halt a cpu.
diff --git a/kern/mach_clock.c b/kern/mach_clock.c
index 29a14c9..8190cea 100644
--- a/kern/mach_clock.c
+++ b/kern/mach_clock.c
@@ -499,13 +499,13 @@ void mapable_time_init()
        update_mapped_time(&time);
 }
 
-int timeopen()
+int timeopen(dev_t dev, int flag, io_req_t ior)
 {
        return(0);
 }
-int timeclose()
+void timeclose(int dev, int flag)
 {
-       return(0);
+       return;
 }
 
 /*
diff --git a/kern/mach_clock.h b/kern/mach_clock.h
index 72189af..f3698c1 100644
--- a/kern/mach_clock.h
+++ b/kern/mach_clock.h
@@ -29,7 +29,10 @@
 #include <mach/time_value.h>
 #include <kern/host.h>
 #include <kern/queue.h>
+#include <sys/types.h>
 
+struct io_req;
+typedef struct io_req *io_req_t;
 
 /* Timers in kernel.  */
 extern unsigned long   elapsed_ticks;  /* number of ticks elapsed since bootup 
*/
@@ -104,7 +107,7 @@ extern void mapable_time_init (void);
 extern void timeout(timer_func_t *fcn, void *param, int interval);
 extern boolean_t untimeout(timer_func_t *fcn, void *param);
 
-extern int timeopen(void);
-extern int timeclose(void);
+extern int timeopen(dev_t dev, int flag, io_req_t ior);
+extern void timeclose(int dev, int flag);
 
 #endif /* _KERN_MACH_CLOCK_H_ */
-- 
1.8.1.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]