xref: /nrf52832-nimble/packages/NimBLE-latest/porting/npl/linux/src/os_eventq.cc (revision 042d53a763ad75cb1465103098bb88c245d95138)
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements.  See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership.  The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License.  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,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied.  See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19 
20 #include <assert.h>
21 #include <stdint.h>
22 #include <string.h>
23 
24 #include "nimble/nimble_npl.h"
25 #include "wqueue.h"
26 
27 extern "C" {
28 
29 typedef wqueue<ble_npl_event *> wqueue_t;
30 
31 static struct ble_npl_eventq dflt_evq;
32 
33 struct ble_npl_eventq *
ble_npl_eventq_dflt_get(void)34 ble_npl_eventq_dflt_get(void)
35 {
36     if (!dflt_evq.q) {
37         dflt_evq.q = new wqueue_t();
38     }
39 
40     return &dflt_evq;
41 }
42 
43 void
ble_npl_eventq_init(struct ble_npl_eventq * evq)44 ble_npl_eventq_init(struct ble_npl_eventq *evq)
45 {
46     evq->q = new wqueue_t();
47 }
48 
49 bool
ble_npl_eventq_is_empty(struct ble_npl_eventq * evq)50 ble_npl_eventq_is_empty(struct ble_npl_eventq *evq)
51 {
52     wqueue_t *q = static_cast<wqueue_t *>(evq->q);
53 
54     if (q->size()) {
55         return 1;
56     } else {
57         return 0;
58     }
59 }
60 
61 int
ble_npl_eventq_inited(const struct ble_npl_eventq * evq)62 ble_npl_eventq_inited(const struct ble_npl_eventq *evq)
63 {
64     return (evq->q != NULL);
65 }
66 
67 void
ble_npl_eventq_put(struct ble_npl_eventq * evq,struct ble_npl_event * ev)68 ble_npl_eventq_put(struct ble_npl_eventq *evq, struct ble_npl_event *ev)
69 {
70     wqueue_t *q = static_cast<wqueue_t *>(evq->q);
71 
72     if (ev->ev_queued) {
73         return;
74     }
75 
76     ev->ev_queued = 1;
77     q->put(ev);
78 }
79 
ble_npl_eventq_get(struct ble_npl_eventq * evq,ble_npl_time_t tmo)80 struct ble_npl_event *ble_npl_eventq_get(struct ble_npl_eventq *evq,
81                                          ble_npl_time_t tmo)
82 {
83     struct ble_npl_event *ev;
84     wqueue_t *q = static_cast<wqueue_t *>(evq->q);
85 
86     ev = q->get(tmo);
87 
88     if (ev) {
89         ev->ev_queued = 0;
90     }
91 
92     return ev;
93 }
94 
95 void
ble_npl_eventq_run(struct ble_npl_eventq * evq)96 ble_npl_eventq_run(struct ble_npl_eventq *evq)
97 {
98     struct ble_npl_event *ev;
99 
100     ev = ble_npl_eventq_get(evq, BLE_NPL_TIME_FOREVER);
101     ble_npl_event_run(ev);
102 }
103 
104 
105 // ========================================================================
106 //                         Event Implementation
107 // ========================================================================
108 
109 void
ble_npl_event_init(struct ble_npl_event * ev,ble_npl_event_fn * fn,void * arg)110 ble_npl_event_init(struct ble_npl_event *ev, ble_npl_event_fn *fn,
111                    void *arg)
112 {
113     memset(ev, 0, sizeof(*ev));
114     ev->ev_cb = fn;
115     ev->ev_arg = arg;
116 }
117 
118 bool
ble_npl_event_is_queued(struct ble_npl_event * ev)119 ble_npl_event_is_queued(struct ble_npl_event *ev)
120 {
121     return ev->ev_queued;
122 }
123 
124 void *
ble_npl_event_get_arg(struct ble_npl_event * ev)125 ble_npl_event_get_arg(struct ble_npl_event *ev)
126 {
127     return ev->ev_arg;
128 }
129 
130 void
ble_npl_event_set_arg(struct ble_npl_event * ev,void * arg)131 ble_npl_event_set_arg(struct ble_npl_event *ev, void *arg)
132 {
133     ev->ev_arg = arg;
134 }
135 
136 void
ble_npl_event_run(struct ble_npl_event * ev)137 ble_npl_event_run(struct ble_npl_event *ev)
138 {
139     assert(ev->ev_cb != NULL);
140 
141     ev->ev_cb(ev);
142 }
143 
144 }
145