diff --git a/panda/src/express/trueClock.cxx b/panda/src/express/trueClock.cxx index 3ef225edd6..686bb59910 100644 --- a/panda/src/express/trueClock.cxx +++ b/panda/src/express/trueClock.cxx @@ -122,13 +122,42 @@ get_short_raw_time() { return time; } +//////////////////////////////////////////////////////////////////// +// Function: TrueClock::set_cpu_affinity, Win32 implementation +// Access: Published +// Description: +//////////////////////////////////////////////////////////////////// +typedef BOOL (WINAPI * PFNSETPROCESSAFFINITYMASK)(HANDLE, DWORD_PTR); +typedef BOOL (WINAPI * PFNGETPROCESSAFFINITYMASK)(HANDLE, PDWORD_PTR, PDWORD_PTR); + +bool TrueClock:: +set_cpu_affinity(PN_uint32 mask) const { + HMODULE hker = GetModuleHandle("kernel32"); + if (hker != 0) { + PFNGETPROCESSAFFINITYMASK gp = (PFNGETPROCESSAFFINITYMASK) + GetProcAddress(hker, "GetProcessAffinityMask"); + PFNSETPROCESSAFFINITYMASK sp = (PFNSETPROCESSAFFINITYMASK) + GetProcAddress(hker, "SetProcessAffinityMask"); + if (gp != 0 && sp != 0) { + DWORD proc_mask; + DWORD sys_mask; + if (gp(GetCurrentProcess(), &proc_mask, &sys_mask)) { + // make sure we don't reference CPUs that don't exist + proc_mask = mask & sys_mask; + if (proc_mask) { + return sp(GetCurrentProcess(), proc_mask); + } + } + } + } + return false; +} + //////////////////////////////////////////////////////////////////// // Function: TrueClock::Constructor, Win32 implementation // Access: Protected // Description: //////////////////////////////////////////////////////////////////// -typedef BOOL (WINAPI * PFNSETPROCESSAFFINITYMASK)(HANDLE, DWORD_PTR); - TrueClock:: TrueClock() { _error_count = 0; @@ -142,14 +171,7 @@ TrueClock() { _report_time_scale_time = 0.0; if (lock_to_one_cpu) { - HMODULE hker = GetModuleHandle("kernel32"); - if (hker != 0) { - PFNSETPROCESSAFFINITYMASK sp = (PFNSETPROCESSAFFINITYMASK) - GetProcAddress(hker, "SetProcessAffinityMask"); - if (sp != 0) { - sp(GetCurrentProcess(), 1); - } - } + set_cpu_affinity(0x01); } if (get_use_high_res_clock()) { @@ -555,6 +577,16 @@ get_short_raw_time() { return (double)(tv.tv_sec - _init_sec) + (double)tv.tv_usec / 1000000.0; } +//////////////////////////////////////////////////////////////////// +// Function: TrueClock::set_cpu_affinity, Posix implementation +// Access: Published +// Description: +//////////////////////////////////////////////////////////////////// +bool TrueClock:: +set_cpu_affinity(PN_int32 mask) { + return false; +} + //////////////////////////////////////////////////////////////////// // Function: TrueClock::Constructor, Posix implementation // Access: Protected diff --git a/panda/src/express/trueClock.h b/panda/src/express/trueClock.h index 59c9d70533..86a284f5a5 100644 --- a/panda/src/express/trueClock.h +++ b/panda/src/express/trueClock.h @@ -62,6 +62,8 @@ PUBLISHED: INLINE static TrueClock *get_global_ptr(); + bool set_cpu_affinity(PN_uint32 mask) const; + protected: TrueClock(); INLINE ~TrueClock();