14#include "arccore/base/NotImplementedException.h"
15#include "arccore/base/IFunctor.h"
17#include "arccore/concurrency/GlibThreadImplementation.h"
18#include "arccore/concurrency/IThreadBarrier.h"
19#include "arccore/concurrency/Mutex.h"
20#include "arccore/concurrency/GlibAdapter.h"
34static void* _GlibStartFunc(
void* f)
44class GlibThreadBarrier
49 GlibThreadBarrier() =
default;
55 m_nb_thread = nb_thread;
56 m_current_reached = 0;
64 m_current_reached = 0;
75 if (m_current_reached == m_nb_thread) {
76 m_current_reached = 0;
81 m_wait->wait(m_wait_mutex);
82 m_wait_mutex->unlock();
89 Int32 m_nb_thread = 0;
90 Int32 m_current_reached = 0;
96extern "C" ARCCORE_CONCURRENCY_EXPORT IThreadBarrier*
97createGlibThreadBarrier()
99 return new GlibThreadBarrier();
105GlibThreadImplementation::
106GlibThreadImplementation()
107: m_global_mutex_impl(nullptr)
111GlibThreadImplementation::
112~GlibThreadImplementation()
114 GlobalMutex::destroy();
115 if (m_global_mutex_impl)
116 destroyMutex(m_global_mutex_impl);
119void GlibThreadImplementation::
122 m_global_mutex_impl = createMutex();
126ThreadImpl* GlibThreadImplementation::
129 return reinterpret_cast<ThreadImpl*
>(g_thread_new(
nullptr, &_GlibStartFunc, f));
132void GlibThreadImplementation::
133joinThread(ThreadImpl* t)
135 GThread* tt =
reinterpret_cast<GThread*
>(t);
139void GlibThreadImplementation::
140destroyThread(ThreadImpl* t)
145void GlibThreadImplementation::
146createSpinLock(
Int64* spin_lock_addr)
148 volatile gint* v = (gint*)spin_lock_addr;
152void GlibThreadImplementation::
153lockSpinLock(
Int64* spin_lock_addr,
Int64* scoped_spin_lock_addr)
155 ARCCORE_UNUSED(scoped_spin_lock_addr);
157 volatile gint* v = (gint*)spin_lock_addr;
158 if (!g_bit_trylock(v, 0)) {
161 }
while (!g_bit_trylock(v, 0));
165void GlibThreadImplementation::
166unlockSpinLock(
Int64* spin_lock_addr,
Int64* scoped_spin_lock_addr)
168 ARCCORE_UNUSED(scoped_spin_lock_addr);
170 volatile gint* v = (gint*)spin_lock_addr;
174MutexImpl* GlibThreadImplementation::
177 GlibMutex* m =
new GlibMutex();
178 return reinterpret_cast<MutexImpl*
>(m);
181void GlibThreadImplementation::
182destroyMutex(MutexImpl* mutex)
184 GlibMutex* m =
reinterpret_cast<GlibMutex*
>(mutex);
188void GlibThreadImplementation::
189lockMutex(MutexImpl* mutex)
191 GlibMutex* m =
reinterpret_cast<GlibMutex*
>(mutex);
195void GlibThreadImplementation::
196unlockMutex(MutexImpl* mutex)
198 GlibMutex* m =
reinterpret_cast<GlibMutex*
>(mutex);
202Int64 GlibThreadImplementation::
205 Int64 v =
reinterpret_cast<Int64>(g_thread_self());
212 return new GlibThreadBarrier();
void init(Integer nb_thread) override
Initialise la barrière pour nb_thread.
void wait() override
Bloque et attend que tous les threads appellent cette méthode.
void destroy() override
Détruit la barrière.
static void init(MutexImpl *p)
Initialise le mutex global. Interne a Arccore. Doit être alloué par new.
virtual void executeFunctor()=0
Exécute la méthode associé
Interface d'une barrière entre threads.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
std::int32_t Int32
Type entier signé sur 32 bits.