score: Rework global construction

Ensure that the global construction is performed in the context of the
first initialization thread.  On SMP this was not guaranteed in the
previous implementation.
This commit is contained in:
Sebastian Huber
2014-10-10 09:09:19 +02:00
parent ef4c4612e2
commit a38ced2683
23 changed files with 444 additions and 87 deletions

View File

@@ -15,6 +15,10 @@ _SUBDIRS += psxhdrs psx01 psx02 psx03 psx04 psx05 psx06 psx07 psx08 psx09 \
psxtime psxtimer01 psxtimer02 psxualarm psxusleep psxfatal01 psxfatal02 \
psxintrcritical01 psxstack01 psxstack02 \
psxeintr_join psxgetattrnp01
if HAS_CPLUSPLUS
_SUBDIRS += psxglobalcon01
_SUBDIRS += psxglobalcon02
endif
endif
## File IO tests

View File

@@ -11,17 +11,22 @@ RTEMS_CANONICAL_TARGET_CPU
AM_INIT_AUTOMAKE([no-define foreign 1.12.2])
AM_MAINTAINER_MODE
RTEMS_ENABLE_CXX
RTEMS_ENV_RTEMSBSP
RTEMS_PROJECT_ROOT
RTEMS_PROG_CC_FOR_TARGET
RTEMS_PROG_CXX_FOR_TARGET
RTEMS_CANONICALIZE_TOOLS
RTEMS_CHECK_CUSTOM_BSP(RTEMS_BSP)
RTEMS_CHECK_CXX(RTEMS_BSP)
AM_CONDITIONAL([HAS_NETWORKING],[test "$HAS_NETWORKING" = "yes"])
AM_CONDITIONAL([HAS_NETWORKING],[test x"$HAS_NETWORKING" = x"yes"])
AM_CONDITIONAL([HAS_CPLUSPLUS],[test x"$HAS_CPLUSPLUS" = x"yes"])
RTEMS_CHECK_CPUOPTS([RTEMS_POSIX_API])
AM_CONDITIONAL(HAS_POSIX,test x"${rtems_cv_RTEMS_POSIX_API}" = x"yes")
@@ -145,6 +150,8 @@ psxfile02/Makefile
psxfilelock01/Makefile
psxgetattrnp01/Makefile
psxgetrusage01/Makefile
psxglobalcon01/Makefile
psxglobalcon02/Makefile
psxhdrs/Makefile
psxid01/Makefile
psximfs01/Makefile

View File

@@ -0,0 +1,19 @@
rtems_tests_PROGRAMS = psxglobalcon01
psxglobalcon01_SOURCES = init.cc
dist_rtems_tests_DATA = psxglobalcon01.scn psxglobalcon01.doc
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(top_srcdir)/../automake/compile.am
include $(top_srcdir)/../automake/leaf.am
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
LINK_OBJS = $(psxglobalcon01_OBJECTS)
LINK_LIBS = $(psxglobalcon01_LDLIBS)
psxglobalcon01$(EXEEXT): $(psxglobalcon01_OBJECTS) $(psxglobalcon01_DEPENDENCIES)
@rm -f psxglobalcon01$(EXEEXT)
$(make-exe)
include $(top_srcdir)/../automake/local.am

View File

@@ -0,0 +1,58 @@
/*
* Copyright (c) 2014 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "tmacros.h"
const char rtems_test_name[] = "PSXGLOBALCON 1";
class A {
public:
A()
{
++i;
}
static int i;
};
int A::i;
static A a;
static void *POSIX_Init(void *argument)
{
TEST_BEGIN();
rtems_test_assert(a.i == 1);
TEST_END();
rtems_test_exit(0);
}
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_MAXIMUM_POSIX_THREADS 1
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
#define CONFIGURE_INIT
#include <rtems/confdefs.h>

View File

@@ -0,0 +1,12 @@
This file describes the directives and concepts tested by this test set.
test set name: psxglobalcon01
directives:
- _Thread_Global_construction()
concepts:
- Ensure that the global construction is performed exactly once in case only
a POSIX initialization thread is present.

View File

@@ -0,0 +1,2 @@
*** BEGIN OF TEST PSXGLOBALCON 1 ***
*** END OF TEST PSXGLOBALCON 1 ***

View File

@@ -0,0 +1,19 @@
rtems_tests_PROGRAMS = psxglobalcon02
psxglobalcon02_SOURCES = init.cc
dist_rtems_tests_DATA = psxglobalcon02.scn psxglobalcon02.doc
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(top_srcdir)/../automake/compile.am
include $(top_srcdir)/../automake/leaf.am
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
LINK_OBJS = $(psxglobalcon02_OBJECTS)
LINK_LIBS = $(psxglobalcon02_LDLIBS)
psxglobalcon02$(EXEEXT): $(psxglobalcon02_OBJECTS) $(psxglobalcon02_DEPENDENCIES)
@rm -f psxglobalcon02$(EXEEXT)
$(make-exe)
include $(top_srcdir)/../automake/local.am

View File

@@ -0,0 +1,73 @@
/*
* Copyright (c) 2014 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "tmacros.h"
const char rtems_test_name[] = "PSXGLOBALCON 2";
class A {
public:
A()
{
++i;
}
static int i;
};
int A::i;
static A a;
static bool rtems_init_done;
extern "C" void Init(rtems_task_argument argument)
{
TEST_BEGIN();
rtems_test_assert(a.i == 1);
rtems_init_done = true;
rtems_task_delete(RTEMS_SELF);
rtems_test_assert(0);
}
static void *POSIX_Init(void *argument)
{
rtems_test_assert(rtems_init_done);
rtems_test_assert(a.i == 1);
TEST_END();
rtems_test_exit(0);
}
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_MAXIMUM_TASKS 1
#define CONFIGURE_MAXIMUM_POSIX_THREADS 1
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
#define CONFIGURE_INIT
#include <rtems/confdefs.h>

View File

@@ -0,0 +1,12 @@
This file describes the directives and concepts tested by this test set.
test set name: psxglobalcon02
directives:
- _Thread_Global_construction()
concepts:
- Ensure that the global construction is performed exactly once in case a
RTEMS initialization task and a POSIX initialization thread are present.

View File

@@ -0,0 +1,2 @@
*** BEGIN OF TEST PSXGLOBALCON 2 ***
*** END OF TEST PSXGLOBALCON 2 ***