Alexandre,
The idea is that active_hooks is a shortcut to avoid calling the server if we know that a hook is not set. If we don't have a valid active_hooks then we need to call the server, which will then tell us whether or not we really have a hook to call.
I don't know if this matters, but when I add more debug (+hook,+msg) I don't see the problem. Could be a coincidence. Anyway, I have added some debug information and my theory that thread_info->active_hooks being 0 is true. With your explanation of the code I think I have a pretty good understanding of what is supposed to happen -- but something is strange. It appears that even after a trip to the server thread_info->active_hooks is 0. I have stared at code but I don't see how this can be the case.
HOOK_CallHooks() we have code that looks like:
// Understanding Alexandre's explanation, it is very valid to skip past // this call if we still need to get active_hooks from the server. if (!HOOK_IsHooked( id )) return;
tid = 0; MyDebugOriginalActiveHooks = thread_info->active_hooks;
SERVER_START_REQ( start_hook_chain ) { if (!wine_server_call( req )) { tid = reply->tid; thread_info->active_hooks = reply->active_hooks; } }
if (tid) { switch(id) { default: ERR("Unknown hook id %d\n", id); FIXME("Original Hooks = %x; CurrentHooks = %x", MyDebugOriginalActiveHooks, thread_info->active_hooks); assert(0); } }
We hit the assert and the active_hooks are 0 before and after the call to the server. Since tid is non-zero it means we hit the server successfully. I must be missing something really basic.
Phil