]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/sys/aio_kern.h
xnu-1699.22.81.tar.gz
[apple/xnu.git] / bsd / sys / aio_kern.h
index 4b030a1039d6e6a5eaaa77029903cd3f04dc1a52..18a801f98c9b22e5826d895d0ca8696fddc6aa23 100644 (file)
 
 struct aio_workq_entry
 {
-       TAILQ_ENTRY( aio_workq_entry )  aio_workq_link;
-       struct proc                                             *procp;         /* user proc that queued this request */
-       user_addr_t                                             uaiocbp;        /* pointer passed in from user land */
-       user_addr_t                                             fsyncp;         /* not NULL means this request must complete */
-                                                                                               /* before an aio_fsync call can proceed. */
-       vm_map_t                                                aio_map;        /* user land map we have a reference to */
-       user_ssize_t                                    returnval;      /* return value from read / write request */    
-       int                                                             errorval;       /* error value from read / write request */
-       int                                                             flags;          
-       long                                                    group_tag;      /* identifier used to group IO requests */
-       struct user_aiocb                               aiocb;          /* copy of aiocb from user land */
+       TAILQ_ENTRY( aio_workq_entry )  aio_workq_link; /* Protected by queue lock */
+       TAILQ_ENTRY( aio_workq_entry )  aio_proc_link;  /* Proteced by proc's aio lock */
+
+       /* Proc lock */
+       void            *group_tag;     /* identifier used to group IO requests */
+
+       /* Initialized and never changed, safe to access */
+       struct proc     *procp;         /* user proc that queued this request */
+       user_addr_t     uaiocbp;        /* pointer passed in from user land */
+       struct user_aiocb       aiocb;  /* copy of aiocb from user land */
+       vm_map_t        aio_map;        /* user land map we have a reference to */
+
+       /* Entry lock */
+       int             aio_refcount;
+       user_ssize_t    returnval;      /* return value from read / write request */    
+       int             errorval;       /* error value from read / write request */
+       int             flags;          
 };
 typedef struct aio_workq_entry aio_workq_entry;
 
 /*
  * definitions for aio_workq_entry.flags
  */
-#define        AIO_READ                0x00000001      
-#define        AIO_WRITE               0x00000002
+#define        AIO_READ                0x00000001      /* a read */
+#define        AIO_WRITE               0x00000002      /* a write */
 #define        AIO_FSYNC               0x00000004      /* aio_fsync with op = O_SYNC */
 #define        AIO_DSYNC               0x00000008      /* aio_fsync with op = O_DSYNC (not supported yet) */
 #define        AIO_LIO                 0x00000010      /* lio_listio generated IO */
-#define        AIO_DO_FREE             0x00000800      /* entry needs to be freed */
-#define        AIO_COMPLETION  0x00001000      /* entry is in completion processing (not freeable yet) */
+#define        AIO_DO_FREE             0x00000800      /* entry should be freed when last reference is dropped. */
+                                               /*      set by aio_return() and _aio_exit() */
 #define        AIO_DISABLE             0x00002000      /* process is trying to exit or exec and we need */
-                                                                       /*      to disable normal completion notification */
-#define        AIO_WAITING             0x00004000      /* process is trying to exit, exec, or close and is */
-                                                                       /*      waiting for one or more active IO requests to */
-                                                                       /*      complete */
+                                               /*      to not try to send a signal from do_aio_completion() */
+#define        AIO_CLOSE_WAIT          0x00004000      /* process is trying to close and is */
+                                               /*      waiting for one or more active IO requests to */
+                                               /*      complete */
+#define AIO_EXIT_WAIT          0x00008000      /* process is trying to exit or exec and is */
+                                               /*      waiting for one or more active IO requests to */
+                                               /*      complete */
+
+#define AIO_LIO_NOTIFY         0x00010000      /* wait for list complete */
 
 /*
  * Prototypes
@@ -89,7 +100,7 @@ __private_extern__ void
 _aio_create_worker_threads(int num);
 
 __private_extern__ void                
-aio_init(void);
+aio_init(void) __attribute__((section("__TEXT, initcode")));
 
 task_t                                         
 get_aiotask(void);