Skip to content

Commit a169268

Browse files
committed
Use waitQueue in userMutex, improve namings
1 parent 6472a13 commit a169268

File tree

5 files changed

+18
-62
lines changed

5 files changed

+18
-62
lines changed

applications/libps2/src/ps2.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,24 +55,24 @@ ps2_status_t ps2Initialize(void (*mouseCallback)(int16_t, int16_t, uint8_t, int8
5555
g_irq_create_redirect(1, 1);
5656
g_irq_create_redirect(12, 12);
5757

58-
g_create_task_a((void*) &ps2ReadKeyIrq, 0);
59-
g_create_task_a((void*) &ps2ReadMouseIrq, 0);
58+
g_create_task_a((void*) &ps2AwaitKeyIrq, 0);
59+
g_create_task_a((void*) &ps2AwaitMouseIrq, 0);
6060
return G_PS2_STATUS_SUCCESS;
6161
}
6262

63-
void ps2ReadKeyIrq()
63+
void ps2AwaitKeyIrq()
6464
{
65-
g_task_register_id("libps2/read-key");
65+
g_task_register_id("libps2/await-key");
6666
for(;;)
6767
{
6868
g_await_irq_t(1, 50);
6969
ps2CheckForData();
7070
}
7171
}
7272

73-
void ps2ReadMouseIrq()
73+
void ps2AwaitMouseIrq()
7474
{
75-
g_task_register_id("libps2/read-mouse");
75+
g_task_register_id("libps2/await-mouse");
7676
for(;;)
7777
{
7878
g_await_irq_t(12, 50);

applications/libps2/src/ps2_intern.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,13 @@ void ps2HandleMouseData(uint8_t value);
6161
int ps2WriteToMouse(uint8_t value);
6262

6363
/**
64-
* Reads IRQs from the key IRQ device.
64+
* Awaits IRQs from the key IRQ device.
6565
*/
66-
void ps2ReadKeyIrq();
66+
void ps2AwaitKeyIrq();
6767

6868
/**
69-
* Reads IRQs from the mouse IRQ device.
69+
* Awaits IRQs from the mouse IRQ device.
7070
*/
71-
void ps2ReadMouseIrq();
71+
void ps2AwaitMouseIrq();
7272

7373
#endif

kernel/src/kernel/calls/syscall_system.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,17 +126,17 @@ void syscallAwaitIrq(g_task* task, g_syscall_await_irq* data)
126126

127127
requestsSetHandlerTask(data->irq, task->id);
128128

129-
if(data->timeout)
130-
clockUnwaitForTime(task->id);
131-
132129
INTERRUPTS_PAUSE;
133130
mutexAcquire(&task->lock);
134131
task->status = G_TASK_STATUS_WAITING;
135132
task->waitsFor = "irq";
136133
mutexRelease(&task->lock);
137134

138135
if(data->timeout)
136+
{
137+
clockUnwaitForTime(task->id);
139138
clockWaitForTime(task->id, clockGetLocal()->time + data->timeout);
139+
}
140140

141141
taskingYield();
142142
INTERRUPTS_RESUME;

kernel/src/kernel/tasking/user_mutex.cpp

Lines changed: 4 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ g_user_mutex userMutexCreate(bool reentrant)
4444
g_user_mutex_entry* entry = (g_user_mutex_entry*) heapAllocate(sizeof(g_user_mutex_entry));
4545
mutexInitializeTask(&entry->lock, __func__);
4646
entry->value = 0;
47-
entry->waiters = nullptr;
47+
waitQueueInitialize(&entry->waiters);
4848
entry->reentrant = reentrant;
4949
entry->owner = -1;
5050

@@ -206,14 +206,7 @@ void userMutexWaitForAcquire(g_user_mutex mutex, g_tid task)
206206
return;
207207
}
208208

209-
mutexAcquire(&entry->lock);
210-
211-
auto waiter = (g_user_mutex_waiter*) heapAllocate(sizeof(g_user_mutex_waiter));
212-
waiter->task = task;
213-
waiter->next = entry->waiters;
214-
entry->waiters = waiter;
215-
216-
mutexRelease(&entry->lock);
209+
waitQueueAdd(&entry->waiters, task);
217210
}
218211

219212
void userMutexUnwaitForAcquire(g_user_mutex mutex, g_tid task)
@@ -225,41 +218,10 @@ void userMutexUnwaitForAcquire(g_user_mutex mutex, g_tid task)
225218
return;
226219
}
227220

228-
mutexAcquire(&entry->lock);
229-
230-
g_user_mutex_waiter* prev = nullptr;
231-
g_user_mutex_waiter* waiter = entry->waiters;
232-
while(waiter)
233-
{
234-
if(waiter->task == task)
235-
{
236-
auto next = waiter->next;
237-
if(prev)
238-
prev->next = next;
239-
else
240-
entry->waiters = next;
241-
242-
heapFree(waiter);
243-
break;
244-
}
245-
prev = waiter;
246-
waiter = waiter->next;
247-
}
248-
249-
mutexRelease(&entry->lock);
221+
waitQueueRemove(&entry->waiters, task);
250222
}
251223

252224
void _userMutexWakeWaitingTasks(g_user_mutex_entry* entry)
253225
{
254-
auto waiter = entry->waiters;
255-
while(waiter)
256-
{
257-
g_task* wakeTask = taskingGetById(waiter->task);
258-
taskingWake(wakeTask);
259-
260-
auto next = waiter->next;
261-
heapFree(waiter);
262-
waiter = next;
263-
}
264-
entry->waiters = nullptr;
226+
waitQueueWake(&entry->waiters);
265227
}

kernel/src/kernel/tasking/user_mutex.hpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,6 @@
2626
#include <ghost/tasks/types.h>
2727
#include <ghost/mutex/types.h>
2828

29-
struct g_user_mutex_waiter
30-
{
31-
g_tid task;
32-
g_user_mutex_waiter* next;
33-
};
34-
3529
struct g_user_mutex_entry
3630
{
3731
g_mutex lock;
@@ -40,7 +34,7 @@ struct g_user_mutex_entry
4034
bool reentrant;
4135
g_tid owner;
4236

43-
g_user_mutex_waiter* waiters;
37+
g_wait_queue waiters;
4438
};
4539

4640
typedef uint32_t g_user_mutex_status;

0 commit comments

Comments
 (0)