assume ping and pong thread was create, and have following code.
ping_thread
__USER_TEXT
void *ping_thread(void *arg)
{
pthread_mutex_lock(&p);
printf("PING...\n");
value = 10;
L4_Sleep(L4_TimePeriod(1000 * 1000));
printf("I'm a sleepy man\n");
pthread_mutex_unlock(&p);
return NULL;
}
pong_thread
__USER_TEXT
void *pong_thread(void *arg)
{
pthread_mutex_lock(&p);
value = 20;
printf("PONG...\n");
pthread_mutex_unlock(&p);
return NULL;
}
main
pager_start_thread(threads[PING_THREAD], ping_thread, NULL);
pager_start_thread(threads[PONG_THREAD], pong_thread, NULL);
we will get this result, after pong acquire mutex, it stuck in busy loop.
====================================================
Copyright(C) 2013-2014 The F9 Microkernel Project
====================================================
Git head: 58348872e98a7f833cd07690b086d7fa5abd8151
Host: x86_64
Build: 2016-10-04T21:50:39+0800
Press '?' to print KDB menu
PING: 10 1
## KDB ##
but if I add sleep for test, it work again.
__USER_TEXT int pthread_mutex_lock(pthread_mutex_t *mutex)
{
/* Busy trying */
while (pthread_mutex_trylock(mutex)) {
L4_Sleep(L4_TimePeriod(1000));
}
return 0;
}
result
====================================================
Copyright(C) 2013-2014 The F9 Microkernel Project
====================================================
Git head: 58348872e98a7f833cd07690b086d7fa5abd8151
Host: x86_64
Build: 2016-10-04T21:50:39+0800
Press '?' to print KDB menu
PING: 10 1
I'm a sleepy man
PONG: 20 1
## KDB ##
I'll try to fix this. or maybe this just a recursive lock?
assume ping and pong thread was create, and have following code.
ping_thread
pong_thread
main
we will get this result, after pong acquire mutex, it stuck in busy loop.
but if I add sleep for test, it work again.
result
I'll try to fix this. or maybe this just a recursive lock?