summaryrefslogtreecommitdiff
path: root/core/lwip/src/arch/sys_arch.c
blob: 4081d01ea191dc1997065c41ff85c3f3e590779f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "arch/sys_arch.h"
#include "lwip/sys.h"
#include "lwip/mem.h"
#include <stdlib.h>
#include <thread.h>

void sys_init(void)
{
}

err_t sys_sem_new(sys_sem_t *sem, u8_t count)
{
    if (!sem)
	return EINVAL;
    *sem = malloc(sizeof(struct semaphore));
    if (!*sem)
	return ENOMEM;

    sem_init(*sem, count);
    return 0;
}

void sys_sem_free(sys_sem_t *sem)
{
    if (!!sem && !!*sem) {
	sys_sem_set_invalid(sem);
	free(*sem);
	*sem = NULL;
    }
}

void sys_sem_set_invalid(sys_sem_t *sem)
{
    if (!sem || !*sem)
	return;
    sem_set_invalid(*sem);
}


int sys_sem_valid(sys_sem_t *sem)
{
    if (!sem || !*sem)
	return 0;
    return sem_is_valid(*sem);
}

u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
{
    mstime_t rv;

    if (!sem || !*sem)
	return SYS_ARCH_TIMEOUT;
    rv = sem_down(*sem, timeout);
    if (rv == (mstime_t)-1)
	return SYS_ARCH_TIMEOUT;
    else
	return rv;
}

err_t sys_mbox_new(sys_mbox_t *mbox, int size)
{
    if (!mbox)
	return EINVAL;
    *mbox = malloc(MBOX_BYTES(size));
    if (!(*mbox))
	return ENOMEM;

    mbox_init(*mbox, size);
    return 0;
}

void sys_mbox_free(sys_mbox_t *mbox)
{
    if (!!mbox && !!*mbox) {
	sys_mbox_set_invalid(mbox);
	free(*mbox);
	*mbox = NULL;
    }
}

void sys_mbox_post(sys_mbox_t *mbox, void *msg)
{
    if (!!mbox)
	mbox_post(*mbox, msg, 0);
}

err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
{
    if (!mbox)
	return EINVAL;
    return mbox_post(*mbox, msg, -1);
}

u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
{
    mstime_t rv;

    if (!mbox)
	return SYS_MBOX_EMPTY;
    rv = mbox_fetch(*mbox, msg, timeout);
    if (rv == (mstime_t)-1)
	return SYS_ARCH_TIMEOUT;
    else
	return rv;
}

u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
{
    if (!mbox)
	return SYS_MBOX_EMPTY;
    return mbox_fetch(*mbox, msg, -1);
}

void sys_mbox_set_invalid(sys_mbox_t *mbox)
{
    if (!!mbox)
	mbox_set_invalid(*mbox);
}

int sys_mbox_valid(sys_mbox_t *mbox)
{
    return ((!!mbox) && mbox_is_valid(*mbox));
}


sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread,
			    void *arg, int stacksize, int prio)
{
    return start_thread(name, stacksize, prio, thread, arg);
}