]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/sys/aio_kern.h
xnu-1504.9.26.tar.gz
[apple/xnu.git] / bsd / sys / aio_kern.h
index 09401f0b3d7b9e2f01ed8e224dc6741864b41e12..18a801f98c9b22e5826d895d0ca8696fddc6aa23 100644 (file)
@@ -1,23 +1,29 @@
 /*
  * Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * 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. 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.
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * 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
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * 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
@@ -83,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);