#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
#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;
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;
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[];
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;
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;
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__