Jump to content
    1. Welcome to GTAForums!

    1. GTANet.com

    1. GTA Online

      1. The Criminal Enterprises
      2. Updates
      3. Find Lobbies & Players
      4. Guides & Strategies
      5. Vehicles
      6. Content Creator
      7. Help & Support
    2. Red Dead Online

      1. Blood Money
      2. Frontier Pursuits
      3. Find Lobbies & Outlaws
      4. Help & Support
    3. Crews

    1. Grand Theft Auto Series

      1. Bugs*
      2. St. Andrews Cathedral
    2. GTA VI

    3. GTA V

      1. Guides & Strategies
      2. Help & Support
    4. GTA IV

      1. The Lost and Damned
      2. The Ballad of Gay Tony
      3. Guides & Strategies
      4. Help & Support
    5. GTA San Andreas

      1. Classic GTA SA
      2. Guides & Strategies
      3. Help & Support
    6. GTA Vice City

      1. Classic GTA VC
      2. Guides & Strategies
      3. Help & Support
    7. GTA III

      1. Classic GTA III
      2. Guides & Strategies
      3. Help & Support
    8. Portable Games

      1. GTA Chinatown Wars
      2. GTA Vice City Stories
      3. GTA Liberty City Stories
    9. Top-Down Games

      1. GTA Advance
      2. GTA 2
      3. GTA
    1. Red Dead Redemption 2

      1. PC
      2. Help & Support
    2. Red Dead Redemption

    1. GTA Mods

      1. GTA V
      2. GTA IV
      3. GTA III, VC & SA
      4. Tutorials
    2. Red Dead Mods

      1. Documentation
    3. Mod Showroom

      1. Scripts & Plugins
      2. Maps
      3. Total Conversions
      4. Vehicles
      5. Textures
      6. Characters
      7. Tools
      8. Other
      9. Workshop
    4. Featured Mods

      1. Design Your Own Mission
      2. OpenIV
      3. GTA: Underground
      4. GTA: Liberty City
      5. GTA: State of Liberty
    1. Rockstar Games

    2. Rockstar Collectors

    1. Off-Topic

      1. General Chat
      2. Gaming
      3. Technology
      4. Movies & TV
      5. Music
      6. Sports
      7. Vehicles
    2. Expression

      1. Graphics / Visual Arts
      2. GFX Requests & Tutorials
      3. Writers' Discussion
      4. Debates & Discussion
    1. Announcements

    2. Support

    3. Suggestions

*DO NOT* SHARE MEDIA OR LINKS TO LEAKED COPYRIGHTED MATERIAL. Discussion is allowed.

[C++/SHV] Cleaning up threads in DllMain?


ikt
 Share

Recommended Posts

Figure this is more of a general Windows API issue, but seeing as someone might have also dealt with a similar issue, this might be a decent place to ask.

Note: This is not about script threads.

 

So I have an additional std::thread running, which periodically checks a "heartbeat". When the game is running, the heartbeat is live, and nothing happens. If that goes away, the additional thread places a call to turn off a peripheral. Basically, it's to cancel the active force feedback effect when the game gets paused.

 

It works well, but breaks when I try to clean up the tread in DllMain, where it enters a deadlock and SHV can't deal with it. Sadly, ScriptHookV does not have a pre-Unload callback so I can clean up my leftover stuff.

This seems to be an unavoidable problem when dealing with ("permanent") threads in ScriptHookV scripts. Does anyone have any experience with this, and ways to not break DllMain's DLL_PROCESS_DETACH case?

Here's a snippet of very basic (pseudo? didn't compile)-code which should reproduce the issue:
 

#include <main.h>

#include <Windows.h>

#include <atomic>
#include <thread>

std::atomic_bool g_RunThread = true;

void ScriptMain()
{
    std::thread([]()
    {
        while(g_RunThread)
        {
            // Non-game thread be here
        }
    }).detach();

    // Game "thread"
    while(true)
    {
        // Script logic be here
        WAIT(0);
    }
}

BOOL APIENTRY DllMain(HMODULE hInstance, DWORD reason, LPVOID lpReserved)
{
    switch (reason)
    {
    case DLL_PROCESS_ATTACH:
        scriptRegister(hInstance, ScriptMain);
        break;
    case DLL_PROCESS_DETACH:
        g_RunThread = false; // This deadlocks
        scriptUnregister(hInstance);
        break;
    }
    return TRUE;
}


For clarity, this is entirely expected behavior as DllMain locks stuff and Microsoft is very clear no waiting-for-thread-stuff should happen in DllMain. I'm just wondering if there are alternatives that solve a similar issue, where one needs an additional thread that runs regardless of game run state.

For my specific problem (cancelling force feedback), it should be possible to hook an OnGamePaused function, but I have no idea where to start that. But it'd remove the need for the thread.

-----

 

Small update: Went with checking PAD::IS_CONTROL_PRESSED(0, eControl::ControlFrontendPause) which works fine. I suppose that's also the best solution - avoid threading stuff in DLL cleanup at all costs :x

Edited by ikt
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • 1 User Currently Viewing
    0 members, 0 Anonymous, 1 Guest

×
×
  • Create New...

Important Information

By using GTAForums.com, you agree to our Terms of Use and Privacy Policy.