lumiera_/tests/library/c-lib/test-locking.c

183 lines
4.5 KiB
C
Raw Normal View History

2007-09-02 17:52:30 +02:00
/*
TEST-LOCKING - test locking functions
2007-09-02 17:52:30 +02:00
Copyright (C) Lumiera.org
2008, Christian Thaeter <ct@pipapo.org>
2007-09-02 17:52:30 +02:00
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
2010-12-17 23:28:49 +01:00
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
2007-09-02 17:52:30 +02:00
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
2016-11-03 18:26:43 +01:00
*/
2007-09-02 17:52:30 +02:00
2011-12-02 21:34:29 +01:00
#include "lib/test/test.h"
#include "lib/mutex.h"
#include "lib/recmutex.h"
2007-09-02 17:52:30 +02:00
#include <stdio.h>
#include <string.h>
2007-09-02 17:52:30 +02:00
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)
2007-09-02 17:52:30 +02:00
{
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);
2007-09-02 17:52:30 +02:00
}
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