1/*
2 * Copyright (c) 2009-2013 Apple Inc. All rights reserved.
3 *
4 * @APPLE_APACHE_LICENSE_HEADER_START@
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * @APPLE_APACHE_LICENSE_HEADER_END@
19 */
20
21#ifndef __DISPATCH_DATA__
22#define __DISPATCH_DATA__
23
24#ifndef __DISPATCH_INDIRECT__
25#error "Please #include <dispatch/dispatch.h> instead of this file directly."
26#include <dispatch/base.h> // for HeaderDoc
27#endif
28
29__BEGIN_DECLS
30
31/*! @header
32 * Dispatch data objects describe contiguous or sparse regions of memory that
33 * may be managed by the system or by the application.
34 * Dispatch data objects are immutable, any direct access to memory regions
35 * represented by dispatch objects must not modify that memory.
36 */
37
38/*!
39 * @typedef dispatch_data_t
40 * A dispatch object representing memory regions.
41 */
42DISPATCH_DECL(dispatch_data);
43
44/*!
45 * @var dispatch_data_empty
46 * @discussion The singleton dispatch data object representing a zero-length
47 * memory region.
48 */
49#define dispatch_data_empty \
50		DISPATCH_GLOBAL_OBJECT(dispatch_data_t, _dispatch_data_empty)
51__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0)
52DISPATCH_EXPORT struct dispatch_data_s _dispatch_data_empty;
53
54/*!
55 * @const DISPATCH_DATA_DESTRUCTOR_DEFAULT
56 * @discussion The default destructor for dispatch data objects.
57 * Used at data object creation to indicate that the supplied buffer should
58 * be copied into internal storage managed by the system.
59 */
60#define DISPATCH_DATA_DESTRUCTOR_DEFAULT NULL
61
62#ifdef __BLOCKS__
63#if !TARGET_OS_WIN32
64/*! @parseOnly */
65#define DISPATCH_DATA_DESTRUCTOR_TYPE_DECL(name) \
66	DISPATCH_EXPORT const dispatch_block_t _dispatch_data_destructor_##name
67#else
68#define DISPATCH_DATA_DESTRUCTOR_TYPE_DECL(name) \
69	DISPATCH_EXPORT dispatch_block_t _dispatch_data_destructor_##name
70#endif
71#else
72#define DISPATCH_DATA_DESTRUCTOR_TYPE_DECL(name) \
73	DISPATCH_EXPORT const dispatch_function_t \
74	_dispatch_data_destructor_##name
75#endif /* __BLOCKS__ */
76
77/*!
78 * @const DISPATCH_DATA_DESTRUCTOR_FREE
79 * @discussion The destructor for dispatch data objects created from a malloc'd
80 * buffer. Used at data object creation to indicate that the supplied buffer
81 * was allocated by the malloc() family and should be destroyed with free(3).
82 */
83#define DISPATCH_DATA_DESTRUCTOR_FREE (_dispatch_data_destructor_free)
84__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0)
85DISPATCH_DATA_DESTRUCTOR_TYPE_DECL(free);
86
87/*!
88 * @const DISPATCH_DATA_DESTRUCTOR_MUNMAP
89 * @discussion The destructor for dispatch data objects that have been created
90 * from buffers that require deallocation with munmap(2).
91 */
92#define DISPATCH_DATA_DESTRUCTOR_MUNMAP (_dispatch_data_destructor_munmap)
93__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0)
94DISPATCH_DATA_DESTRUCTOR_TYPE_DECL(munmap);
95
96#ifdef __BLOCKS__
97/*!
98 * @function dispatch_data_create
99 * Creates a dispatch data object from the given contiguous buffer of memory. If
100 * a non-default destructor is provided, ownership of the buffer remains with
101 * the caller (i.e. the bytes will not be copied). The last release of the data
102 * object will result in the invocation of the specified destructor on the
103 * specified queue to free the buffer.
104 *
105 * If the DISPATCH_DATA_DESTRUCTOR_FREE destructor is provided the buffer will
106 * be freed via free(3) and the queue argument ignored.
107 *
108 * If the DISPATCH_DATA_DESTRUCTOR_DEFAULT destructor is provided, data object
109 * creation will copy the buffer into internal memory managed by the system.
110 *
111 * @param buffer	A contiguous buffer of data.
112 * @param size		The size of the contiguous buffer of data.
113 * @param queue		The queue to which the destructor should be submitted.
114 * @param destructor	The destructor responsible for freeing the data when it
115 *			is no longer needed.
116 * @result		A newly created dispatch data object.
117 */
118__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0)
119DISPATCH_EXPORT DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT DISPATCH_NOTHROW
120dispatch_data_t
121dispatch_data_create(const void *buffer,
122	size_t size,
123	dispatch_queue_t queue,
124	dispatch_block_t destructor);
125#endif /* __BLOCKS__ */
126
127/*!
128 * @function dispatch_data_get_size
129 * Returns the logical size of the memory region(s) represented by the specified
130 * dispatch data object.
131 *
132 * @param data	The dispatch data object to query.
133 * @result	The number of bytes represented by the data object.
134 */
135__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0)
136DISPATCH_EXPORT DISPATCH_PURE DISPATCH_NONNULL1 DISPATCH_NOTHROW
137size_t
138dispatch_data_get_size(dispatch_data_t data);
139
140/*!
141 * @function dispatch_data_create_map
142 * Maps the memory represented by the specified dispatch data object as a single
143 * contiguous memory region and returns a new data object representing it.
144 * If non-NULL references to a pointer and a size variable are provided, they
145 * are filled with the location and extent of that region. These allow direct
146 * read access to the represented memory, but are only valid until the returned
147 * object is released. Under ARC, if that object is held in a variable with
148 * automatic storage, care needs to be taken to ensure that it is not released
149 * by the compiler before memory access via the pointer has been completed.
150 *
151 * @param data		The dispatch data object to map.
152 * @param buffer_ptr	A pointer to a pointer variable to be filled with the
153 *			location of the mapped contiguous memory region, or
154 *			NULL.
155 * @param size_ptr	A pointer to a size_t variable to be filled with the
156 *			size of the mapped contiguous memory region, or NULL.
157 * @result		A newly created dispatch data object.
158 */
159__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0)
160DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_RETURNS_RETAINED
161DISPATCH_WARN_RESULT DISPATCH_NOTHROW
162dispatch_data_t
163dispatch_data_create_map(dispatch_data_t data,
164	const void **buffer_ptr,
165	size_t *size_ptr);
166
167/*!
168 * @function dispatch_data_create_concat
169 * Returns a new dispatch data object representing the concatenation of the
170 * specified data objects. Those objects may be released by the application
171 * after the call returns (however, the system might not deallocate the memory
172 * region(s) described by them until the newly created object has also been
173 * released).
174 *
175 * @param data1	The data object representing the region(s) of memory to place
176 *		at the beginning of the newly created object.
177 * @param data2	The data object representing the region(s) of memory to place
178 *		at the end of the newly created object.
179 * @result	A newly created object representing the concatenation of the
180 *		data1 and data2 objects.
181 */
182__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0)
183DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_RETURNS_RETAINED
184DISPATCH_WARN_RESULT DISPATCH_NOTHROW
185dispatch_data_t
186dispatch_data_create_concat(dispatch_data_t data1, dispatch_data_t data2);
187
188/*!
189 * @function dispatch_data_create_subrange
190 * Returns a new dispatch data object representing a subrange of the specified
191 * data object, which may be released by the application after the call returns
192 * (however, the system might not deallocate the memory region(s) described by
193 * that object until the newly created object has also been released).
194 *
195 * @param data		The data object representing the region(s) of memory to
196 *			create a subrange of.
197 * @param offset	The offset into the data object where the subrange
198 *			starts.
199 * @param length	The length of the range.
200 * @result		A newly created object representing the specified
201 *			subrange of the data object.
202 */
203__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0)
204DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_RETURNS_RETAINED
205DISPATCH_WARN_RESULT DISPATCH_NOTHROW
206dispatch_data_t
207dispatch_data_create_subrange(dispatch_data_t data,
208	size_t offset,
209	size_t length);
210
211#ifdef __BLOCKS__
212/*!
213 * @typedef dispatch_data_applier_t
214 * A block to be invoked for every contiguous memory region in a data object.
215 *
216 * @param region	A data object representing the current region.
217 * @param offset	The logical offset of the current region to the start
218 *			of the data object.
219 * @param buffer	The location of the memory for the current region.
220 * @param size		The size of the memory for the current region.
221 * @result		A Boolean indicating whether traversal should continue.
222 */
223typedef bool (^dispatch_data_applier_t)(dispatch_data_t region,
224	size_t offset,
225	const void *buffer,
226	size_t size);
227
228/*!
229 * @function dispatch_data_apply
230 * Traverse the memory regions represented by the specified dispatch data object
231 * in logical order and invoke the specified block once for every contiguous
232 * memory region encountered.
233 *
234 * Each invocation of the block is passed a data object representing the current
235 * region and its logical offset, along with the memory location and extent of
236 * the region. These allow direct read access to the memory region, but are only
237 * valid until the passed-in region object is released. Note that the region
238 * object is released by the system when the block returns, it is the
239 * responsibility of the application to retain it if the region object or the
240 * associated memory location are needed after the block returns.
241 *
242 * @param data		The data object to traverse.
243 * @param applier	The block to be invoked for every contiguous memory
244 *			region in the data object.
245 * @result		A Boolean indicating whether traversal completed
246 *			successfully.
247 */
248__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0)
249DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
250bool
251dispatch_data_apply(dispatch_data_t data, dispatch_data_applier_t applier);
252#endif /* __BLOCKS__ */
253
254/*!
255 * @function dispatch_data_copy_region
256 * Finds the contiguous memory region containing the specified location among
257 * the regions represented by the specified object and returns a copy of the
258 * internal dispatch data object representing that region along with its logical
259 * offset in the specified object.
260 *
261 * @param data		The dispatch data object to query.
262 * @param location	The logical position in the data object to query.
263 * @param offset_ptr	A pointer to a size_t variable to be filled with the
264 *			logical offset of the returned region object to the
265 *			start of the queried data object.
266 * @result		A newly created dispatch data object.
267 */
268__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0)
269DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_RETURNS_RETAINED
270DISPATCH_WARN_RESULT DISPATCH_NOTHROW
271dispatch_data_t
272dispatch_data_copy_region(dispatch_data_t data,
273	size_t location,
274	size_t *offset_ptr);
275
276__END_DECLS
277
278#endif /* __DISPATCH_DATA__ */
279