A
download aio.h
Language: C
LOC: 154
Project Info
linux kernel
Server: Kernel.org
Type: zip
...linux kernel\include\linux\
   8250_pci.h
   a.out.h
   ac97_codec.h
   acct.h
   acpi.h
   adb.h
   adfs_fs.h
   adfs_fs_i.h
   adfs_fs_sb.h
   aer.h
   affs_hardblocks.h
   agp_backend.h
   agpgart.h
   aio.h
   aio_abi.h
   amifd.h
   amifdreg.h
   amigaffs.h
   apm_bios.h
   arcdevice.h
   arcfb.h
   ata.h
   atalk.h
   atm.h
   atm_eni.h
   atm_he.h
   atm_idt77105.h
   atm_nicstar.h
   atm_suni.h
   atm_tcp.h
   atm_zatm.h
   atmapi.h
   atmarp.h
   atmbr2684.h
   atmclip.h
   atmdev.h
   atmioc.h
   atmlec.h
   atmmpc.h
   atmppp.h
   atmsap.h
   atmsvc.h
   attribute_container.h
   audit.h
   auto_fs.h
   auto_fs4.h
   auxvec.h
   awe_voice.h
   ax25.h
   b1lli.h
   b1pcmcia.h
   backing-dev.h
   backlight.h
   baycom.h
   bcd.h
   bfs_fs.h
   binfmts.h
   bio.h
   bit_spinlock.h
   bitmap.h
   bitops.h
   blkdev.h
   blkpg.h
   blktrace_api.h
   blockgroup_lock.h
   bootmem.h
   bpqether.h
   buffer_head.h
   cache.h
   calc64.h
   capability.h
   capi.h
   carta_random32.h
   cciss_ioctl.h
   cd1400.h
   cdev.h
   cdk.h
   cdrom.h
   chio.h
   circ_buf.h
   clk.h
   clocksource.h
   cm4000_cs.h
   cn_proc.h
   cobalt-nvram.h
   coda.h
   coda_cache.h
   coda_fs_i.h
   coda_linux.h
   coda_proc.h
   coda_psdev.h
   coff.h
   com20020.h
   compat.h
   compat_ioctl.h
   compiler-gcc.h
   compiler-gcc3.h
   compiler-gcc4.h
   compiler-intel.h
   compiler.h
   completion.h
   comstats.h
   concap.h
   configfs.h
   connector.h
   console.h
   console_struct.h
   consolemap.h
   cpu.h
   cpufreq.h
   cpumask.h
   cpuset.h
   cramfs_fs.h
   cramfs_fs_sb.h
   crash_dump.h
   crc-ccitt.h
   crc16.h
   crc32.h
   crc32c.h
   crypto.h
   cryptohash.h
   ctype.h
   cuda.h
   cyclades.h
   cyclomx.h
   cycx_cfm.h
   cycx_drv.h
   cycx_x25.h
   dcache.h
   dccp.h
   dcookies.h
   debug_locks.h
   debugfs.h
   delay.h
   delayacct.h
   device-mapper.h
   device.h
   devpts_fs.h
   dio.h
   dirent.h
   divert.h
   dlm.h
   dlm_device.h
   dm-ioctl.h
   dm9000.h
   dma-mapping.h
   dmaengine.h
   dmapool.h
   dmi.h
   dn.h
   dnotify.h
   dqblk_v1.h
   dqblk_v2.h
   dqblk_xfs.h
   ds1286.h
   ds17287rtc.h
   ds1742rtc.h
   dtlk.h
   edd.h
   efi.h
   efs_dir.h
   efs_fs.h
   efs_fs_i.h
   efs_fs_sb.h
   efs_vh.h
   eisa.h
   elevator.h
   elf-em.h
   elf-fdpic.h
   elf.h
   elfcore.h
   elfnote.h
   err.h
   errno.h
   errqueue.h
   etherdevice.h
   ethtool.h
   eventpoll.h
   ext2_fs.h
   ext2_fs_sb.h
   ext3_fs.h
   ext3_fs_i.h
   ext3_fs_sb.h
   ext3_jbd.h
   ext4_fs.h
   ext4_fs_extents.h
   ext4_fs_i.h
   ext4_fs_sb.h
   ext4_jbd2.h
   fadvise.h
   fb.h
   fcdevice.h
   fcntl.h
   fd.h
   fd1772.h
   fddidevice.h
   fdreg.h
   fib_rules.h
   file.h
   filter.h
   firmware.h
   flat.h
   font.h
   fs.h
   fs_enet_pd.h
   fs_struct.h
   fs_uart_pd.h
   fsl_devices.h
   fsnotify.h
   ftape-header-segment.h
   ftape-vendors.h
   ftape.h
   fuse.h
   futex.h
   gameport.h
   gen_stats.h
   genalloc.h
   generic_acl.h
   generic_serial.h
   genetlink.h
   genhd.h
   getcpu.h
   gfp.h
   gfs2_ondisk.h
   gigaset_dev.h
   hardirq.h
   harrier_defs.h
   hash.h
   hayesesp.h
   hdlc.h
   hdlcdrv.h
   hdpu_features.h
   hdreg.h
   hdsmart.h
   hiddev.h
   highmem.h
   highuid.h
   hil.h
   hil_mlc.h
   hippidevice.h
   hp_sdc.h
   hpet.h
   hrtimer.h
   htirq.h
   hugetlb.h
   hw_random.h
   hwmon-sysfs.h
   hwmon-vid.h
   hwmon.h
   hysdn_if.h
   i2c-algo-bit.h
   i2c-algo-ite.h
   i2c-algo-pca.h
   i2c-algo-pcf.h
   i2c-algo-sgi.h
   i2c-dev.h
   i2c-id.h
   i2c-isa.h
   i2c-ocores.h
   i2c-pxa.h
   i2c.h
   i2o-dev.h
   i2o.h
   i8k.h
   ibmtr.h
   icmp.h
   icmpv6.h
   ide.h
   idr.h
   if.h
   if_addr.h
   if_arcnet.h
   if_arp.h
   if_bonding.h
   if_bridge.h
   if_cablemodem.h
   if_ec.h
   if_eql.h
   if_ether.h
   if_fc.h
   if_fddi.h
   if_frad.h
   if_hippi.h
   if_infiniband.h
   if_link.h
   if_ltalk.h
   if_packet.h
   if_plip.h
   if_ppp.h
   if_pppox.h
   if_shaper.h
   if_slip.h
   if_strip.h
   if_tr.h
   if_tun.h
   if_tunnel.h
   if_vlan.h
   if_wanpipe.h
   if_wanpipe_common.h
   igmp.h
   in.h
   in_route.h
   in6.h
   inet.h
   inet_diag.h
   inetdevice.h
   init.h
   init_task.h
   initrd.h
   inotify.h
   input.h
   interrupt.h
   io.h
   ioc3.h
   ioc4.h
   ioctl.h
   ioctl32.h
   ioport.h
   ioprio.h
   ip.h
   ip_mp_alg.h
   ip6_tunnel.h
   ipc.h
   ipmi.h
   ipmi_msgdefs.h
   ipmi_smi.h
   ipsec.h
   ipv6.h
   ipv6_route.h
   ipx.h
   irda.h
   irq.h
   irq_cpustat.h
   irqflags.h
   irqreturn.h
   isa.h
   isapnp.h
   isdn.h
   isdn_divertif.h
   isdn_ppp.h
   isdnif.h
   isicom.h
   iso_fs.h
   istallion.h
   ixjuser.h
   jbd.h
   jbd2.h
   jffs.h
   jffs2.h
   jhash.h
   jiffies.h
   journal-head.h
   joystick.h
   kallsyms.h
   kbd_diacr.h
   kbd_kern.h
   kd.h
   kdev_t.h
   kernel.h
   kernel_stat.h
   kernelcapi.h
   kexec.h
   key-ui.h
   key.h
   keyboard.h
   keyctl.h
   kfifo.h
   klist.h
   kmalloc_sizes.h
   kmod.h
   kobj_map.h
   kobject.h
   kprobes.h
   kref.h
   kthread.h
   ktime.h
   lapb.h
   latency.h
   lcd.h
   leds.h
   libata.h
   libps2.h
   license.h
   limits.h
   linkage.h
   linux_logo.h
   list.h
   llc.h
   lm_interface.h
   lock_dlm_plock.h
   lockdep.h
   loop.h
   lp.h
   m41t00.h
   m48t86.h
   magic.h
   major.h
   matroxfb.h
   mbcache.h
   mc146818rtc.h
   mc6821.h
   mca-legacy.h
   mca.h
   memory.h
   memory_hotplug.h
   mempolicy.h
   mempool.h
   meye.h
   migrate.h
   mii.h
   minix_fs.h
   miscdevice.h
   mm.h
   mm_inline.h
   mm_types.h
   mman.h
   mmtimer.h
   mmzone.h
   mod_devicetable.h
   module.h
   moduleloader.h
   moduleparam.h
   mount.h
   mpage.h
   mqueue.h
   mroute.h
   msdos_fs.h
   msg.h
   msi.h
   mtio.h
   mutex-debug.h
   mutex.h
   mv643xx.h
   n_r3964.h
   namei.h
   namespace.h
   nbd.h
   ncp.h
   ncp_fs.h
   ncp_fs_i.h
   ncp_fs_sb.h
   ncp_mount.h
   ncp_no.h
   neighbour.h
   net.h
   netdevice.h
   netfilter.h
   netfilter_arp.h
   netfilter_bridge.h
   netfilter_decnet.h
   netfilter_ipv4.h
   netfilter_ipv6.h
   netlink.h
   netpoll.h
   netrom.h
   nfs.h
   nfs_fs.h
   nfs_fs_i.h
   nfs_fs_sb.h
   nfs_idmap.h
   nfs_mount.h
   nfs_page.h
   nfs_xdr.h
   nfs2.h
   nfs3.h
   nfs4.h
   nfs4_acl.h
   nfs4_mount.h
   nfsacl.h
   nfsd_idmap.h
   nls.h
   nmi.h
   node.h
   nodemask.h
   notifier.h
   nsc_gpio.h
   nsproxy.h
   nubus.h
   numa.h
   nvram.h
   oom.h
   oprofile.h
   page-flags.h
   pagemap.h
   pagevec.h
   param.h
   parport.h
   parport_pc.h
   parser.h
   patchkey.h
   pci-acpi.h
   pci.h
   pci_hotplug.h
   pci_ids.h
   pci_regs.h
   pcieport_if.h
   percpu.h
   percpu_counter.h
   personality.h
   pfkeyv2.h
   pfn.h
   pg.h
   phonedev.h
   phy.h
   pid.h
   pipe_fs_i.h
   pkt_cls.h
   pkt_sched.h
   pktcdvd.h
   platform_device.h
   plist.h
   pm.h
   pm_legacy.h
   pmu.h
   pnp.h
   pnpbios.h
   poison.h
   poll.h
   posix-timers.h
   posix_acl.h
   posix_acl_xattr.h
   posix_types.h
   ppdev.h
   ppp-comp.h
   ppp_channel.h
   ppp_defs.h
   prctl.h
   preempt.h
   prefetch.h
   prio_tree.h
   proc_fs.h
   profile.h
   ps2esdi.h
   pspace.h
   ptrace.h
   qic117.h
   qnx4_fs.h
   qnxtypes.h
   quota.h
   quotaio_v1.h
   quotaio_v2.h
   quotaops.h
   radeonfb.h
   radix-tree.h
   raid_class.h
   ramfs.h
   random.h
   raw.h
   rbtree.h
   rcupdate.h
   reboot.h
   reboot_fixups.h
   reiserfs_acl.h
   reiserfs_fs.h
   reiserfs_fs_i.h
   reiserfs_fs_sb.h
   reiserfs_xattr.h
   relay.h
   resource.h
   resume-trace.h
   rio.h
   rio_drv.h
   rio_ids.h
   rio_regs.h
   rmap.h
   romfs_fs.h
   root_dev.h
   rose.h
   route.h
   rslib.h
   rtc-v3020.h
   rtc.h
   rtmutex.h
   rtnetlink.h
   rwsem-spinlock.h
   rwsem.h
   sc26198.h
   scatterlist.h
   scc.h
   sched.h
   screen_info.h
   sctp.h
   scx200.h
   scx200_gpio.h
   sdla.h
   sdla_fr.h
   seccomp.h
   securebits.h
   security.h
   selection.h
   selinux.h
   selinux_netlink.h
   sem.h
   seq_file.h
   seqlock.h
   serial.h
   serial_8250.h
   serial_core.h
   serial_ip3106.h
   serial_reg.h
   serial167.h
   serialP.h
   serio.h
   shm.h
   shmem_fs.h
   signal.h
   skbuff.h
   slab.h
   smb.h
   smb_fs.h
   smb_fs_i.h
   smb_fs_sb.h
   smb_mount.h
   smbno.h
   smp.h
   smp_lock.h
   snmp.h
   socket.h
   sockios.h
   som.h
   sonet.h
   sonypi.h
   sort.h
   sound.h
   soundcard.h
   spinlock.h
   spinlock_api_smp.h
   spinlock_api_up.h
   spinlock_types.h
   spinlock_types_up.h
   spinlock_up.h
   srcu.h
   stacktrace.h
   stallion.h
   stat.h
   statfs.h
   stddef.h
   stop_machine.h
   string.h
   stringify.h
   superhyway.h
   suspend.h
   swap.h
   swapops.h
   synclink.h
   sys.h
   syscalls.h
   sysctl.h
   sysdev.h
   sysfs.h
   sysrq.h
   sysv_fs.h
   taskstats.h
   taskstats_kern.h
   tcp.h
   telephony.h
   termios.h
   textsearch.h
   textsearch_fsm.h
   tfrc.h
   thread_info.h
   threads.h
   ticable.h
   tifm.h
   time.h
   timer.h
   times.h
   timex.h
   tiocl.h
   tipc.h
   tipc_config.h
   topology.h
   toshiba.h
   transport_class.h
   trdevice.h
   tsacct_kern.h
   tty.h
   tty_driver.h
   tty_flip.h
   tty_ldisc.h
   types.h
   uaccess.h
   udf_fs.h
   udf_fs_i.h
   udf_fs_sb.h
   udp.h
   ufs_fs.h
   ufs_fs_i.h
   ufs_fs_sb.h
   uinput.h
   uio.h
   ultrasound.h
   umem.h
   un.h
   unistd.h
   unwind.h
   usb.h
   usb_ch9.h
   usb_gadget.h
   usb_gadgetfs.h
   usb_usual.h
   usbdevice_fs.h
   user.h
   utime.h
   uts.h
   utsname.h
   vermagic.h
   vfs.h
   via.h
   video_decoder.h
   video_encoder.h
   videodev.h
   videodev2.h
   videotext.h
   vmalloc.h
   vmstat.h
   vt.h
   vt_buffer.h
   vt_kern.h
   wait.h
   wanrouter.h
   watchdog.h
   wireless.h
   workqueue.h
   writeback.h
   x25.h
   xattr.h
   xfrm.h
   yam.h
   zconf.h
   zftape.h
   zlib.h
   zorro.h
   zorro_ids.h
   zutil.h

