1#include "arch/sys_arch.h"
2#include "lwip/sys.h"
3#include "lwip/mem.h"
4#include <stdlib.h>
5#include <thread.h>
6
7void sys_init(void)
8{
9}
10
11err_t sys_sem_new(sys_sem_t *sem, u8_t count)
12{
13    if (!sem)
14	return EINVAL;
15    *sem = malloc(sizeof(struct semaphore));
16    if (!*sem)
17	return ENOMEM;
18
19    sem_init(*sem, count);
20    return 0;
21}
22
23void sys_sem_free(sys_sem_t *sem)
24{
25    if (!!sem && !!*sem) {
26	sys_sem_set_invalid(sem);
27	free(*sem);
28	*sem = NULL;
29    }
30}
31
32void sys_sem_set_invalid(sys_sem_t *sem)
33{
34    if (!sem || !*sem)
35	return;
36    sem_set_invalid(*sem);
37}
38
39
40int sys_sem_valid(sys_sem_t *sem)
41{
42    if (!sem || !*sem)
43	return 0;
44    return sem_is_valid(*sem);
45}
46
47u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
48{
49    mstime_t rv;
50
51    if (!sem || !*sem)
52	return SYS_ARCH_TIMEOUT;
53    rv = sem_down(*sem, timeout);
54    if (rv == (mstime_t)-1)
55	return SYS_ARCH_TIMEOUT;
56    else
57	return rv;
58}
59
60err_t sys_mbox_new(sys_mbox_t *mbox, int size)
61{
62    if (!mbox)
63	return EINVAL;
64    *mbox = malloc(MBOX_BYTES(size));
65    if (!(*mbox))
66	return ENOMEM;
67
68    mbox_init(*mbox, size);
69    return 0;
70}
71
72void sys_mbox_free(sys_mbox_t *mbox)
73{
74    if (!!mbox && !!*mbox) {
75	sys_mbox_set_invalid(mbox);
76	free(*mbox);
77	*mbox = NULL;
78    }
79}
80
81void sys_mbox_post(sys_mbox_t *mbox, void *msg)
82{
83    if (!!mbox)
84	mbox_post(*mbox, msg, 0);
85}
86
87err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
88{
89    if (!mbox)
90	return EINVAL;
91    return mbox_post(*mbox, msg, -1);
92}
93
94u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
95{
96    mstime_t rv;
97
98    if (!mbox)
99	return SYS_MBOX_EMPTY;
100    rv = mbox_fetch(*mbox, msg, timeout);
101    if (rv == (mstime_t)-1)
102	return SYS_ARCH_TIMEOUT;
103    else
104	return rv;
105}
106
107u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
108{
109    if (!mbox)
110	return SYS_MBOX_EMPTY;
111    return mbox_fetch(*mbox, msg, -1);
112}
113
114void sys_mbox_set_invalid(sys_mbox_t *mbox)
115{
116    if (!!mbox)
117	mbox_set_invalid(*mbox);
118}
119
120int sys_mbox_valid(sys_mbox_t *mbox)
121{
122    return ((!!mbox) && mbox_is_valid(*mbox));
123}
124
125
126sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread,
127			    void *arg, int stacksize, int prio)
128{
129    return start_thread(name, stacksize, prio, thread, arg);
130}
131
132