1 /*
2  * Copyright (C) 2015-2017 Alibaba Group Holding Limited
3  */
4 
5 #ifndef K_EVENT_H
6 #define K_EVENT_H
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 /** @addtogroup aos_rhino event
13  *  Event can be used for tasks synchronize.
14  *
15  *  @{
16  */
17 
18 /**
19  * event object
20  */
21 typedef struct {
22     /**<
23      *  Manage blocked tasks
24      *  List head is this event, list node is task, which are blocked in this event
25      */
26     blk_obj_t blk_obj;
27     uint32_t  flags;            /**< 32bit mapping 32 synchronization events */
28 #if (RHINO_CONFIG_KOBJ_LIST > 0)
29     klist_t   event_item;       /**< kobj list for statistics */
30 #endif
31     uint8_t   mm_alloc_flag;    /**< buffer from internal malloc or caller input */
32 } kevent_t;
33 
34 /**
35  * event operation bit1 - AND / OR
36  * AND, Synchronization success only for all flag bits matching
37  * OR,  Synchronization success only for 1 flag bits matching
38  */
39 #define RHINO_FLAGS_AND_MASK    0x2u
40 /**
41  * event operation bit0 - clear / not clear
42  */
43 #define RHINO_FLAGS_CLEAR_MASK  0x1u
44 
45 /**
46  * event operation, explanation in APIs
47  */
48 #define RHINO_AND               0x02u
49 #define RHINO_AND_CLEAR         0x03u
50 #define RHINO_OR                0x00u
51 #define RHINO_OR_CLEAR          0x01u
52 
53 /**
54  * Create a event.
55  *
56  * @param[in]  event  pointer to the event (the space is provided outside, by user)
57  * @param[in]  name   name of the event
58  * @param[in]  flags  flags to be init
59  *
60  * @return  the operation status, RHINO_SUCCESS is OK, others is error
61  */
62 kstat_t krhino_event_create(kevent_t *event, const name_t *name, uint32_t flags);
63 
64 /**
65  * Delete a event.
66  *
67  * @param[in]  event  pointer to a event
68  *
69  * @return  the operation status, RHINO_SUCCESS is OK, others is error
70  */
71 kstat_t krhino_event_del(kevent_t *event);
72 
73 #if (RHINO_CONFIG_KOBJ_DYN_ALLOC > 0)
74 /**
75  * Malloc and create a event.
76  *
77  * @param[out]  event  pointer to the event (the space is provided inside, from heap)
78  * @param[in]   name   name of the semaphore
79  * @param[in]   flags  flags to be init
80  *
81  * @return  the operation status, RHINO_SUCCESS is OK, others is error
82  */
83 kstat_t krhino_event_dyn_create(kevent_t **event, const name_t *name, uint32_t flags);
84 
85 /**
86  * Delete and free a event.
87  *
88  * @param[in]  event  pointer to a event
89  *
90  * @return  the operation status, RHINO_SUCCESS is OK, others is error
91  */
92 kstat_t krhino_event_dyn_del(kevent_t *event);
93 #endif
94 
95 /**
96  * Get event, task may be blocked.
97  * opt = RHINO_AND: Waiting for 'event->flags' & 'flags' == 'flags', do not clear 'event->flags' after success.
98  * opt = RHINO_AND_CLEAR: Waiting for 'event->flags' & 'flags' == 'flags', clear 'event->flags' after success.
99  * opt = RHINO_OR: Waiting for 'event->flags' & 'flags' != 0, do not clear 'event->flags' after success.
100  * opt = RHINO_OR_CLEAR: Waiting for 'event->flags' & 'flags' != 0, clear 'event->flags' after success.
101  *
102  * @param[in]   event       pointer to the event
103  * @param[in]   flags       which is provided by users
104  * @param[in]   opt         could be RHINO_AND, RHINO_AND_CLEAR, RHINO_OR, RHINO_OR_CLEAR
105  * @param[out]  actl_flags  the actually flag where flags is satisfied
106  * @param[in]   ticks       ticks to wait before getting success
107  *
108  * @return  the operation status, RHINO_SUCCESS is OK, others is error
109  */
110 kstat_t krhino_event_get(kevent_t *event, uint32_t flags, uint8_t opt,
111                          uint32_t *actl_flags, tick_t ticks);
112 
113 /**
114  * Set a event
115  * opt = RHINO_AND: Clear some bit in 'event->flags', 'event->flags' &= 'flags'.
116  * opt = RHINO_OR: Set some bit in 'event->flags', 'event->flags' |= 'flags', may invoke other waiting task
117  *
118  * @param[in]  event  pointer to a event
119  * @param[in]  flags  which users want to be set
120  * @param[in]  opt    could be RHINO_AND, RHINO_OR
121  *
122  * @return  the operation status, RHINO_SUCCESS is OK, others is error
123  */
124 kstat_t krhino_event_set(kevent_t *event, uint32_t flags, uint8_t opt);
125 
126 /** @} */
127 
128 #ifdef __cplusplus
129 }
130 #endif
131 
132 #endif /* K_EVENT_H */
133 
134