#ifndef __LINUX__AIO_H
#define __LINUX__AIO_H

#include <linux/list.h>
#include <linux/workqueue.h>
#include <linux/aio_abi.h>
#include <linux/uio.h>

#include <asm/atomic.h>
#include <linux/uio.h>

#define AIO_MAXSEGS		4
#define AIO_KIOGRP_NR_ATOMIC	8

struct kioctx;

/* Notes on cancelling a kiocb:
 *	If a kiocb is cancelled, aio_complete may return 0 to indicate 
 *	that cancel has not yet disposed of the kiocb.  All cancel 
 *	operations *must* call aio_put_req to dispose of the kiocb 
 *	to guard against races with the completion code.
 */
#define KIOCB_C_CANCELLED	0x01
#define KIOCB_C_COMPLETE	0x02

#define KIOCB_SYNC_KEY		(~0U)

/* ki_flags bits */
/*
 * This may be used for cancel/retry serialization in the future, but
 * for now it's unused and we probably don't want modules to even
 * think they can use it.
 */
/* #define KIF_LOCKED		0 */
#define KIF_KICKED		1
#define KIF_CANCELLED		2

#define kiocbTryLock(iocb)	test_and_set_bit(KIF_LOCKED, &(iocb)->ki_flags)
#define kiocbTryKick(iocb)	test_and_set_bit(KIF_KICKED, &(iocb)->ki_flags)

