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
50 : m_wait_mutex(
nullptr)
53 , m_current_reached(0)
60 m_nb_thread = nb_thread;
61 m_current_reached = 0;
69 m_current_reached = 0;
81 if (m_current_reached == m_nb_thread) {
82 m_current_reached = 0;
88 m_wait->wait(m_wait_mutex);
89 m_wait_mutex->unlock();
104extern "C" ARCCORE_CONCURRENCY_EXPORT IThreadBarrier*
105createGlibThreadBarrier()
107 return new GlibThreadBarrier();
113GlibThreadImplementation::
114GlibThreadImplementation()
115: m_global_mutex_impl(nullptr)
119GlibThreadImplementation::
120~GlibThreadImplementation()
122 GlobalMutex::destroy();
123 if (m_global_mutex_impl)
124 destroyMutex(m_global_mutex_impl);
127void GlibThreadImplementation::
130 m_global_mutex_impl = createMutex();
134ThreadImpl* GlibThreadImplementation::
137 return reinterpret_cast<ThreadImpl*
>(g_thread_new(
nullptr, &_GlibStartFunc, f));
140void GlibThreadImplementation::
141joinThread(ThreadImpl* t)
143 GThread* tt =
reinterpret_cast<GThread*
>(t);
147void GlibThreadImplementation::
148destroyThread(ThreadImpl* t)
153void GlibThreadImplementation::
154createSpinLock(
Int64* spin_lock_addr)
156 volatile gint* v = (gint*)spin_lock_addr;
160void GlibThreadImplementation::
161lockSpinLock(
Int64* spin_lock_addr,
Int64* scoped_spin_lock_addr)
163 ARCCORE_UNUSED(scoped_spin_lock_addr);
165 volatile gint* v = (gint*)spin_lock_addr;
166 if (!g_bit_trylock(v, 0)) {
169 }
while (!g_bit_trylock(v, 0));
173void GlibThreadImplementation::
174unlockSpinLock(
Int64* spin_lock_addr,
Int64* scoped_spin_lock_addr)
176 ARCCORE_UNUSED(scoped_spin_lock_addr);
178 volatile gint* v = (gint*)spin_lock_addr;
182MutexImpl* GlibThreadImplementation::
185 GlibMutex* m =
new GlibMutex();
186 return reinterpret_cast<MutexImpl*
>(m);
189void GlibThreadImplementation::
190destroyMutex(MutexImpl* mutex)
192 GlibMutex* m =
reinterpret_cast<GlibMutex*
>(mutex);
196void GlibThreadImplementation::
197lockMutex(MutexImpl* mutex)
199 GlibMutex* m =
reinterpret_cast<GlibMutex*
>(mutex);
203void GlibThreadImplementation::
204unlockMutex(MutexImpl* mutex)
206 GlibMutex* m =
reinterpret_cast<GlibMutex*
>(mutex);
210Int64 GlibThreadImplementation::
213 Int64 v =
reinterpret_cast<Int64>(g_thread_self());
220 return new GlibThreadBarrier();
virtual void init(Integer nb_thread)
Initialise la barrière pour nb_thread.
virtual bool wait()
Bloque et attend que tous les threads appellent cette méthode.
virtual void destroy()
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.