blob: 34a23af75aab1d3f6886f5721cff2c3e76505644 [file] [log] [blame]
rjw1f884582022-01-06 17:20:42 +08001#include <arch/sys_arch.h>
2#include <lwip/err.h>
3#include <lwip/sys.h>
4#include <platform.h>
5#include <assert.h>
6#include <trace.h>
7#include <err.h>
8#include <stdbool.h>
9#include <lk/init.h>
10
11#define LOCAL_TRACE 1
12
13void sys_init(void)
14{
15}
16
17sys_thread_t sys_thread_new(const char *name, lwip_thread_fn func, void *arg, int stacksize, int prio)
18{
19 thread_t *t = thread_create(name, (void*) func, arg, prio, stacksize);
20 DEBUG_ASSERT(t);
21
22 thread_detach(t);
23 thread_resume(t);
24
25 return t;
26}
27
28err_t sys_sem_new(sys_sem_t *sem, u8_t count)
29{
30 sem_init(sem, count);
31 return ERR_OK;
32}
33
34void sys_sem_free(sys_sem_t * sem)
35{
36 sem_destroy(sem);
37}
38
39int sys_sem_valid(sys_sem_t *sem)
40{
41 return sem->magic == SEMAPHORE_MAGIC;
42}
43
44void sys_sem_set_invalid(sys_sem_t *sem)
45{
46 // sem_destroy() does this
47}
48
49void sys_sem_signal(sys_sem_t * sem)
50{
51 sem_post(sem, true);
52}
53
54u32_t sys_arch_sem_wait(sys_sem_t * sem, u32_t timeout)
55{
56 lk_time_t start = current_time();
57
58 status_t err = sem_timedwait(sem, timeout ? timeout : INFINITE_TIME);
59 if (err == ERR_TIMED_OUT)
60 return SYS_ARCH_TIMEOUT;
61
62 return current_time() - start;
63}
64
65err_t sys_mbox_new(sys_mbox_t * mbox, int size)
66{
67 sem_init(&mbox->empty, size);
68 sem_init(&mbox->full, 0);
69 mutex_init(&mbox->lock);
70
71 mbox->magic = MBOX_MAGIC;
72 mbox->head = 0;
73 mbox->tail = 0;
74 mbox->size = size;
75
76 mbox->queue = calloc(size, sizeof(void *));
77 if (!mbox->queue)
78 return ERR_MEM;
79
80 return ERR_OK;
81}
82
83void sys_mbox_free(sys_mbox_t *mbox)
84{
85 free(mbox->queue);
86 mbox->queue = NULL;
87}
88
89void sys_mbox_post(sys_mbox_t * mbox, void *msg)
90{
91 sem_wait(&mbox->empty);
92 mutex_acquire(&mbox->lock);
93
94 mbox->queue[mbox->head] = msg;
95 mbox->head = (mbox->head + 1) % mbox->size;
96
97 mutex_release(&mbox->lock);
98 sem_post(&mbox->full, true);
99}
100
101u32_t sys_arch_mbox_tryfetch(sys_mbox_t * mbox, void **msg)
102{
103 //LTRACE_ENTRY;
104
105 status_t res;
106
107 res = sem_trywait(&mbox->full);
108 if (res == ERR_NOT_READY) {
109 //LTRACE_EXIT;
110 return SYS_MBOX_EMPTY;
111 }
112
113 mutex_acquire(&mbox->lock);
114
115 *msg = mbox->queue[mbox->tail];
116 mbox->tail = (mbox->tail + 1) % mbox->size;
117
118 mutex_release(&mbox->lock);
119 sem_post(&mbox->empty, true);
120
121 //LTRACE_EXIT;
122 return 0;
123}
124
125u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
126{
127 //LTRACE_ENTRY;
128
129 status_t res;
130 lk_time_t start = current_time();
131
132 res = sem_timedwait(&mbox->full, timeout ? timeout : INFINITE_TIME);
133 if (res == ERR_TIMED_OUT) {
134 //LTRACE_EXIT;
135 return SYS_ARCH_TIMEOUT; //timeout ? SYS_ARCH_TIMEOUT : 0;
136 }
137
138 mutex_acquire(&mbox->lock);
139
140 *msg = mbox->queue[mbox->tail];
141 mbox->tail = (mbox->tail + 1) % mbox->size;
142
143 mutex_release(&mbox->lock);
144 sem_post(&mbox->empty, true);
145
146 //LTRACE_EXIT;
147 return current_time() - start;
148}
149
150err_t sys_mbox_trypost(sys_mbox_t * mbox, void *msg)
151{
152 status_t res;
153
154 res = sem_trywait(&mbox->empty);
155 if (res == ERR_NOT_READY)
156 return ERR_TIMEOUT;
157
158 mutex_acquire(&mbox->lock);
159
160 mbox->queue[mbox->head] = msg;
161 mbox->head = (mbox->head + 1) % mbox->size;
162
163 mutex_release(&mbox->lock);
164 sem_post(&mbox->full, true);
165
166 return ERR_OK;
167}
168
169int sys_mbox_valid(sys_mbox_t *mbox)
170{
171 return mbox->magic == MBOX_MAGIC;
172}
173
174void sys_mbox_set_invalid(sys_mbox_t *mbox)
175{
176 mbox->magic = 'xobm';
177}
178
179err_t sys_mutex_new(sys_mutex_t *mutex)
180{
181 mutex_init(mutex);
182 return ERR_OK;
183}
184
185void sys_mutex_lock(sys_mutex_t *mutex)
186{
187 mutex_acquire(mutex);
188}
189
190void sys_mutex_unlock(sys_mutex_t *mutex)
191{
192 mutex_release(mutex);
193}
194
195void sys_mutex_free(sys_mutex_t *mutex)
196{
197 mutex_destroy(mutex);
198}
199
200/* run lwip init as soon as threads are running */
201void lwip_init_hook(uint level)
202{
203 tcpip_init(NULL, NULL);
204}
205
206LK_INIT_HOOK(lwip, &lwip_init_hook, LK_INIT_LEVEL_THREADING);
207