diff -r 114b036522a6 -r fcdb6e3a9d36 hedgewars/uAI.pas --- a/hedgewars/uAI.pas Tue Aug 27 06:05:03 2019 +0200 +++ b/hedgewars/uAI.pas Tue Aug 27 08:41:48 2019 +0200 @@ -38,20 +38,15 @@ CanUseAmmo: array [TAmmoType] of boolean; StopThinking: boolean; StartTicks: Longword; - ThinkThread: PSDL_Thread; - ThreadLock: PSDL_Mutex; + ThreadSem: PSDL_Sem; procedure FreeActionsList; begin AddFileLog('FreeActionsList called'); - if (ThinkThread <> nil) then - begin - StopThinking:= true; - SDL_WaitThread(ThinkThread, nil); - end; - SDL_LockMutex(ThreadLock); - ThinkThread:= nil; - SDL_UnlockMutex(ThreadLock); + + StopThinking:= true; + SDL_SemWait(ThreadSem); + SDL_SemPost(ThreadSem); if CurrentHedgehog <> nil then with CurrentHedgehog^ do @@ -522,18 +517,18 @@ end; Me^.State:= Me^.State and (not gstHHThinking); -SDL_LockMutex(ThreadLock); -ThinkThread:= nil; -SDL_UnlockMutex(ThreadLock); Think:= 0; +SDL_SemPost(ThreadSem); end; procedure StartThink(Me: PGear); +var ThinkThread: PSDL_Thread; begin if ((Me^.State and (gstAttacking or gstHHJumping or gstMoving)) <> 0) or isInMultiShoot then exit; +SDL_SemWait(ThreadSem); //DeleteCI(Me); // this will break demo/netplay Me^.State:= Me^.State or gstHHThinking; @@ -556,9 +551,8 @@ FillBonuses(((Me^.State and gstAttacked) <> 0) and (not isInMultiShoot) and ((GameFlags and gfInfAttack) = 0)); -SDL_LockMutex(ThreadLock); ThinkThread:= SDL_CreateThread(@Think, PChar('think'), Me); -SDL_UnlockMutex(ThreadLock); +SDL_DetachThread(ThinkThread); end; {$IFDEF DEBUGAI} @@ -610,14 +604,13 @@ procedure initModule; begin StartTicks:= 0; - ThinkThread:= nil; - ThreadLock:= SDL_CreateMutex(); + ThreadSem:= SDL_CreateSemaphore(1); end; procedure freeModule; begin FreeActionsList(); - SDL_DestroyMutex(ThreadLock); + SDL_DestroySemaphore(ThreadSem); end; end.