CS350 COS
COS
Loading...
Searching...
No Matches
waitchannel.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2023 Ali Mashtizadeh
3 * All rights reserved.
4 */
5
6#include <stdbool.h>
7#include <stdint.h>
8#include <string.h>
9
10#include <sys/cdefs.h>
11#include <sys/kassert.h>
12#include <sys/kdebug.h>
13#include <sys/queue.h>
14#include <sys/thread.h>
15#include <sys/spinlock.h>
16#include <sys/waitchannel.h>
17
19LIST_HEAD(ChanListHead, WaitChannel) chanList = LIST_HEAD_INITIALIZER(chanList);
20
21void
23{
24 Spinlock_Init(&chanListLock, "WaitChannel List", SPINLOCK_TYPE_NORMAL);
25}
26
27void
28WaitChannel_Init(WaitChannel *wchan, const char *name)
29{
30 TAILQ_INIT(&wchan->chanQueue);
31 strncpy(&wchan->name[0], name, WAITCHANNEL_NAMELEN);
33
35 LIST_INSERT_HEAD(&chanList, wchan, chanList);
37}
38
39void
41{
42 ASSERT(TAILQ_EMPTY(&wchan->chanQueue));
43
45 LIST_REMOVE(wchan, chanList);
47
48 Spinlock_Destroy(&wchan->lock);
49}
50
56void
58{
59 Spinlock_Lock(&wchan->lock);
60}
61
70void
72{
73 Thread *thr = Sched_Current();
74
76 TAILQ_INSERT_TAIL(&wchan->chanQueue, thr, chanQueue);
77 Spinlock_Unlock(&wchan->lock);
78
80}
81
90void
92{
93 Thread *thr;
94
95 Spinlock_Lock(&wchan->lock);
96
97 thr = TAILQ_FIRST(&wchan->chanQueue);
98 if (thr != NULL) {
99 TAILQ_REMOVE(&wchan->chanQueue, thr, chanQueue);
101 Thread_Release(thr);
102 }
103
104 Spinlock_Unlock(&wchan->lock);
105}
106
115void
117{
118 Thread *thr;
119 Thread *thrTemp;
120
121 Spinlock_Lock(&wchan->lock);
122
123 TAILQ_FOREACH_SAFE(thr, &wchan->chanQueue, chanQueue, thrTemp) {
124 TAILQ_REMOVE(&wchan->chanQueue, thr, chanQueue);
126 Thread_Release(thr);
127 }
128
129 Spinlock_Unlock(&wchan->lock);
130}
131
void Sched_SetWaiting(Thread *thr)
Definition: sched.c:104
void Sched_Scheduler()
Definition: sched.c:189
void Thread_Release(Thread *thr)
Definition: thread.c:265
void Sched_SetRunnable(Thread *thr)
Definition: sched.c:77
Thread * Sched_Current()
Definition: sched.c:56
#define ASSERT(_x)
Definition: kassert.h:8
#define TAILQ_FOREACH_SAFE(var, head, field, tvar)
Definition: queue.h:567
#define TAILQ_INIT(head)
Definition: queue.h:597
#define LIST_REMOVE(elm, field)
Definition: queue.h:465
#define TAILQ_INSERT_TAIL(head, elm, field)
Definition: queue.h:641
#define LIST_HEAD_INITIALIZER(head)
Definition: queue.h:368
#define TAILQ_FIRST(head)
Definition: queue.h:555
#define TAILQ_REMOVE(head, elm, field)
Definition: queue.h:659
#define TAILQ_EMPTY(head)
Definition: queue.h:553
#define LIST_INSERT_HEAD(head, elm, field)
Definition: queue.h:451
#define LIST_HEAD(name, type)
Definition: queue.h:363
void Spinlock_Unlock(Spinlock *lock) __UNLOCK_EX(*lock)
Definition: spinlock.c:109
#define SPINLOCK_TYPE_NORMAL
Definition: spinlock.h:12
void Spinlock_Destroy(Spinlock *lock)
Definition: spinlock.c:61
void Spinlock_Lock(Spinlock *lock) __LOCK_EX(*lock)
Definition: spinlock.c:75
void Spinlock_Init(Spinlock *lock, const char *name, uint64_t type)
Definition: spinlock.c:43
#define NULL
Definition: stddef.h:6
char * strncpy(char *to, const char *from, size_t len)
Definition: string.c:34
Definition: thread.h:31
Spinlock lock
Definition: waitchannel.h:12
char name[WAITCHANNEL_NAMELEN]
Definition: waitchannel.h:13
void WaitChannel_Init(WaitChannel *wchan, const char *name)
Definition: waitchannel.c:28
void WaitChannel_WakeAll(WaitChannel *wchan)
Definition: waitchannel.c:116
void WaitChannel_Wake(WaitChannel *wchan)
Definition: waitchannel.c:91
Spinlock chanListLock
Definition: waitchannel.c:18
void WaitChannel_Lock(WaitChannel *wchan)
Definition: waitchannel.c:57
void WaitChannel_Sleep(WaitChannel *wchan)
Definition: waitchannel.c:71
void WaitChannel_Destroy(WaitChannel *wchan)
Definition: waitchannel.c:40
#define WAITCHANNEL_NAMELEN
Definition: waitchannel.h:8
void WaitChannel_EarlyInit()