#define kiocbSetLocked(iocb)	set_bit(KIF_LOCKED, &(iocb)->ki_flags)
#define kiocbSetKicked(iocb)	set_bit(KIF_KICKED, &(iocb)->ki_flags)
#define kiocbSetCancelled(iocb)	set_bit(KIF_CANCELLED, &(iocb)->ki_flags)

#define kiocbClearLocked(iocb)	clear_bit(KIF_LOCKED, &(iocb)->ki_flags)
#define kiocbClearKicked(iocb)	clear_bit(KIF_KICKED, &(iocb)->ki_flags)
#define kiocbClearCancelled(iocb)	clear_bit(KIF_CANCELLED, &(iocb)->ki_flags)

#define kiocbIsLocked(iocb)	test_bit(KIF_LOCKED, &(iocb)->ki_flags)
#define kiocbIsKicked(iocb)	test_bit(KIF_KICKED, &(iocb)->ki_flags)
#define kiocbIsCancelled(iocb)	test_bit(KIF_CANCELLED, &(iocb)->ki_flags)

/* is there a better place to document function pointer methods? */
/**
 * ki_retry	-	iocb forward progress callback
 * @kiocb:	The kiocb struct to advance by performing an operation.
 *
 * This callback is called when the AIO core wants a given AIO operation
 * to make forward progress.  The kiocb argument describes the operation
 * that is to be performed.  As the operation proceeds, perhaps partially,
 * ki_retry is expected to update the kiocb with progress made.  Typically
 * ki_retry is set in the AIO core and it itself calls file_operations
 * helpers.
 *
 * ki_retry's return value determines when the AIO operation is completed
 * and an event is generated in the AIO event ring.  Except the special
 * return values described below, the value that is returned from ki_retry
 * is transferred directly into the completion ring as the operation's
 * resulting status.  Once this has happened ki_retry *MUST NOT* reference
 * the kiocb pointer again.
 *
 * If ki_retry returns -EIOCBQUEUED it has made a promise that aio_complete()
 * will be called on the kiocb pointer in the future.  The AIO core will
 * not ask the method again -- ki_retry must ensure forward progress.
 * aio_complete() must be called once and only once in the future, multiple
 * calls may result in undefined behaviour.
 *
 * If ki_retry returns -EIOCBRETRY it has made a promise that kick_iocb()
 * will be called on the kiocb pointer in the future.  This may happen
 * through generic helpers that associate kiocb->ki_wait with a wait
 * queue head that ki_retry uses via current->io_wait.  It can also happen
 * with custom tracking and manual calls to kick_iocb(), though that is
 * discouraged.  In either case, kick_iocb() must be called once and only
 * once.  ki_retry must ensure forward progress, the AIO core will wait
 * indefinitely for kick_iocb() to be called.
 */
