From: <hel...@us...> - 2007-07-13 18:24:48
|
Revision: 11065 http://svn.sourceforge.net/vegastrike/?rev=11065&view=rev Author: hellcatv Date: 2007-07-13 11:24:49 -0700 (Fri, 13 Jul 2007) Log Message: ----------- fixed race condition where string may have been potentially written to in one thread while read (and worse then c_strd) in another without any locking Modified Paths: -------------- trunk/vegastrike/src/aldrv/al_globals.h trunk/vegastrike/src/aldrv/al_sound.cpp trunk/vegastrike/src/cmd/music.cpp Modified: trunk/vegastrike/src/aldrv/al_globals.h =================================================================== --- trunk/vegastrike/src/aldrv/al_globals.h 2007-07-13 09:45:17 UTC (rev 11064) +++ trunk/vegastrike/src/aldrv/al_globals.h 2007-07-13 18:24:49 UTC (rev 11065) @@ -65,7 +65,7 @@ } }; -bool AUDLoadSoundFile(const std::string &s, struct AUDSoundProperties *info); +bool AUDLoadSoundFile(const char *s, struct AUDSoundProperties *info); // It is up to the caller to free(info.wave) after using!!! int AUDBufferSound(const struct AUDSoundProperties *info, bool music); Modified: trunk/vegastrike/src/aldrv/al_sound.cpp =================================================================== --- trunk/vegastrike/src/aldrv/al_sound.cpp 2007-07-13 09:45:17 UTC (rev 11064) +++ trunk/vegastrike/src/aldrv/al_sound.cpp 2007-07-13 18:24:49 UTC (rev 11065) @@ -452,11 +452,11 @@ using namespace VSFileSystem; -bool AUDLoadSoundFile(const std::string &s, struct AUDSoundProperties *info) { +bool AUDLoadSoundFile(const char *s, struct AUDSoundProperties *info) { VSFile f; - VSError error = f.OpenReadOnly( s.c_str(), SoundFile); + VSError error = f.OpenReadOnly( s, SoundFile); if (error>Ok) { - error = f.OpenReadOnly( s.c_str(), UnknownFile); + error = f.OpenReadOnly( s, UnknownFile); } info->shared=(error==Shared); @@ -538,7 +538,7 @@ if (wavbuf==NULL) { AUDSoundProperties info; - if (!AUDLoadSoundFile(s, &info)) { + if (!AUDLoadSoundFile(s.c_str(), &info)) { soundHash.Put(info.hashname,&nil_wavebuf); return -1; } Modified: trunk/vegastrike/src/cmd/music.cpp =================================================================== --- trunk/vegastrike/src/cmd/music.cpp 2007-07-13 09:45:17 UTC (rev 11064) +++ trunk/vegastrike/src/cmd/music.cpp 2007-07-13 18:24:49 UTC (rev 11065) @@ -359,17 +359,21 @@ if (me->killthread) break; me->music_loaded = false; me->music_load_info->success=false; + size_t len=me->music_load_info->hashname.length(); + char *songname = (char*)malloc(len+1); + songname[len]='\0'; + memcpy(songname,me->music_load_info->hashname.data(),len); #ifdef _WIN32 ReleaseMutex(me->musicinfo_mutex); #else pthread_mutex_unlock(&me->musicinfo_mutex); #endif { - std::string songname = me->music_load_info->hashname; if (!AUDLoadSoundFile(songname, me->music_load_info)) { - fprintf(stderr, "Failed to load song %s\n", songname.c_str()); + fprintf(stderr, "Failed to load song %s\n", songname); } } + free(songname); me->music_loaded = true; while (me->music_loaded) { micro_sleep(10000); // 10ms of busywait for now... wait until end of frame. |