Reloaded-Project / Reloaded.Hooks

Advanced native function hooks for x86, x64. Welcome to the next level!
GNU Lesser General Public License v3.0
213 stars 33 forks source link

Heavy concurrency during hook creation causes erratic runtime behaviour #16

Open goaaats opened 2 years ago

goaaats commented 2 years ago

Hi! We recently did a big refactor on our project that introduced parallel component/plugin loads, leading to a lot of hooks being created at the same time. This, on fast machines, seemingly leads to erratic runtime behaviour from reloaded-created hooks, such as:

Sadly, none of our devs are running into this, as it seemingly only happens to users on very fast machines, making it very hard to collect more details about the issue. We already placed a lock around Reloaded hook .ctors in order to have them succeed.

Switching to our MinHook-based backend that we have to troubleshoot issues like this, but don't use in production, resolves the issue. Disposing the misbehaving Reloaded hook, then recreating it at idle when no other hooks are being created, resolves the issue.

Is this a known problem/limitation? Is there anything we could do/log that could help with troubleshooting this?

Thanks!

Sewer56 commented 2 years ago

I never wrote Reloaded.Hooks with concurrency in mind as past the initial JIT overhead, the time to hook a function is usually negligible (<1ms).

That said, I can imagine at least two possible points of failure:

This is simply off the top of my head. I didn't look at the code much.
Based on your description, I'd imagine it would probably be the former.

Note: I'm currently on vacation and don't currently have access to a PC most of the time. I'll be home next weekend.