From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 127551 invoked by alias); 8 Jan 2019 13:28:45 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 127524 invoked by uid 89); 8 Jan 2019 13:28:44 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=arrive, Reduce, awaited, awaiting X-HELO: dedi548.your-server.de Received: from dedi548.your-server.de (HELO dedi548.your-server.de) (85.10.215.148) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 08 Jan 2019 13:28:40 +0000 Received: from [78.46.172.3] (helo=sslproxy06.your-server.de) by dedi548.your-server.de with esmtpsa (TLSv1.2:DHE-RSA-AES256-GCM-SHA384:256) (Exim 4.89_1) (envelope-from ) id 1ggrQs-0004oq-OL for gcc-patches@gcc.gnu.org; Tue, 08 Jan 2019 14:28:38 +0100 Received: from [82.135.62.35] (helo=mail.embedded-brains.de) by sslproxy06.your-server.de with esmtpsa (TLSv1.2:DHE-RSA-AES256-GCM-SHA384:256) (Exim 4.89) (envelope-from ) id 1ggrQs-000Ure-EH for gcc-patches@gcc.gnu.org; Tue, 08 Jan 2019 14:28:38 +0100 Received: from localhost (localhost.localhost [127.0.0.1]) by mail.embedded-brains.de (Postfix) with ESMTP id 351C72A167E for ; Tue, 8 Jan 2019 14:29:08 +0100 (CET) Received: from mail.embedded-brains.de ([127.0.0.1]) by localhost (zimbra.eb.localhost [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id Y3_H-hZV4dkZ for ; Tue, 8 Jan 2019 14:29:07 +0100 (CET) Received: from localhost (localhost.localhost [127.0.0.1]) by mail.embedded-brains.de (Postfix) with ESMTP id B761D2A0043 for ; Tue, 8 Jan 2019 14:29:07 +0100 (CET) Received: from mail.embedded-brains.de ([127.0.0.1]) by localhost (zimbra.eb.localhost [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id l0hy4-dEJgL0 for ; Tue, 8 Jan 2019 14:29:07 +0100 (CET) Received: from linux-diu0.suse (unknown [192.168.96.161]) by mail.embedded-brains.de (Postfix) with ESMTP id 963502A165C for ; Tue, 8 Jan 2019 14:29:07 +0100 (CET) From: Sebastian Huber To: gcc-patches@gcc.gnu.org Subject: [PATCH 2/2] libgomp: Reduce copy and paste for RTEMS Date: Tue, 08 Jan 2019 13:28:00 -0000 Message-Id: <20190108132835.15505-2-sebastian.huber@embedded-brains.de> In-Reply-To: <20190108132835.15505-1-sebastian.huber@embedded-brains.de> References: <20190108132835.15505-1-sebastian.huber@embedded-brains.de> X-IsSubscribed: yes X-SW-Source: 2019-01/txt/msg00396.txt.bz2 libgomp/ * config/rtems/bar.c: Include "../linux/bar.c" and delete copy and paste code. --- libgomp/config/rtems/bar.c | 183 +-------------------------------------------- 1 file changed, 2 insertions(+), 181 deletions(-) diff --git a/libgomp/config/rtems/bar.c b/libgomp/config/rtems/bar.c index 8f92d60b325..c16c763b954 100644 --- a/libgomp/config/rtems/bar.c +++ b/libgomp/config/rtems/bar.c @@ -29,6 +29,7 @@ #include "libgomp.h" #include "bar.h" +#define GOMP_WAIT_H 1 #include static gomp_barrier_t * @@ -72,184 +73,4 @@ do_wait (int *addr, int val) futex_wait (addr, val); } -/* Everything below this point should be identical to the Linux - implementation. */ - -void -gomp_barrier_wait_end (gomp_barrier_t *bar, gomp_barrier_state_t state) -{ - if (__builtin_expect (state & BAR_WAS_LAST, 0)) - { - /* Next time we'll be awaiting TOTAL threads again. */ - bar->awaited = bar->total; - __atomic_store_n (&bar->generation, bar->generation + BAR_INCR, - MEMMODEL_RELEASE); - futex_wake ((int *) &bar->generation, INT_MAX); - } - else - { - do - do_wait ((int *) &bar->generation, state); - while (__atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE) == state); - } -} - -void -gomp_barrier_wait (gomp_barrier_t *bar) -{ - gomp_barrier_wait_end (bar, gomp_barrier_wait_start (bar)); -} - -/* Like gomp_barrier_wait, except that if the encountering thread - is not the last one to hit the barrier, it returns immediately. - The intended usage is that a thread which intends to gomp_barrier_destroy - this barrier calls gomp_barrier_wait, while all other threads - call gomp_barrier_wait_last. When gomp_barrier_wait returns, - the barrier can be safely destroyed. */ - -void -gomp_barrier_wait_last (gomp_barrier_t *bar) -{ - gomp_barrier_state_t state = gomp_barrier_wait_start (bar); - if (state & BAR_WAS_LAST) - gomp_barrier_wait_end (bar, state); -} - -void -gomp_team_barrier_wake (gomp_barrier_t *bar, int count) -{ - futex_wake ((int *) &bar->generation, count == 0 ? INT_MAX : count); -} - -void -gomp_team_barrier_wait_end (gomp_barrier_t *bar, gomp_barrier_state_t state) -{ - unsigned int generation, gen; - - if (__builtin_expect (state & BAR_WAS_LAST, 0)) - { - /* Next time we'll be awaiting TOTAL threads again. */ - struct gomp_thread *thr = gomp_thread (); - struct gomp_team *team = thr->ts.team; - - bar->awaited = bar->total; - team->work_share_cancelled = 0; - if (__builtin_expect (team->task_count, 0)) - { - gomp_barrier_handle_tasks (state); - state &= ~BAR_WAS_LAST; - } - else - { - state &= ~BAR_CANCELLED; - state += BAR_INCR - BAR_WAS_LAST; - __atomic_store_n (&bar->generation, state, MEMMODEL_RELEASE); - futex_wake ((int *) &bar->generation, INT_MAX); - return; - } - } - - generation = state; - state &= ~BAR_CANCELLED; - do - { - do_wait ((int *) &bar->generation, generation); - gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE); - if (__builtin_expect (gen & BAR_TASK_PENDING, 0)) - { - gomp_barrier_handle_tasks (state); - gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE); - } - generation |= gen & BAR_WAITING_FOR_TASK; - } - while (gen != state + BAR_INCR); -} - -void -gomp_team_barrier_wait (gomp_barrier_t *bar) -{ - gomp_team_barrier_wait_end (bar, gomp_barrier_wait_start (bar)); -} - -void -gomp_team_barrier_wait_final (gomp_barrier_t *bar) -{ - gomp_barrier_state_t state = gomp_barrier_wait_final_start (bar); - if (__builtin_expect (state & BAR_WAS_LAST, 0)) - bar->awaited_final = bar->total; - gomp_team_barrier_wait_end (bar, state); -} - -bool -gomp_team_barrier_wait_cancel_end (gomp_barrier_t *bar, - gomp_barrier_state_t state) -{ - unsigned int generation, gen; - - if (__builtin_expect (state & BAR_WAS_LAST, 0)) - { - /* Next time we'll be awaiting TOTAL threads again. */ - /* BAR_CANCELLED should never be set in state here, because - cancellation means that at least one of the threads has been - cancelled, thus on a cancellable barrier we should never see - all threads to arrive. */ - struct gomp_thread *thr = gomp_thread (); - struct gomp_team *team = thr->ts.team; - - bar->awaited = bar->total; - team->work_share_cancelled = 0; - if (__builtin_expect (team->task_count, 0)) - { - gomp_barrier_handle_tasks (state); - state &= ~BAR_WAS_LAST; - } - else - { - state += BAR_INCR - BAR_WAS_LAST; - __atomic_store_n (&bar->generation, state, MEMMODEL_RELEASE); - futex_wake ((int *) &bar->generation, INT_MAX); - return false; - } - } - - if (__builtin_expect (state & BAR_CANCELLED, 0)) - return true; - - generation = state; - do - { - do_wait ((int *) &bar->generation, generation); - gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE); - if (__builtin_expect (gen & BAR_CANCELLED, 0)) - return true; - if (__builtin_expect (gen & BAR_TASK_PENDING, 0)) - { - gomp_barrier_handle_tasks (state); - gen = __atomic_load_n (&bar->generation, MEMMODEL_ACQUIRE); - } - generation |= gen & BAR_WAITING_FOR_TASK; - } - while (gen != state + BAR_INCR); - - return false; -} - -bool -gomp_team_barrier_wait_cancel (gomp_barrier_t *bar) -{ - return gomp_team_barrier_wait_cancel_end (bar, gomp_barrier_wait_start (bar)); -} - -void -gomp_team_barrier_cancel (struct gomp_team *team) -{ - gomp_mutex_lock (&team->task_lock); - if (team->barrier.generation & BAR_CANCELLED) - { - gomp_mutex_unlock (&team->task_lock); - return; - } - team->barrier.generation |= BAR_CANCELLED; - gomp_mutex_unlock (&team->task_lock); - futex_wake ((int *) &team->barrier.generation, INT_MAX); -} +#include "../linux/bar.c" -- 2.16.4