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
Initializes the barrier for nb_thread.
void wait() override
Blocks and waits until all threads call this method.
void destroy() override
Destroys the barrier.
static void init(MutexImpl *p)
Initializes the global mutex. Internal to Arccore. Must be allocated by new.
virtual void executeFunctor()=0
Executes the associated method.
Interface of a barrier between threads.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
std::int32_t Int32
Signed integer type of 32 bits.