struct kiocb {
	struct list_head	ki_run_list;
	long			ki_flags;
	int			ki_users;
	unsigned		ki_key;		/* id of this request */

	struct file		*ki_filp;
	struct kioctx		*ki_ctx;	/* may be NULL for sync ops */
	int			(*ki_cancel)(struct kiocb *, struct io_event *);
	ssize_t			(*ki_retry)(struct kiocb *);
	void			(*ki_dtor)(struct kiocb *);

	union {
		void __user		*user;
		struct task_struct	*tsk;
	} ki_obj;

	__u64			ki_user_data;	/* user's data for completion */
	wait_queue_t		ki_wait;
	loff_t			ki_pos;

	void			*private;
	/* State that we remember to be able to restart/retry  */
	unsigned short		ki_opcode;
	size_t			ki_nbytes; 	/* copy of iocb->aio_nbytes */
	char 			__user *ki_buf;	/* remaining iocb->aio_buf */
	size_t			ki_left; 	/* remaining bytes */
	long			ki_retried; 	/* just for testing */
	struct iovec		ki_inline_vec;	/* inline vector */
 	struct iovec		*ki_iovec;
 	unsigned long		ki_nr_segs;
 	unsigned long		ki_cur_seg;

	struct list_head	ki_list;	/* the aio core uses this
						 * for cancellation */
};

