1 2 3 4 5 6 7 8 9 10 11 12
13 14 15
16
17 import xdc.runtime.Assert;
18 import xdc.runtime.Error;
19 import xdc.runtime.knl.ISemaphore;
20
21 /*!
22 * ======== Semaphore ========
23 * Provides semaphore services when an ISemaphore.Handle is available.
24 *
25 * An application can isolate itself from ISemaphore implementations by using
26 * this module. The application must first obtain an ISemaphore.Handle.
27 * It make get such a handle by directly calling {@link SemThread#create} or
28 * {@link SemProcess#create}. Then the application can use the generic
29 * APIs provided by this module.
30 */
31
32 module Semaphore
33 {
34 /*!
35 * ======== PendStatus ========
36 * Error codes returned by Semaphore_pend
37 */
38 enum PendStatus {
39 PendStatus_ERROR = -1,
40 PendStatus_TIMEOUT = 0,
41 PendStatus_SUCCESS = 1
42 };
43
44 /*! Used as the timeout value to specify wait forever */
45 const UInt FOREVER = ISemaphore.FOREVER;
46
47 /*!
48 * Proxy used for optimization.
49 *
50 * If ALL ISemaphore.Handles were created using the same module
51 * (e.g SemProcess) then setting this Proxy to SemProcess and
52 * setting Semaphore.Proxy.abstractInstances$ = false,
53 * Semaphore APIs can have better performance.
54 */
55 proxy Proxy inherits ISemaphore;
56
57 /*!
58 * ======== pend ========
59 * Wait for the semaphore to have a nonzero count, then decrement it.
60 *
61 * @p(blist)
62 * -{@link #PendStatus_ERROR} if an error occured.
63 * -{@link #PendStatus_TIMEOUT} denotes timeout.
64 * -{@link #PendStatus_SUCCESS} semaphore was decremented.
65 * details.
66 * @p
67 *
68 * @param(sem) ISemaphore.Handle to be used
69 * @param(timeout) timeout in microseconds
70 * @param(eb) Pointer to Error.Block
71 * @a(returns) status returned. (refer to above description)
72 */
73 Int pend(ISemaphore.Handle sem, UInt timeout, Error.Block *eb);
74
75 /*!
76 * ======== post ========
77 * Increment the semaphore count.
78 *
79 * @param(sem) ISemaphore.Handle to be used
80 * @param(eb) Pointer to Error.Block
81 * @a(returns) true for success, false for error in Error block.
82 */
83 Bool post(ISemaphore.Handle sem, Error.Block *eb);
84 }
85 86 87
88