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