#define is_sync_kiocb(iocb)	((iocb)->ki_key == KIOCB_SYNC_KEY)
#define init_sync_kiocb(x, filp)			\
	do {						\
		struct task_struct *tsk = current;	\
		(x)->ki_flags = 0;			\
		(x)->ki_users = 1;			\
		(x)->ki_key = KIOCB_SYNC_KEY;		\
		(x)->ki_filp = (filp);			\
		(x)->ki_ctx = NULL;			\
		(x)->ki_cancel = NULL;			\
		(x)->ki_retry = NULL;			\
		(x)->ki_dtor = NULL;			\
		(x)->ki_obj.tsk = tsk;			\
		(x)->ki_user_data = 0;                  \
		init_wait((&(x)->ki_wait));             \
	} while (0)

#define AIO_RING_MAGIC			0xa10a10a1
#define AIO_RING_COMPAT_FEATURES	1
#define AIO_RING_INCOMPAT_FEATURES	0
struct aio_ring {
	unsigned	id;	/* kernel internal index number */
	unsigned	nr;	/* number of io_events */
	unsigned	head;
	unsigned	tail;

	unsigned	magic;
	unsigned	compat_features;
	unsigned	incompat_features;
	unsigned	header_length;	/* size of aio_ring */


	struct io_event		io_events[0];
}; /* 128 bytes + ring size */

