As follow-up to the rework of thread-handling, likewise also the implementation base for locking was switched over from direct usage of POSIX primitives to the portable wrappers available in the C++ standard library. All usages have been reviewed and modernised to prefer λ-functions where possible. With this series of changes, the old threadpool implementation and a lot of further low-level support facilities are not used any more and can be dismantled. Due to the integration efforts spurred by the »Playback Vertical Slice«, several questions of architecture could be decided over the last months. The design of the Scheduler and Engine turned out different than previously anticipated; notably the Scheduler now covers a wider array of functionality, including some asynchronous messaging. This has ramifications for the organisation of work tasks and threads, and leads to a more deterministic memory management. Resource management will be done on a higher level, partially superseding some of the concepts from the early phase of the Lumiera project.
182 lines
4.5 KiB
C
182 lines
4.5 KiB
C
/*
|
|
TEST-LOCKING - test locking functions
|
|
|
|
Copyright (C) Lumiera.org
|
|
2008, Christian Thaeter <ct@pipapo.org>
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 of
|
|
the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
* *****************************************************/
|
|
|
|
/** @file test-locking.c
|
|
** C unit test to cover convenience setup for POSIX locking primitives
|
|
** These convenience macros are intended for use in low-level C code,
|
|
** where minimal and precise locking is relevant for performance reasons.
|
|
** @see mutex.h
|
|
** @see condition.h
|
|
*/
|
|
|
|
|
|
#include "lib/test/test.h"
|
|
#include "lib/mutex.h"
|
|
#include "lib/recmutex.h"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
TESTS_BEGIN
|
|
|
|
|
|
TEST (mutexsection)
|
|
{
|
|
lumiera_mutex m;
|
|
lumiera_mutex_init (&m, "mutexsection", &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
|
|
LUMIERA_MUTEX_SECTION (NOBUG_ON, &m)
|
|
{
|
|
printf ("mutex locked section 1\n");
|
|
}
|
|
|
|
LUMIERA_MUTEX_SECTION (NOBUG_ON, &m)
|
|
{
|
|
printf ("mutex locked section 2\n");
|
|
}
|
|
|
|
lumiera_mutex_destroy (&m, &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
}
|
|
|
|
|
|
TEST (mutexforgotunlock)
|
|
{
|
|
lumiera_mutex m;
|
|
lumiera_mutex_init (&m, "mutexforgotunlock", &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
|
|
LUMIERA_MUTEX_SECTION (NOBUG_ON, &m)
|
|
{
|
|
break; // MUTEX_SECTIONS must not be left by a jump
|
|
}
|
|
|
|
lumiera_mutex_destroy (&m, &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
}
|
|
|
|
|
|
TEST (mutexexplicitunlock)
|
|
{
|
|
lumiera_mutex m;
|
|
lumiera_mutex_init (&m, "mutexforgotunlock", &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
|
|
LUMIERA_MUTEX_SECTION (NOBUG_ON, &m)
|
|
{
|
|
ECHO("mutex locked section");
|
|
LUMIERA_MUTEX_SECTION_UNLOCK;
|
|
break;
|
|
}
|
|
|
|
lumiera_mutex_destroy (&m, &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
}
|
|
|
|
|
|
TEST (nestedmutexsection)
|
|
{
|
|
lumiera_mutex m;
|
|
lumiera_mutex_init (&m, "m_mutexsection", &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
|
|
lumiera_mutex n;
|
|
lumiera_mutex_init (&n, "n_mutexsection", &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
|
|
LUMIERA_MUTEX_SECTION (NOBUG_ON, &m)
|
|
{
|
|
printf ("outer mutex locked section\n");
|
|
|
|
LUMIERA_MUTEX_SECTION (NOBUG_ON, &n)
|
|
{
|
|
printf ("inner mutex locked section\n");
|
|
}
|
|
}
|
|
|
|
lumiera_mutex_destroy (&n, &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
lumiera_mutex_destroy (&m, &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
}
|
|
|
|
TEST (chainedmutexsection)
|
|
{
|
|
lumiera_mutex m;
|
|
lumiera_mutex_init (&m, "m_mutexsection", &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
|
|
lumiera_mutex n;
|
|
lumiera_mutex_init (&n, "n_mutexsection", &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
|
|
LUMIERA_MUTEX_SECTION (NOBUG_ON, &m)
|
|
{
|
|
printf ("outer mutex locked section\n");
|
|
|
|
LUMIERA_MUTEX_SECTION_CHAIN (NOBUG_ON, &n)
|
|
{
|
|
printf ("inner but not outer mutex locked section\n");
|
|
}
|
|
}
|
|
|
|
lumiera_mutex_destroy (&n, &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
lumiera_mutex_destroy (&m, &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
}
|
|
|
|
|
|
|
|
TEST (recursivemutexsection)
|
|
{
|
|
lumiera_recmutex m;
|
|
lumiera_recmutex_init (&m, "m_recmutexsection", &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
|
|
|
|
LUMIERA_RECMUTEX_SECTION (NOBUG_ON, &m)
|
|
{
|
|
printf ("recmutex locked once\n");
|
|
|
|
LUMIERA_RECMUTEX_SECTION (NOBUG_ON, &m)
|
|
{
|
|
printf ("recmutex locked twice\n");
|
|
}
|
|
}
|
|
|
|
lumiera_recmutex_destroy (&m, &NOBUG_FLAG(NOBUG_ON), NOBUG_CONTEXT);
|
|
}
|
|
|
|
|
|
/* ====== 10/2023 : partially dismantled
|
|
*
|
|
* After switching to C++14 Threads and Locking (#1279),
|
|
* some backend-services are no longer used...
|
|
* - rwlocksection
|
|
* - rwlockforgotunlock
|
|
* - rwdeadlockwr
|
|
* - rwdeadlockrw
|
|
* - rwlockdeadlockwr
|
|
* - rwlockdeadlockrw
|
|
* - conditionops
|
|
* - conditionsection
|
|
* - conditionforgotunlock
|
|
* - condition signaling (planned)
|
|
* - condition broadcasting (planned)
|
|
* - recconditionops
|
|
* - recconditionsection
|
|
* - recconditionforgotunlock
|
|
* - chainedrecconditionsection
|
|
* - nestedrecconditionsection
|
|
* - reccondition signaling (planned)
|
|
* - reccondition broadcasting (planned)
|
|
*
|
|
*/
|
|
|
|
TESTS_END
|