source: rtems/cpukit/score/src/smpmulticastaction.c

Last change on this file was bcef89f2, checked in by Sebastian Huber <sebastian.huber@…>, on 05/19/23 at 06:18:25

Update company name

The embedded brains GmbH & Co. KG is the legal successor of embedded
brains GmbH.

  • Property mode set to 100644
File size: 3.2 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @ingroup RTEMSScoreSMP
7 *
8 * @brief This source file contains the implementation of
9 *   _SMP_Multicast_action().
10 */
11
12/*
13 * Copyright (C) 2019 embedded brains GmbH & Co. KG
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 *    notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 *    notice, this list of conditions and the following disclaimer in the
22 *    documentation and/or other materials provided with the distribution.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 */
36
37#ifdef HAVE_CONFIG_H
38#include "config.h"
39#endif
40
41#include <rtems/score/smpimpl.h>
42#include <rtems/score/assert.h>
43
44typedef struct {
45  Per_CPU_Job_context Context;
46  Per_CPU_Job         Jobs[ CPU_MAXIMUM_PROCESSORS ];
47} SMP_Multicast_jobs;
48
49static void _SMP_Issue_action_jobs(
50  const Processor_mask *targets,
51  SMP_Multicast_jobs   *jobs,
52  uint32_t              cpu_max
53)
54{
55  uint32_t cpu_index;
56
57  for ( cpu_index = 0; cpu_index < cpu_max; ++cpu_index ) {
58    if ( _Processor_mask_Is_set( targets, cpu_index ) ) {
59      Per_CPU_Job     *job;
60      Per_CPU_Control *cpu;
61
62      job = &jobs->Jobs[ cpu_index ];
63      job->context = &jobs->Context;
64      cpu = _Per_CPU_Get_by_index( cpu_index );
65
66      _Per_CPU_Submit_job( cpu, job );
67    }
68  }
69}
70
71static void _SMP_Wait_for_action_jobs(
72  const Processor_mask     *targets,
73  const SMP_Multicast_jobs *jobs,
74  uint32_t                  cpu_max
75)
76{
77  uint32_t cpu_index;
78
79  for ( cpu_index = 0; cpu_index < cpu_max; ++cpu_index ) {
80    if ( _Processor_mask_Is_set( targets, cpu_index ) ) {
81      const Per_CPU_Control *cpu;
82      const Per_CPU_Job     *job;
83
84      cpu = _Per_CPU_Get_by_index( cpu_index );
85      job = &jobs->Jobs[ cpu_index ];
86      _Per_CPU_Wait_for_job( cpu, job );
87    }
88  }
89}
90
91void _SMP_Multicast_action(
92  const Processor_mask *targets,
93  SMP_Action_handler    handler,
94  void                 *arg
95)
96{
97  SMP_Multicast_jobs jobs;
98  uint32_t           cpu_max;
99
100  cpu_max = _SMP_Get_processor_maximum();
101  _Assert( cpu_max <= RTEMS_ARRAY_SIZE( jobs.Jobs ) );
102
103  jobs.Context.handler = handler;
104  jobs.Context.arg = arg;
105
106  _SMP_Issue_action_jobs( targets, &jobs, cpu_max );
107  _SMP_Wait_for_action_jobs( targets, &jobs, cpu_max );
108}
Note: See TracBrowser for help on using the repository browser.