Support thread handles in WaitForSingleObject.

Some codecs need this for clean shutdown (as opposed to a crash); we don't 
really support timed wait since POSIX doesn't, but it doesn't seem necessary.


git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30843 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
sesse 2010-03-05 11:11:47 +00:00
parent de6f717b09
commit 61f351dc90
1 changed files with 29 additions and 5 deletions

View File

@ -569,16 +569,28 @@ static HMODULE WINAPI expGetDriverModuleHandle(DRVR* pdrv)
#define MODULE_HANDLE_winmm ((HMODULE)0x128)
#define MODULE_HANDLE_psapi ((HMODULE)0x129)
/* fake EXE struct to make msvcrt8+ not to crash:
it checks all exe sections for a section named .mixcrt
we fake a section with that name, so the crt will avoid
using Encode/Decode Pointer, as we was a posix binary */
static const struct {
IMAGE_DOS_HEADER doshdr;
IMAGE_NT_HEADERS nthdr;
IMAGE_SECTION_HEADER opthdr;
} __attribute__((__packed__)) mp_exe = {
.doshdr.e_lfanew = sizeof(IMAGE_DOS_HEADER),
.nthdr.FileHeader.NumberOfSections = 1,
.nthdr.FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_NT_HEADERS) - FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader), /* 0xe0 */
.opthdr.Name = ".mixcrt"
};
static HMODULE WINAPI expGetModuleHandleA(const char* name)
{
WINE_MODREF* wm;
HMODULE result;
if(!name)
#ifdef CONFIG_QTX_CODECS
result=1;
#else
result=0;
#endif
result=(HMODULE)&mp_exe.doshdr;
else
{
wm=MODULE_FindModule(name);
@ -787,6 +799,7 @@ static void* WINAPI expWaitForSingleObject(void* object, int duration)
// FIXME FIXME FIXME - this value is sometime unititialize !!!
int ret = WAIT_FAILED;
mutex_list* pp=mlist;
th_list* tp=list;
if(object == (void*)0xcfcf9898)
{
/**
@ -802,6 +815,17 @@ static void* WINAPI expWaitForSingleObject(void* object, int duration)
}
dbgprintf("WaitForSingleObject(0x%x, duration %d) =>\n",object, duration);
// See if this is a thread.
while (tp && (tp->thread != object))
tp = tp->prev;
if (tp) {
if (pthread_join(*(pthread_t*)object, NULL) == 0) {
return (void*)WAIT_OBJECT_0;
} else {
return (void*)WAIT_FAILED;
}
}
// loop below was slightly fixed - its used just for checking if
// this object really exists in our list
if (!ml)