Mercurial > mplayer.hg
changeset 30801:500a36300757
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.
author | sesse |
---|---|
date | Fri, 05 Mar 2010 11:11:47 +0000 |
parents | d600373a8935 |
children | 3df1e29a3185 |
files | loader/win32.c |
diffstat | 1 files changed, 29 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/loader/win32.c Fri Mar 05 08:41:35 2010 +0000 +++ b/loader/win32.c Fri Mar 05 11:11:47 2010 +0000 @@ -569,16 +569,28 @@ #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 @@ // 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 @@ } 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)