#define aio_ring_avail(info, ring)	(((ring)->head + (info)->nr - 1 - (ring)->tail) % (info)->nr)

#define AIO_RING_PAGES	8
struct aio_ring_info {
	unsigned long		mmap_base;
	unsigned long		mmap_size;

	struct page		**ring_pages;
	spinlock_t		ring_lock;
	long			nr_pages;

	unsigned		nr, tail;

	struct page		*internal_pages[AIO_RING_PAGES];
};

struct kioctx {
	atomic_t		users;
	int			dead;
	struct mm_struct	*mm;

	/* This needs improving */
	unsigned long		user_id;
	struct kioctx		*next;

	wait_queue_head_t	wait;

	spinlock_t		ctx_lock;

	int			reqs_active;
	struct list_head	active_reqs;	/* used for cancellation */
	struct list_head	run_list;	/* used for kicked reqs */

	/* sys_io_setup currently limits this to an unsigned int */
	unsigned		max_reqs;

	struct aio_ring_info	ring_info;

	struct work_struct	wq;
};

/* prototypes */
extern unsigned aio_max_size;

extern ssize_t FASTCALL(wait_on_sync_kiocb(struct kiocb *iocb));
extern int FASTCALL(aio_put_req(struct kiocb *iocb));
extern void FASTCALL(kick_iocb(struct kiocb *iocb));
extern int FASTCALL(aio_complete(struct kiocb *iocb, long res, long res2));
extern void FASTCALL(__put_ioctx(struct kioctx *ctx));
struct mm_struct;
extern void FASTCALL(exit_aio(struct mm_struct *mm));
extern struct kioctx *lookup_ioctx(unsigned long ctx_id);
extern int FASTCALL(io_submit_one(struct kioctx *ctx,
			struct iocb __user *user_iocb, struct iocb *iocb));

/* semi private, but used by the 32bit emulations: */
struct kioctx *lookup_ioctx(unsigned long ctx_id);
int FASTCALL(io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
				  struct iocb *iocb));

#define get_ioctx(kioctx) do {						\
	BUG_ON(atomic_read(&(kioctx)->users) <= 0);			\
	atomic_inc(&(kioctx)->users);					\
} while (0)
#define put_ioctx(kioctx) do {						\
	BUG_ON(atomic_read(&(kioctx)->users) <= 0);			\
	if (unlikely(atomic_dec_and_test(&(kioctx)->users))) 		\
		__put_ioctx(kioctx);					\
} while (0)

#define in_aio() !is_sync_wait(current->io_wait)
/* may be used for debugging */
#define warn_if_async()							\
do {									\
	if (in_aio()) {							\
		printk(KERN_ERR "%s(%s:%d) called in async context!\n",	\
			__FUNCTION__, __FILE__, __LINE__);		\
		dump_stack();						\
	}								\
} while (0)

#define io_wait_to_kiocb(wait) container_of(wait, struct kiocb, ki_wait)
#define is_retried_kiocb(iocb) ((iocb)->ki_retried > 1)

#include <linux/aio_abi.h>

static inline struct kiocb *list_kiocb(struct list_head *h)
{
	return list_entry(h, struct kiocb, ki_list);
}

/* for sysctl: */
extern unsigned long aio_nr;
extern unsigned long aio_max_nr;

#endif /* __LINUX__AIO_H */

About Koders | Resources | Downloads | Support | Black Duck | Terms of Service | DMCA | Privacy Policy | Contact Us