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 * The function returns one of the following:
62 * @p(blist)
63 * -{@link #PendStatus_ERROR} if an error occured.
64 * -{@link #PendStatus_TIMEOUT} denotes timeout.
65 * -{@link #PendStatus_SUCCESS} semaphore was decremented.
66 *
67 * @p
68 *
69 * @param(sem) ISemaphore.Handle to be used
70 * @param(timeout) timeout in microseconds or
71 * {@link #FOREVER Semaphore_FOREVER} to wait forever
72 * @param(eb) Pointer to Error.Block
73 * @a(returns) status returned. (refer to above description)
74 */
75 Int pend(ISemaphore.Handle sem, UInt timeout, Error.Block *eb);
76
77 /*!
78 * ======== post ========
79 * Increment the semaphore count.
80 *
81 * @param(sem) ISemaphore.Handle to be used
82 * @param(eb) Pointer to Error.Block
83 * @a(returns) true for success, false for error in Error block.
84 */
85 Bool post(ISemaphore.Handle sem, Error.Block *eb);
86 }
87 88 89
90