Mercurial > mplayer.hg
view loader/dshow/cmediasample.h @ 30795:1001c606f94c
Make emulated Win32 critical sections thread safe.
Earlier, cs->locked was accessed outside the mutex to get around
the problem that default pthread mutexes are not recursive
(ie., you cannot do a double-lock from the same thread), causing
a thread-safety problem, as both detected by Helgrind and showing
up in some multithreaded codecs.
The ideal solution here would be to simply use recursive pthread
mutexes, but there were concerns about reduced debuggability and
possibly portability. Thus, instead, rewrite the critical sections
to be a simple lock count (with owner) protected by a regular mutex.
Whenever a thread wants to enter the critical section and lock_count
is not 0, it sleeps on a special event that tells it when the
critical section is available.
author | sesse |
---|---|
date | Thu, 04 Mar 2010 15:57:08 +0000 |
parents | a8ea87c71d18 |
children |
line wrap: on
line source
#ifndef MPLAYER_CMEDIASAMPLE_H #define MPLAYER_CMEDIASAMPLE_H #include "interfaces.h" #include "guids.h" typedef struct CMediaSample CMediaSample; struct CMediaSample { IMediaSample_vt* vt; DECLARE_IUNKNOWN(); IMemAllocator* all; int size; int actual_size; char* block; char* own_block; int isPreroll; int isSyncPoint; int isDiscontinuity; LONGLONG time_start; LONGLONG time_end; AM_MEDIA_TYPE media_type; int type_valid; void ( *SetPointer) (CMediaSample* This, char* pointer); void ( *ResetPointer) (CMediaSample* This); // FIXME replace with Set & 0 }; CMediaSample* CMediaSampleCreate(IMemAllocator* allocator, int size); // called from allocator void CMediaSample_Destroy(CMediaSample* This); #endif /* MPLAYER_CMEDIASAMPLE_H */