add wq[Init|Free]
This commit is contained in:
parent
e8959f3693
commit
c71b0135cf
@ -6,21 +6,18 @@
|
|||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "time.h"
|
#include "time.h"
|
||||||
|
|
||||||
struct wait_queue *waitQueues = NULL;
|
|
||||||
|
|
||||||
int mutexInit(struct mutex *m)
|
int mutexInit(struct mutex *m)
|
||||||
{
|
{
|
||||||
uint32_t flags;
|
|
||||||
|
|
||||||
m->owner = NULL;
|
m->owner = NULL;
|
||||||
m->wait = (struct wait_queue *)malloc(sizeof(struct wait_queue));
|
m->wait = (struct wait_queue *)malloc(sizeof(struct wait_queue));
|
||||||
if (!m->wait)
|
if (!m->wait)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
|
|
||||||
|
waitQueueInit(m->wait);
|
||||||
list_init(m->wait->thread);
|
list_init(m->wait->thread);
|
||||||
|
|
||||||
disable_IRQs(flags);
|
|
||||||
list_add_tail(waitQueues, m->wait);
|
|
||||||
restore_IRQs(flags);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -40,7 +37,7 @@ int mutexFree(struct mutex *m)
|
|||||||
getCurrentThread());
|
getCurrentThread());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
list_delete(waitQueues, m->wait);
|
waitQueueFree(m->wait);
|
||||||
free(m->wait);
|
free(m->wait);
|
||||||
} else {
|
} else {
|
||||||
ret = EBUSY;
|
ret = EBUSY;
|
||||||
@ -76,7 +73,7 @@ int mutexUnlock(struct mutex *m)
|
|||||||
|
|
||||||
m->owner = NULL;
|
m->owner = NULL;
|
||||||
|
|
||||||
wake_up(m->wait);
|
wakeUp(m->wait);
|
||||||
|
|
||||||
restore_IRQs(flags);
|
restore_IRQs(flags);
|
||||||
|
|
||||||
|
22
core/wait.c
22
core/wait.c
@ -3,7 +3,27 @@
|
|||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
|
|
||||||
int wake_up(struct wait_queue *wq)
|
static struct wait_queue *waitQueues = NULL;
|
||||||
|
|
||||||
|
int waitQueueInit(struct wait_queue *wq)
|
||||||
|
{
|
||||||
|
uint32_t flags;
|
||||||
|
disable_IRQs(flags);
|
||||||
|
list_add_tail(waitQueues, wq);
|
||||||
|
restore_IRQs(flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int waitQueueFree(struct wait_queue *wq)
|
||||||
|
{
|
||||||
|
uint32_t flags;
|
||||||
|
disable_IRQs(flags);
|
||||||
|
list_delete(waitQueues, wq);
|
||||||
|
restore_IRQs(flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wakeUp(struct wait_queue *wq)
|
||||||
{
|
{
|
||||||
struct kthread *th;
|
struct kthread *th;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
@ -16,9 +16,11 @@ struct wait_queue {
|
|||||||
#define DECLARE_WAITQUEUE(name) \
|
#define DECLARE_WAITQUEUE(name) \
|
||||||
struct wait_queue name = __WAITQUEUE_INITIALIZER(name)
|
struct wait_queue name = __WAITQUEUE_INITIALIZER(name)
|
||||||
|
|
||||||
|
int waitQueueInit(struct wait_queue *);
|
||||||
|
int waitQueueFree(struct wait_queue *);
|
||||||
int wait(struct wait_queue *);
|
int wait(struct wait_queue *);
|
||||||
int waitTimeout(struct wait_queue *wq, unsigned long msec);
|
int waitTimeout(struct wait_queue *wq, unsigned long msec);
|
||||||
int wake_up(struct wait_queue *);
|
int wakeUp(struct wait_queue *);
|
||||||
|
|
||||||
#define wait_event(wq, condition) \
|
#define wait_event(wq, condition) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -274,7 +274,9 @@ void wqThread(void *arg)
|
|||||||
{
|
{
|
||||||
(void)arg;
|
(void)arg;
|
||||||
DECLARE_WAITQUEUE(test);
|
DECLARE_WAITQUEUE(test);
|
||||||
|
waitQueueInit(&test);
|
||||||
assert(waitTimeout(&test, 1000) == 1);
|
assert(waitTimeout(&test, 1000) == 1);
|
||||||
|
waitQueueFree(&test);
|
||||||
haveTimeout = 1;
|
haveTimeout = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user