X-Git-Url: https://git.saurik.com/apple/libdispatch.git/blobdiff_plain/517da941284910bcce6aed25a1e923708f0ed33f..refs/heads/master:/src/io_internal.h?ds=sidebyside diff --git a/src/io_internal.h b/src/io_internal.h index fbb27c5..672727f 100644 --- a/src/io_internal.h +++ b/src/io_internal.h @@ -35,11 +35,15 @@ #define _DISPATCH_IO_LABEL_SIZE 16 #if TARGET_OS_EMBEDDED // rdar://problem/9032036 -#define DIO_MAX_CHUNK_PAGES 128u // 512kB chunk size +#define DIO_MAX_CHUNK_SIZE (512u * 1024) +#define DIO_HASH_SIZE 64u // must be a power of two #else -#define DIO_MAX_CHUNK_PAGES 256u // 1024kB chunk size +#define DIO_MAX_CHUNK_SIZE (1024u * 1024) +#define DIO_HASH_SIZE 256u // must be a power of two #endif +#define DIO_HASH(x) ((uintptr_t)(x) & (DIO_HASH_SIZE - 1)) + #define DIO_DEFAULT_LOW_WATER_CHUNKS 1u // default low-water mark #define DIO_MAX_PENDING_IO_REQS 6u // Pending I/O read advises @@ -62,8 +66,8 @@ typedef unsigned int dispatch_op_flags_t; #define DIO_CLOSED 1u // channel has been closed #define DIO_STOPPED 2u // channel has been stopped (implies closed) -DISPATCH_DECL_INTERNAL(dispatch_operation); -DISPATCH_DECL_INTERNAL(dispatch_disk); +DISPATCH_INTERNAL_CLASS_DECL(operation); +DISPATCH_INTERNAL_CLASS_DECL(disk); struct dispatch_stream_s { dispatch_queue_t dq; @@ -90,10 +94,8 @@ struct dispatch_stat_s { mode_t mode; }; -DISPATCH_CLASS_DECL(disk); struct dispatch_disk_s { - DISPATCH_STRUCT_HEADER(disk); - dev_t dev; + DISPATCH_OBJECT_HEADER(disk); TAILQ_HEAD(dispatch_disk_operations_s, dispatch_operation_s) operations; dispatch_operation_t cur_rq; dispatch_queue_t pick_queue; @@ -101,8 +103,8 @@ struct dispatch_disk_s { size_t free_idx; size_t req_idx; size_t advise_idx; + dev_t dev; bool io_active; - int err; TAILQ_ENTRY(dispatch_disk_s) disk_list; size_t advise_list_depth; dispatch_operation_t advise_list[]; @@ -138,9 +140,8 @@ typedef struct dispatch_io_param_s { unsigned long interval_flags; } dispatch_io_param_s; -DISPATCH_CLASS_DECL(operation); struct dispatch_operation_s { - DISPATCH_STRUCT_HEADER(operation); + DISPATCH_OBJECT_HEADER(operation); dispatch_queue_t op_q; dispatch_op_direction_t direction; // READ OR WRITE dispatch_io_param_s params; @@ -164,7 +165,7 @@ struct dispatch_operation_s { DISPATCH_CLASS_DECL(io); struct dispatch_io_s { - DISPATCH_STRUCT_HEADER(io); + DISPATCH_OBJECT_HEADER(io); dispatch_queue_t queue, barrier_queue; dispatch_group_t barrier_group; dispatch_io_param_s params; @@ -177,10 +178,11 @@ struct dispatch_io_s { void _dispatch_io_set_target_queue(dispatch_io_t channel, dispatch_queue_t dq); size_t _dispatch_io_debug(dispatch_io_t channel, char* buf, size_t bufsiz); -void _dispatch_io_dispose(dispatch_io_t channel); +void _dispatch_io_dispose(dispatch_io_t channel, bool *allow_free); size_t _dispatch_operation_debug(dispatch_operation_t op, char* buf, size_t bufsiz); -void _dispatch_operation_dispose(dispatch_operation_t operation); -void _dispatch_disk_dispose(dispatch_disk_t disk); +void _dispatch_operation_dispose(dispatch_operation_t operation, + bool *allow_free); +void _dispatch_disk_dispose(dispatch_disk_t disk, bool *allow_free); #endif // __DISPATCH_IO_INTERNAL__