xnu-1699.22.81.tar.gz
[apple/xnu.git] / bsd / sys / aio_kern.h
index a89f9c92dbc0992a6b94f9d2040758ce06020264..18a801f98c9b22e5826d895d0ca8696fddc6aa23 100644 (file)
@@ -1,14 +1,19 @@
 /*
  * Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
+ * 
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
  * 
  * The Original Code and all software distributed under the License are
  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
@@ -18,7 +23,7 @@
  * Please see the License for the specific language governing rights and
  * limitations under the License.
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /* 
  *     File:   sys/aio_kern.h
 
 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
@@ -84,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);