mirror of https://github.com/mpv-player/mpv
Make Win32 mutex and thread linked lists thread safe.
loader/win32.c contains a global linked list of all existing mutexes (whose head is called mlist), which is accessed from multiple threads, and as such needs to be protected by a mutex. Fixed. Same thing for the global linked list of all existing threads, whose head is called list. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30851 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
dd491c0d28
commit
474c365479
|
@ -240,6 +240,7 @@ typedef struct th_list_t{
|
|||
//static int heap_counter=0;
|
||||
static tls_t* g_tls=NULL;
|
||||
static th_list* list=NULL;
|
||||
static pthread_mutex_t list_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
#if 0
|
||||
static void test_heap(void)
|
||||
|
@ -638,6 +639,7 @@ static void* WINAPI expCreateThread(void* pSecAttr, long dwStackSize,
|
|||
printf( "WARNING: CreateThread flags not supported\n");
|
||||
if(dwThreadId)
|
||||
*dwThreadId=(long)pth;
|
||||
pthread_mutex_lock(&list_lock);
|
||||
if(list==NULL)
|
||||
{
|
||||
list=my_mreq(sizeof(th_list), 1);
|
||||
|
@ -651,6 +653,7 @@ static void* WINAPI expCreateThread(void* pSecAttr, long dwStackSize,
|
|||
list=list->next;
|
||||
}
|
||||
list->thread=pth;
|
||||
pthread_mutex_unlock(&list_lock);
|
||||
dbgprintf("CreateThread(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x) => 0x%x\n",
|
||||
pSecAttr, dwStackSize, lpStartAddress, lpParameter, dwFlags, dwThreadId, pth);
|
||||
return pth;
|
||||
|
@ -672,9 +675,11 @@ struct mutex_list_t
|
|||
};
|
||||
typedef struct mutex_list_t mutex_list;
|
||||
static mutex_list* mlist=NULL;
|
||||
static pthread_mutex_t mlist_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
void destroy_event(void* event)
|
||||
{
|
||||
pthread_mutex_lock(&mlist_lock);
|
||||
mutex_list* pp=mlist;
|
||||
// printf("garbage collector: destroy_event(%x)\n", event);
|
||||
while(pp)
|
||||
|
@ -696,10 +701,12 @@ void destroy_event(void* event)
|
|||
}
|
||||
printf("0\n");
|
||||
*/
|
||||
pthread_mutex_unlock(&mlist_lock);
|
||||
return;
|
||||
}
|
||||
pp=pp->prev;
|
||||
}
|
||||
pthread_mutex_unlock(&mlist_lock);
|
||||
}
|
||||
|
||||
static void* WINAPI expCreateEventA(void* pSecAttr, char bManualReset,
|
||||
|
@ -707,6 +714,7 @@ static void* WINAPI expCreateEventA(void* pSecAttr, char bManualReset,
|
|||
{
|
||||
pthread_mutex_t *pm;
|
||||
pthread_cond_t *pc;
|
||||
void *ret;
|
||||
/*
|
||||
mutex_list* pp;
|
||||
pp=mlist;
|
||||
|
@ -717,6 +725,7 @@ static void* WINAPI expCreateEventA(void* pSecAttr, char bManualReset,
|
|||
}
|
||||
printf("0\n");
|
||||
*/
|
||||
pthread_mutex_lock(&mlist_lock);
|
||||
if(mlist!=NULL)
|
||||
{
|
||||
mutex_list* pp=mlist;
|
||||
|
@ -727,6 +736,7 @@ static void* WINAPI expCreateEventA(void* pSecAttr, char bManualReset,
|
|||
{
|
||||
dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, 0x%x='%s') => 0x%x\n",
|
||||
pSecAttr, bManualReset, bInitialState, name, name, pp->pm);
|
||||
pthread_mutex_unlock(&mlist_lock);
|
||||
return pp->pm;
|
||||
}
|
||||
}while((pp=pp->prev) != NULL);
|
||||
|
@ -768,7 +778,9 @@ static void* WINAPI expCreateEventA(void* pSecAttr, char bManualReset,
|
|||
else
|
||||
dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, NULL) => 0x%x\n",
|
||||
pSecAttr, bManualReset, bInitialState, mlist);
|
||||
return mlist;
|
||||
ret = mlist;
|
||||
pthread_mutex_unlock(&mlist_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void* WINAPI expSetEvent(void* event)
|
||||
|
@ -800,8 +812,8 @@ static void* WINAPI expWaitForSingleObject(void* object, int duration)
|
|||
mutex_list *ml = (mutex_list *)object;
|
||||
// FIXME FIXME FIXME - this value is sometime unititialize !!!
|
||||
int ret = WAIT_FAILED;
|
||||
mutex_list* pp=mlist;
|
||||
th_list* tp=list;
|
||||
mutex_list* pp;
|
||||
th_list* tp;
|
||||
if(object == (void*)0xcfcf9898)
|
||||
{
|
||||
/**
|
||||
|
@ -818,8 +830,11 @@ static void* WINAPI expWaitForSingleObject(void* object, int duration)
|
|||
dbgprintf("WaitForSingleObject(0x%x, duration %d) =>\n",object, duration);
|
||||
|
||||
// See if this is a thread.
|
||||
pthread_mutex_lock(&list_lock);
|
||||
tp=list;
|
||||
while (tp && (tp->thread != object))
|
||||
tp = tp->prev;
|
||||
pthread_mutex_unlock(&list_lock);
|
||||
if (tp) {
|
||||
if (pthread_join(*(pthread_t*)object, NULL) == 0) {
|
||||
return (void*)WAIT_OBJECT_0;
|
||||
|
@ -832,8 +847,11 @@ static void* WINAPI expWaitForSingleObject(void* object, int duration)
|
|||
// this object really exists in our list
|
||||
if (!ml)
|
||||
return (void*) ret;
|
||||
pthread_mutex_lock(&mlist_lock);
|
||||
pp=mlist;
|
||||
while (pp && (pp->pm != ml->pm))
|
||||
pp = pp->prev;
|
||||
pthread_mutex_unlock(&mlist_lock);
|
||||
if (!pp) {
|
||||
dbgprintf("WaitForSingleObject: NotFound\n");
|
||||
return (void*)ret;
|
||||
|
@ -1801,6 +1819,7 @@ static HANDLE WINAPI expCreateSemaphoreA(char* v1, long init_count,
|
|||
{
|
||||
pthread_mutex_t *pm;
|
||||
pthread_cond_t *pc;
|
||||
HANDLE ret;
|
||||
/*
|
||||
mutex_list* pp;
|
||||
printf("CreateSemaphoreA(%p = %s)\n", name, (name ? name : "<null>"));
|
||||
|
@ -1812,6 +1831,7 @@ static HANDLE WINAPI expCreateSemaphoreA(char* v1, long init_count,
|
|||
}
|
||||
printf("0\n");
|
||||
*/
|
||||
pthread_mutex_lock(&mlist_lock);
|
||||
if(mlist!=NULL)
|
||||
{
|
||||
mutex_list* pp=mlist;
|
||||
|
@ -1822,7 +1842,9 @@ static HANDLE WINAPI expCreateSemaphoreA(char* v1, long init_count,
|
|||
{
|
||||
dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0x%x='%s') => 0x%x\n",
|
||||
v1, init_count, max_count, name, name, mlist);
|
||||
return (HANDLE)mlist;
|
||||
ret = (HANDLE)mlist;
|
||||
pthread_mutex_unlock(&mlist_lock);
|
||||
return ret;
|
||||
}
|
||||
}while((pp=pp->prev) != NULL);
|
||||
}
|
||||
|
@ -1861,7 +1883,9 @@ static HANDLE WINAPI expCreateSemaphoreA(char* v1, long init_count,
|
|||
else
|
||||
dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0) => 0x%x\n",
|
||||
v1, init_count, max_count, mlist);
|
||||
return (HANDLE)mlist;
|
||||
ret = (HANDLE)mlist;
|
||||
pthread_mutex_unlock(&mlist_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long WINAPI expReleaseSemaphore(long hsem, long increment, long* prev_count)
|
||||
|
@ -5662,5 +5686,7 @@ void my_garbagecollection(void)
|
|||
dbgprintf("Total Unfree %d bytes cnt %d [%p,%d]\n",unfree, unfreecnt, last_alloc, alccnt);
|
||||
#endif
|
||||
g_tls = NULL;
|
||||
pthread_mutex_lock(&list_lock);
|
||||
list = NULL;
|
||||
pthread_mutex_unlock(&list_lock);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue