#ifndef __RUNNER_HXX__
#define __RUNNER_HXX__
+#include <atomic>
+
#include "exp.hxx"
#include "execvisitor.hxx"
m_theProgram = _theProgram;
m_visitor = _visitor;
m_isConsoleCommand = false;
+ m_isInterruptible = true;
}
Runner(ast::Exp* _theProgram, ast::ExecVisitor *_visitor, bool _isConsoleCommand, bool _isInterruptible)
static void exec(ast::Exp* _theProgram, ast::ExecVisitor *_visitor);
private:
- static Runner* m_RunMe;
- static bool m_bInterruptibleCommand;
+ static std::atomic<Runner*> m_RunMe;
+ static std::atomic<bool> m_bInterruptibleCommand;
};
extern "C"
void StaticRunner_setInterruptibleCommand(int val);
}
-#endif /* !__RUNNER_HXX__ */
\ No newline at end of file
+#endif /* !__RUNNER_HXX__ */
using namespace ast;
-Runner* StaticRunner::m_RunMe = NULL;
-bool StaticRunner::m_bInterruptibleCommand = true;
+std::atomic<Runner*> StaticRunner::m_RunMe(nullptr);
+std::atomic<bool> StaticRunner::m_bInterruptibleCommand(true);
void StaticRunner::launch()
{
Runner* StaticRunner::getRunner(void)
{
- ThreadManagement::LockRunner();
Runner* tmp = m_RunMe;
m_RunMe = NULL;
- ThreadManagement::UnlockRunner();
ThreadManagement::SendAvailableRunnerSignal();
return tmp;
}
bool StaticRunner::isRunnerAvailable(void)
{
- ThreadManagement::LockRunner();
- bool bOut = m_RunMe != NULL;
- ThreadManagement::UnlockRunner();
- return bOut;
+ return m_RunMe != NULL;
}
void StaticRunner::setInterruptibleCommand(bool _bInterruptibleCommand)
{
- ThreadManagement::LockRunner();
m_bInterruptibleCommand = _bInterruptibleCommand;
- ThreadManagement::UnlockRunner();
}
bool StaticRunner::isInterruptibleCommand()
{
- ThreadManagement::LockRunner();
- bool bIsInterruptibleCommand = m_bInterruptibleCommand;
- ThreadManagement::UnlockRunner();
- return bIsInterruptibleCommand;
+ return m_bInterruptibleCommand;
}
void StaticRunner::execAndWait(ast::Exp* _theProgram, ast::ExecVisitor *_visitor,
void StaticRunner::exec(ast::Exp* _theProgram, ast::ExecVisitor *_visitor)
{
- ThreadManagement::LockRunner();
Runner *runMe = new Runner(_theProgram, _visitor);
setRunner(runMe);
- ThreadManagement::UnlockRunner();
launch();
}
fun:tgetstr
}
{
- dlerror leak thread local storage memory
+ dynamic-leak/dlerror_run
Memcheck:Leak
match-leak-kinds: reachable
- fun:calloc
+ ...
fun:_dlerror_run
}
{
- pthread_create will be clear on exit
+ dynamic-leak/dl_init
+ Memcheck:Leak
+ match-leak-kinds: reachable
+ ...
+ fun:_dl_init
+}
+{
+ dynamic-leak/dl_allocate_tls
Memcheck:Leak
match-leak-kinds: possible
- fun:calloc
- fun:allocate_dtv
+ ...
fun:_dl_allocate_tls
- fun:allocate_stack
- fun:pthread_create@@GLIBC_2.2.5
- fun:__CreateThreadWithParams
- fun:interactiveMain
- fun:RunScilabEngine
- fun:main
+ ...
}