Vincent Povirk : windowscodecs: Add locking to the format converter.
Alexandre Julliard
julliard at winehq.org
Tue Apr 13 11:24:39 CDT 2010
Module: wine
Branch: master
Commit: c1beb63609254e67fbdbd669174f6c6695a60ed9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c1beb63609254e67fbdbd669174f6c6695a60ed9
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Fri Apr 9 14:18:15 2010 -0500
windowscodecs: Add locking to the format converter.
---
dlls/windowscodecs/converter.c | 39 +++++++++++++++++++++++++++++++--------
dlls/windowscodecs/regsvr.c | 2 +-
2 files changed, 32 insertions(+), 9 deletions(-)
diff --git a/dlls/windowscodecs/converter.c b/dlls/windowscodecs/converter.c
index 15c7b0f..b1c0952 100644
--- a/dlls/windowscodecs/converter.c
+++ b/dlls/windowscodecs/converter.c
@@ -71,6 +71,7 @@ typedef struct FormatConverter {
WICBitmapDitherType dither;
double alpha_threshold;
WICBitmapPaletteType palette_type;
+ CRITICAL_SECTION lock; /* must be held when initialized */
} FormatConverter;
static void make_grayscale_palette(WICColor *colors, UINT num_colors)
@@ -765,6 +766,8 @@ static ULONG WINAPI FormatConverter_Release(IWICFormatConverter *iface)
if (ref == 0)
{
+ This->lock.DebugInfo->Spare[0] = 0;
+ DeleteCriticalSection(&This->lock);
if (This->source) IWICBitmapSource_Release(This->source);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -841,38 +844,56 @@ static HRESULT WINAPI FormatConverter_Initialize(IWICFormatConverter *iface,
const struct pixelformatinfo *srcinfo, *dstinfo;
static INT fixme=0;
GUID srcFormat;
- HRESULT res;
+ HRESULT res=S_OK;
TRACE("(%p,%p,%s,%u,%p,%0.1f,%u)\n", iface, pISource, debugstr_guid(dstFormat),
dither, pIPalette, alphaThresholdPercent, paletteTranslate);
if (pIPalette && !fixme++) FIXME("ignoring palette\n");
- if (This->source) return WINCODEC_ERR_WRONGSTATE;
+ EnterCriticalSection(&This->lock);
+
+ if (This->source)
+ {
+ res = WINCODEC_ERR_WRONGSTATE;
+ goto end;
+ }
res = IWICBitmapSource_GetPixelFormat(pISource, &srcFormat);
- if (FAILED(res)) return res;
+ if (FAILED(res)) goto end;
srcinfo = get_formatinfo(&srcFormat);
- if (!srcinfo) return WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT;
+ if (!srcinfo)
+ {
+ res = WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT;
+ goto end;
+ }
dstinfo = get_formatinfo(dstFormat);
- if (!dstinfo) return WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT;
+ if (!dstinfo)
+ {
+ res = WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT;
+ goto end;
+ }
if (dstinfo->copy_function)
{
IWICBitmapSource_AddRef(pISource);
- This->source = pISource;
This->src_format = srcinfo;
This->dst_format = dstinfo;
This->dither = dither;
This->alpha_threshold = alphaThresholdPercent;
This->palette_type = paletteTranslate;
+ This->source = pISource;
}
else
- return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+ res = WINCODEC_ERR_UNSUPPORTEDOPERATION;
- return S_OK;
+end:
+
+ LeaveCriticalSection(&This->lock);
+
+ return res;
}
static HRESULT WINAPI FormatConverter_CanConvert(IWICFormatConverter *iface,
@@ -930,6 +951,8 @@ HRESULT FormatConverter_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** p
This->lpVtbl = &FormatConverter_Vtbl;
This->ref = 1;
This->source = NULL;
+ InitializeCriticalSection(&This->lock);
+ This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": FormatConverter.lock");
ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv);
IUnknown_Release((IUnknown*)This);
diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c
index 69ea4cc..334ce85 100644
--- a/dlls/windowscodecs/regsvr.c
+++ b/dlls/windowscodecs/regsvr.c
@@ -781,7 +781,7 @@ static struct regsvr_coclass const coclass_list[] = {
"WIC Default Format Converter",
NULL,
"windowscodecs.dll",
- "Apartment"
+ "Both"
},
{ NULL } /* list terminator */
};
More information about the wine-cvs
mailing list