master
  1/*
  2 * Copyright (c) 2008-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_SEMAPHORE__
 22#define __DISPATCH_SEMAPHORE__
 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
 29DISPATCH_ASSUME_NONNULL_BEGIN
 30DISPATCH_ASSUME_ABI_SINGLE_BEGIN
 31
 32/*!
 33 * @typedef dispatch_semaphore_t
 34 *
 35 * @abstract
 36 * A counting semaphore.
 37 */
 38DISPATCH_DECL_SWIFT(dispatch_semaphore, DispatchSemaphore);
 39
 40__BEGIN_DECLS
 41
 42/*!
 43 * @function dispatch_semaphore_create
 44 *
 45 * @abstract
 46 * Creates new counting semaphore with an initial value.
 47 *
 48 * @discussion
 49 * Passing zero for the value is useful for when two threads need to reconcile
 50 * the completion of a particular event. Passing a value greater than zero is
 51 * useful for managing a finite pool of resources, where the pool size is equal
 52 * to the value.
 53 *
 54 * @param value
 55 * The starting value for the semaphore. Passing a value less than zero will
 56 * cause NULL to be returned.
 57 *
 58 * @result
 59 * The newly created semaphore, or NULL on failure.
 60 */
 61API_AVAILABLE(macos(10.6), ios(4.0))
 62DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT
 63DISPATCH_NOTHROW
 64DISPATCH_SWIFT_NAME(DispatchSemaphore.init(value:))
 65dispatch_semaphore_t
 66dispatch_semaphore_create(intptr_t value);
 67
 68/*!
 69 * @function dispatch_semaphore_wait
 70 *
 71 * @abstract
 72 * Wait (decrement) for a semaphore.
 73 *
 74 * @discussion
 75 * Decrement the counting semaphore. If the resulting value is less than zero,
 76 * this function waits for a signal to occur before returning. If the timeout is
 77 * reached without a signal being received, the semaphore is re-incremented
 78 * before the function returns.
 79 *
 80 * @param dsema
 81 * The semaphore. The result of passing NULL in this parameter is undefined.
 82 *
 83 * @param timeout
 84 * When to timeout (see dispatch_time). As a convenience, there are the
 85 * DISPATCH_TIME_NOW and DISPATCH_TIME_FOREVER constants.
 86 *
 87 * @result
 88 * Returns zero on success, or non-zero if the timeout occurred.
 89 */
 90API_AVAILABLE(macos(10.6), ios(4.0))
 91DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
 92DISPATCH_REFINED_FOR_SWIFT
 93intptr_t
 94dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
 95
 96/*!
 97 * @function dispatch_semaphore_signal
 98 *
 99 * @abstract
100 * Signal (increment) a semaphore.
101 *
102 * @discussion
103 * Increment the counting semaphore. If the previous value was less than zero,
104 * this function wakes a waiting thread before returning.
105 *
106 * @param dsema The counting semaphore.
107 * The result of passing NULL in this parameter is undefined.
108 *
109 * @result
110 * This function returns non-zero if a thread is woken. Otherwise, zero is
111 * returned.
112 */
113API_AVAILABLE(macos(10.6), ios(4.0))
114DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
115DISPATCH_REFINED_FOR_SWIFT
116intptr_t
117dispatch_semaphore_signal(dispatch_semaphore_t dsema);
118
119__END_DECLS
120
121DISPATCH_ASSUME_ABI_SINGLE_END
122DISPATCH_ASSUME_NONNULL_END
123
124#endif /* __DISPATCH_SEMAPHORE__ */