Add host critical section for the host implementation of tryenter as well
This commit is contained in:
parent
fbbb138f86
commit
c2810bed40
|
@ -88,36 +88,46 @@ static CRITICAL_SECTION* find_critical_section(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void InitHostCriticalSection(xboxkrnl::PRTL_CRITICAL_SECTION xbox_crit_secion)
|
static void InitHostCriticalSection(xboxkrnl::PRTL_CRITICAL_SECTION xbox_crit_section)
|
||||||
{
|
{
|
||||||
CRITICAL_SECTION host_crit_section;
|
CRITICAL_SECTION host_crit_section;
|
||||||
InitializeCriticalSection(&host_crit_section);
|
InitializeCriticalSection(&host_crit_section);
|
||||||
add_critical_section(xbox_crit_secion, host_crit_section);
|
add_critical_section(xbox_crit_section, host_crit_section);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void EnterHostCriticalSection(xboxkrnl::PRTL_CRITICAL_SECTION xbox_crit_secion)
|
static void EnterHostCriticalSection(xboxkrnl::PRTL_CRITICAL_SECTION xbox_crit_section)
|
||||||
{
|
{
|
||||||
// This is required because it is possible for a game to create a critical
|
// This is required because it is possible for a game to create a critical
|
||||||
// section without calling RtlInitializeCriticalSection, which means that
|
// section without calling RtlInitializeCriticalSection, which means that
|
||||||
// there is no host critical section. This hack allows us to create the
|
// there is no host critical section. This hack allows us to create the
|
||||||
// missing critical section. The real Xbox RtlEnterCriticalSection function
|
// missing critical section. The real Xbox RtlEnterCriticalSection function
|
||||||
// does not create a critical section if it does not exist.
|
// does not create a critical section if it does not exist.
|
||||||
CRITICAL_SECTION* host_crit_section = find_critical_section(xbox_crit_secion);
|
CRITICAL_SECTION* host_crit_section = find_critical_section(xbox_crit_section);
|
||||||
if(host_crit_section == NULL) {
|
if(host_crit_section == NULL) {
|
||||||
InitHostCriticalSection(xbox_crit_secion);
|
InitHostCriticalSection(xbox_crit_section);
|
||||||
host_crit_section = find_critical_section(xbox_crit_secion);
|
host_crit_section = find_critical_section(xbox_crit_section);
|
||||||
}
|
}
|
||||||
EnterCriticalSection(host_crit_section);
|
EnterCriticalSection(host_crit_section);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void LeaveHostCriticalSection(xboxkrnl::PRTL_CRITICAL_SECTION xbox_crit_secion)
|
static void LeaveHostCriticalSection(xboxkrnl::PRTL_CRITICAL_SECTION xbox_crit_section)
|
||||||
{
|
{
|
||||||
LeaveCriticalSection(find_critical_section(xbox_crit_secion));
|
LeaveCriticalSection(find_critical_section(xbox_crit_section));
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL TryEnterHostCriticalSection(xboxkrnl::PRTL_CRITICAL_SECTION xbox_crit_secion)
|
static BOOL TryEnterHostCriticalSection(xboxkrnl::PRTL_CRITICAL_SECTION xbox_crit_section)
|
||||||
{
|
{
|
||||||
return TryEnterCriticalSection(find_critical_section(xbox_crit_secion));
|
// This is required because it is possible for a game to create a critical
|
||||||
|
// section without calling RtlInitializeCriticalSection, which means that
|
||||||
|
// there is no host critical section. This hack allows us to create the
|
||||||
|
// missing critical section. The real Xbox RtlEnterCriticalSection function
|
||||||
|
// does not create a critical section if it does not exist.
|
||||||
|
CRITICAL_SECTION* host_crit_section = find_critical_section(xbox_crit_section);
|
||||||
|
if(host_crit_section == NULL) {
|
||||||
|
InitHostCriticalSection(xbox_crit_section);
|
||||||
|
host_crit_section = find_critical_section(xbox_crit_section);
|
||||||
|
}
|
||||||
|
return TryEnterCriticalSection(host_crit_section);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
|
|
Loading…
Reference in New Issue