Index: boden/wege/weg.cc =================================================================== --- boden/wege/weg.cc (revision 7373) +++ boden/wege/weg.cc (working copy) @@ -44,11 +44,12 @@ #include "../../tpl/slist_tpl.h" + #ifdef MULTI_THREAD -#include "../../utils/simthread.h" -static pthread_mutex_t weg_calc_bild_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; +pthread_mutex_t weg_t::weg_calc_bild_mutex; #endif + /** * Alle instantiierten Wege * @author Hj. Malthaner Index: boden/wege/weg.h =================================================================== --- boden/wege/weg.h (revision 7373) +++ boden/wege/weg.h (working copy) @@ -14,7 +14,11 @@ #include "../../besch/weg_besch.h" #include "../../dataobj/koord3d.h" +#ifdef MULTI_THREAD +#include "../../utils/simthread.h" +#endif + class karte_t; class weg_besch_t; class cbuffer_t; @@ -150,6 +154,12 @@ bool check_season(const long /*month*/); #ifdef MULTI_THREAD +private: + static pthread_mutex_t weg_calc_bild_mutex; + +public: + static void init_mutex() { simthread_init_recursive_mutex( &weg_calc_bild_mutex ); } + void lock_mutex(); void unlock_mutex(); #endif Index: obj/crossing.cc =================================================================== --- obj/crossing.cc (revision 7373) +++ obj/crossing.cc (working copy) @@ -24,9 +24,9 @@ #include "crossing.h" + #ifdef MULTI_THREAD -#include "../utils/simthread.h" -static pthread_mutex_t crossing_logic_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; +pthread_mutex_t crossing_t::crossing_logic_mutex; #endif Index: obj/crossing.h =================================================================== --- obj/crossing.h (revision 7373) +++ obj/crossing.h (working copy) @@ -13,6 +13,10 @@ #include "../besch/kreuzung_besch.h" #include "../dataobj/crossing_logic.h" +#ifdef MULTI_THREAD +#include "../utils/simthread.h" +#endif + class vehikel_basis_t; /** @@ -110,6 +114,14 @@ void rdwr(loadsave_t *file); void laden_abschliessen(); + +#ifdef MULTI_THREAD +private: + static pthread_mutex_t crossing_logic_mutex; + +public: + static void init_mutex() { simthread_init_recursive_mutex( &crossing_logic_mutex ); } +#endif }; #endif Index: obj/tunnel.cc =================================================================== --- obj/tunnel.cc (revision 7373) +++ obj/tunnel.cc (working copy) @@ -24,9 +24,9 @@ #include "tunnel.h" + #ifdef MULTI_THREAD -#include "../utils/simthread.h" -static pthread_mutex_t tunnel_calc_bild_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; +pthread_mutex_t tunnel_t::tunnel_calc_bild_mutex; #endif Index: obj/tunnel.h =================================================================== --- obj/tunnel.h (revision 7373) +++ obj/tunnel.h (working copy) @@ -4,6 +4,10 @@ #include "../simobj.h" #include "../display/simimg.h" +#ifdef MULTI_THREAD +#include "../utils/simthread.h" +#endif + class tunnel_besch_t; class tunnel_t : public obj_no_info_t @@ -51,6 +55,14 @@ * @author Hj. Malthaner */ virtual const char *ist_entfernbar(const spieler_t *sp); + +#ifdef MULTI_THREAD +private: + static pthread_mutex_t tunnel_calc_bild_mutex; + +public: + static void init_mutex() { simthread_init_recursive_mutex( &tunnel_calc_bild_mutex ); } +#endif }; #endif Index: obj/wayobj.cc =================================================================== --- obj/wayobj.cc (revision 7373) +++ obj/wayobj.cc (working copy) @@ -41,11 +41,12 @@ #include "tunnel.h" #include "wayobj.h" + #ifdef MULTI_THREAD -#include "../utils/simthread.h" -static pthread_mutex_t wayobj_calc_bild_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; +pthread_mutex_t wayobj_t::wayobj_calc_bild_mutex; #endif + // the descriptions ... const way_obj_besch_t *wayobj_t::default_oberleitung=NULL; stringhashtable_tpl wayobj_t::table; Index: obj/wayobj.h =================================================================== --- obj/wayobj.h (revision 7373) +++ obj/wayobj.h (working copy) @@ -16,6 +16,10 @@ #include "../tpl/vector_tpl.h" #include "../tpl/stringhashtable_tpl.h" +#ifdef MULTI_THREAD +#include "../utils/simthread.h" +#endif + class spieler_t; class karte_t; class koord; @@ -132,6 +136,14 @@ * @author Hj. Malthaner */ static void fill_menu(werkzeug_waehler_t *wzw, waytype_t wtyp, sint16 sound_ok); + +#ifdef MULTI_THREAD +private: + static pthread_mutex_t wayobj_calc_bild_mutex; + +public: + static void init_mutex() { simthread_init_recursive_mutex( &wayobj_calc_bild_mutex ); } +#endif }; #endif Index: simmain.cc =================================================================== --- simmain.cc (revision 7373) +++ simmain.cc (working copy) @@ -51,6 +51,9 @@ #include "gui/scenario_frame.h" #include "obj/baum.h" +#include "obj/crossing.h" +#include "obj/tunnel.h" +#include "obj/wayobj.h" #include "utils/simstring.h" #include "utils/searchfolder.h" @@ -395,6 +398,14 @@ env_t::init(); +#ifdef MULTI_THREAD + weg_t::init_mutex(); + crossing_t::init_mutex(); + tunnel_t::init_mutex(); + wayobj_t::init_mutex(); + karte_t::init_mutex(); +#endif + // you really want help with this? if (gimme_arg(argc, argv, "-h", 0) || gimme_arg(argc, argv, "-?", 0) || Index: simworld.cc =================================================================== --- simworld.cc (revision 7373) +++ simworld.cc (working copy) @@ -123,14 +123,14 @@ stringhashtable_tplmissing_pak_names; #ifdef MULTI_THREAD -#include "utils/simthread.h" #include +pthread_mutex_t karte_t::height_mutex; + bool spawned_world_threads=false; // global job indicator array static simthread_barrier_t world_barrier_start; static simthread_barrier_t world_barrier_end; - // to start a thread typedef struct{ karte_t *welt; Index: simworld.h =================================================================== --- simworld.h (revision 7373) +++ simworld.h (working copy) @@ -34,6 +34,11 @@ #include "simdebug.h" +#ifdef MULTI_THREAD +#include "utils/simthread.h" +#endif + + struct event_t; struct sound_info; class stadt_t; @@ -768,6 +773,14 @@ */ koord3d show_distance; +#ifdef MULTI_THREAD +private: + static pthread_mutex_t height_mutex; + +public: + static void init_mutex() { simthread_init_recursive_mutex( &height_mutex ); } +#endif + /** * For warning, when stuff had to be removed/replaced * level must be >=1 (1=factory, 2=vechiles, 3=not so important) Index: utils/simthread.cc =================================================================== --- utils/simthread.cc (revision 7373) +++ utils/simthread.cc (working copy) @@ -1,6 +1,8 @@ #include "simthread.h" -#if defined(_USE_POSIX_BARRIERS) || !defined(MULTI_THREAD) +#ifdef MULTI_THREAD + +#if defined(_USE_POSIX_BARRIERS) // use native pthread barriers // (and do not try to compile this file for non-multithread builds) #else @@ -52,5 +54,15 @@ return 0; } } +#endif + +void simthread_init_recursive_mutex(pthread_mutex_t *mutex) { + pthread_mutexattr_t attr; + + pthread_mutexattr_init( &attr ); + pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE_NP ); + pthread_mutex_init( mutex, &attr ); + pthread_mutexattr_destroy( &attr ); +} #endif Index: utils/simthread.h =================================================================== --- utils/simthread.h (revision 7373) +++ utils/simthread.h (working copy) @@ -52,6 +52,8 @@ #endif +void simthread_init_recursive_mutex(pthread_mutex_t *mutex); + #endif #endif