[PATCH] Add pthread example
Joel Sherrill
joel at rtems.org
Sun Dec 9 17:02:28 UTC 2018
I have this ready to commit. I am on public wifi and blocked from doing it.
I had some modifications to the comment to also note that he original port
was done in Christopher Kerl as part of GCI 2013.
We need a ticket to track the conversion of the Livermore pthread examples.
https://computing.llnl.gov/tutorials/pthreads/
--joel
On Sun, Dec 9, 2018 at 9:44 AM Marçal Comajoan Cara <mcomajoancara at gmail.com>
wrote:
> Closes #2087.
>
> This work was part of GCI 2018.
> ---
> posix_api/Makefile | 1 +
> posix_api/livermore/Makefile | 8 +++
> posix_api/livermore/pthread/Makefile | 23 ++++++++
> posix_api/livermore/pthread/README | 5 ++
> posix_api/livermore/pthread/init.c | 80 ++++++++++++++++++++++++++++
> posix_api/livermore/pthread/wscript | 14 +++++
> posix_api/livermore/wscript | 10 ++++
> posix_api/wscript | 1 +
> 8 files changed, 142 insertions(+)
> create mode 100644 posix_api/livermore/Makefile
> create mode 100644 posix_api/livermore/pthread/Makefile
> create mode 100644 posix_api/livermore/pthread/README
> create mode 100644 posix_api/livermore/pthread/init.c
> create mode 100644 posix_api/livermore/pthread/wscript
> create mode 100644 posix_api/livermore/wscript
>
> diff --git a/posix_api/Makefile b/posix_api/Makefile
> index 8af26dc..601246c 100644
> --- a/posix_api/Makefile
> +++ b/posix_api/Makefile
> @@ -14,4 +14,5 @@ ifeq ($(RTEMS_HAS_POSIX_API),yes)
> SUBDIRS += psx_pthread_report
> SUBDIRS += psx_rwlock_report
> SUBDIRS += psx_sched_report
> + SUBDIRS += livermore
> endif
> diff --git a/posix_api/livermore/Makefile b/posix_api/livermore/Makefile
> new file mode 100644
> index 0000000..d8695a1
> --- /dev/null
> +++ b/posix_api/livermore/Makefile
> @@ -0,0 +1,8 @@
> +include $(RTEMS_MAKEFILE_PATH)/Makefile.inc
> +include $(RTEMS_CUSTOM)
> +include $(RTEMS_SHARE)/make/directory.cfg
> +
> +# If the POSIX API isn't enabled, we can't build these
> +ifeq ($(RTEMS_HAS_POSIX_API),yes)
> + SUBDIRS = pthread
> +endif
> diff --git a/posix_api/livermore/pthread/Makefile
> b/posix_api/livermore/pthread/Makefile
> new file mode 100644
> index 0000000..fdd13dc
> --- /dev/null
> +++ b/posix_api/livermore/pthread/Makefile
> @@ -0,0 +1,23 @@
> +#
> +# RTEMS_MAKEFILE_PATH is typically set in an environment variable
> +#
> +
> +PGM=${ARCH}/pthread.exe
> +
> +# optional managers required
> +MANAGERS=all
> +
> +# C source names
> +CSRCS = init.c
> +COBJS = $(CSRCS:%.c=${ARCH}/%.o)
> +
> +include $(RTEMS_MAKEFILE_PATH)/Makefile.inc
> +include $(RTEMS_CUSTOM)
> +include $(PROJECT_ROOT)/make/leaf.cfg
> +
> +OBJS= $(COBJS) $(CXXOBJS) $(ASOBJS)
> +
> +all: ${ARCH} $(PGM)
> +
> +$(PGM): $(OBJS)
> + $(make-exe)
> \ No newline at end of file
> diff --git a/posix_api/livermore/pthread/README
> b/posix_api/livermore/pthread/README
> new file mode 100644
> index 0000000..17cefd4
> --- /dev/null
> +++ b/posix_api/livermore/pthread/README
> @@ -0,0 +1,5 @@
> +This is a simple example which illustrates how to use the
> +pthreads adapted from the Lawrence Livermore POSIX Pthreads
> +tutorial: https://computing.llnl.gov/tutorials/pthreads/.
> +
> +Thanks to Christopher Kerl for providing the code.
> diff --git a/posix_api/livermore/pthread/init.c
> b/posix_api/livermore/pthread/init.c
> new file mode 100644
> index 0000000..b77e733
> --- /dev/null
> +++ b/posix_api/livermore/pthread/init.c
> @@ -0,0 +1,80 @@
> +/*
> + * COPYRIGHT (c) 1989-2012.
> + * On-Line Applications Research Corporation (OAR).
> + *
> + * The license and distribution terms for this file may be
> + * found in the file LICENSE in this distribution or at
> + * http://www.rtems.com/license/LICENSE.
> + */
> +
> +//Adapted from Lawrence Livermore Pthread Tutorial #1
> +//https://computing.llnl.gov/tutorials/pthreads
> +
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include <bsp.h> /* for device driver prototypes */
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <pthread.h>
> +
> +#define NUM_THREADS 5
> +
> +/* forward declarations to avoid warnings */
> +void *POSIX_Init(void *argument);
> +void *Print_Hello(void *threadid);
> +
> +void *Print_Hello(void *threadid)
> +{
> + long tid;
> + tid = (long)threadid;
> + printf("Hello World! It's me, thread #%ld!\n", tid);
> +
> + //You must include the return 'NULL;' in your threads to make the
> compiler happy
> + pthread_exit(NULL);
> + return NULL;
> +}
> +
> +
> +void *POSIX_Init(void *argument)
> +{
> + pthread_t threads[NUM_THREADS];
> + int rc;
> + long t;
> +
> + //Creates threads
> + for(t=0; t<NUM_THREADS; t++){
> + printf("In main: creating thread %ld\n", t);
> + rc = pthread_create(&threads[t], NULL, Print_Hello, (void *)t);
> + if (rc){
> + printf("ERROR; return code from pthread_create() is %d\n", rc);
> + exit(-1);
> + }
> + }
> +
> +
> + //Joins the child threads up to the main one.
> + for(t=0; t<NUM_THREADS; t++){
> + pthread_join(threads[t],NULL);
> + }
> + /* Last thing that main() should do */
> + exit(NULL);
> +}
> +
> +/* NOTICE: the clock driver is explicitly disabled */
> +#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
> +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
> +
> +#define CONFIGURE_MAXIMUM_TASKS 1
> +#define CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM
> +
>
> +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> +//NOTICE: These configuration variable MUST be initialized before using
> Pthreads. The will not work if you do not.
>
> +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> +#define CONFIGURE_MAXIMUM_POSIX_THREADS 6
> /////
> +#define CONFIGURE_POSIX_INIT_THREAD_TABLE
> /////
>
> +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> +
> +#define CONFIGURE_INIT
> +#include <rtems/confdefs.h>
> diff --git a/posix_api/livermore/pthread/wscript
> b/posix_api/livermore/pthread/wscript
> new file mode 100644
> index 0000000..8e0f266
> --- /dev/null
> +++ b/posix_api/livermore/pthread/wscript
> @@ -0,0 +1,14 @@
> +# Copyright 2018 Marçal Comajoan Cara
> +#
> +# This file's license is 2-clause BSD as in this distribution's LICENSE.2
> file.
> +#
> +
> +import rtems_waf.rtems as rtems
> +
> +def build(bld):
> + rtems.build(bld)
> +
> + bld(features = 'c cprogram',
> + target = 'pthread.exe',
> + source = ['init.c'])
> +
> diff --git a/posix_api/livermore/wscript b/posix_api/livermore/wscript
> new file mode 100644
> index 0000000..da99c30
> --- /dev/null
> +++ b/posix_api/livermore/wscript
> @@ -0,0 +1,10 @@
> +# Copyright 2018 Marçal Comajoan Cara
> +#
> +# This file's license is 2-clause BSD as in this distribution's LICENSE.2
> file.
> +#
> +
> +import rtems_waf.rtems as rtems
> +
> +def build(bld):
> + if rtems.check_posix(bld):
> + bld.recurse('pthread')
> diff --git a/posix_api/wscript b/posix_api/wscript
> index 66a351f..912063b 100644
> --- a/posix_api/wscript
> +++ b/posix_api/wscript
> @@ -17,3 +17,4 @@ def build(bld):
> bld.recurse('psx_pthread_report')
> bld.recurse('psx_rwlock_report')
> bld.recurse('psx_sched_report')
> + bld.recurse('livermore')
> --
> 2.19.2
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20181209/3b883e6e/attachment-0002.html>
More information about the devel
mailing list