Fixed building with thread safety

This commit is contained in:
Ray Speth 2012-05-17 21:15:01 +00:00
parent cc2ed9b751
commit 021e11456e
3 changed files with 54 additions and 30 deletions

View file

@ -699,6 +699,9 @@ if env['CC'] == 'cl':
if env['boost_inc_dir']:
env.Append(CPPPATH=env['boost_inc_dir'])
if env['boost_lib_dir']:
env.Append(LIBPATH=env['boost_lib_dir'])
if (env['use_sundials'] == 'default' and
(env['sundials_include'] or env['sundials_libdir'])):
env['use_sundials'] = 'y'
@ -1002,7 +1005,7 @@ env['config_h_target'] = config_h
if env['build_thread_safe']:
env['use_boost_libs'] = True
env['boost_libs'] = env['boost_thread_lib']
env['boost_libs'] = [env['boost_thread_lib']]
else:
env['use_boost_libs'] = False
env['boost_libs'] = []

View file

@ -4,6 +4,7 @@
#include "cantera/base/ctml.h"
#include "cantera/base/stringUtils.h"
#include "cantera/base/xml.h"
#include "units.h"
#include <map>
#include <string>
@ -20,6 +21,8 @@ using std::endl;
#pragma comment(lib, "advapi32")
#endif
namespace Cantera {
// If running multiple threads in a cpp application, the Application class
// is the only internal object that is single instance with static data.
// Synchronize access to those data structures Using macros to avoid
@ -27,8 +30,6 @@ using std::endl;
#ifdef THREAD_SAFE_CANTERA
#include <boost/shared_ptr.hpp>
#include <boost/thread/mutex.hpp>
//! Mutex for input directory access
static boost::mutex dir_mutex;
@ -62,7 +63,7 @@ static boost::mutex xml_mutex;
#endif
#if defined(BOOST_HAS_WINTHREADS)
typedef unsigned int cthreadId_t ;
class thread_equal
{
public:
@ -116,8 +117,6 @@ cthreadId_t getThisThreadId()
#endif
namespace Cantera {
Application::Messages::Messages() :
errorMessage(0),
errorRoutine(0),
@ -371,6 +370,31 @@ void Application::Messages::write_logfile(std::string file)
#endif // WITH_HTML_LOGS
#ifdef THREAD_SAFE_CANTERA
Application::Messages* Application::ThreadMessages::operator ->()
{
MSG_LOCK() ;
cthreadId_t curId = getThisThreadId() ;
threadMsgMap_t::iterator iter = m_threadMsgMap.find(curId) ;
if (iter != m_threadMsgMap.end()) {
return (iter->second.get()) ;
}
pMessages_t pMsgs(new Messages()) ;
m_threadMsgMap.insert(std::pair< cthreadId_t, pMessages_t >(curId, pMsgs)) ;
return pMsgs.get() ;
}
void Application::ThreadMessages::removeThreadMessages()
{
MSG_LOCK() ;
cthreadId_t curId = getThisThreadId() ;
threadMsgMap_t::iterator iter = m_threadMsgMap.find(curId) ;
if (iter != m_threadMsgMap.end()) {
m_threadMsgMap.erase(iter) ;
}
}
#endif // THREAD_SAFE_CANTERA
Application::Application() :
inputDirs(0),
stop_on_error(false),

View file

@ -4,6 +4,11 @@
#include "cantera/base/config.h"
#include "cantera/base/logger.h"
#ifdef THREAD_SAFE_CANTERA
#include <boost/shared_ptr.hpp>
#include <boost/thread/mutex.hpp>
#endif
#include <map>
#include <memory>
#include <string>
@ -23,6 +28,16 @@ class XML_Node;
* data is stored in the class Application.
*/
#ifdef THREAD_SAFE_CANTERA
#if defined(BOOST_HAS_WINTHREADS)
typedef unsigned int cthreadId_t;
#elif defined(BOOST_HAS_PTHREADS)
typedef pthread_t cthreadId_t;
#elif defined(BOOST_HAS_MPTASKS)
typedef MPTaskID cthreadId_t;
#endif
#endif
//! Class to hold global data.
/*!
@ -309,43 +324,25 @@ protected:
//! Typedef for thread specific messages
typedef boost::shared_ptr< Messages > pMessages_t ;
//! Typedef for map between a thread and the message
typedef std::map< cthreadId_t, pMessages_t > threadMsgMap_t ;
//! Class that stores thread messages for each thread, and retrieves them
//! based on the thread id.
class ThreadMessages
{
public:
//! Constructor
ThreadMessages() {
}
ThreadMessages() {}
//! Provide a pointer deferencing overloaded operator
/*!
* @return returns a pointer to Messages
*/
Messages* operator->() {
MSG_LOCK() ;
cthreadId_t curId = getThisThreadId() ;
threadMsgMap_t::iterator iter = m_threadMsgMap.find(curId) ;
if (iter != m_threadMsgMap.end()) {
return (iter->second.get()) ;
}
pMessages_t pMsgs(new Messages()) ;
m_threadMsgMap.insert(std::pair< cthreadId_t, pMessages_t >(curId, pMsgs)) ;
return pMsgs.get() ;
}
Messages* operator->();
//! Remove a local thread message
void removeThreadMessages() {
MSG_LOCK() ;
cthreadId_t curId = getThisThreadId() ;
threadMsgMap_t::iterator iter = m_threadMsgMap.find(curId) ;
if (iter != m_threadMsgMap.end()) {
m_threadMsgMap.erase(iter) ;
}
}
void removeThreadMessages();
//! Typedef for map between a thread and the message
typedef std::map< cthreadId_t, pMessages_t > threadMsgMap_t ;
private:
//! Thread Msg Map