On 6/25/20 9:56 PM, Gijs Vermeulen wrote:
@@ -1013,6 +1039,10 @@ static ULONG WINAPI ddraw_sample_Release(IDirectDrawStreamSample *iface)
TRACE("(%p)->(): new ref = %u\n", iface, ref);
- EnterCriticalSection(&sample->parent->cs);
- InterlockedDecrement(&sample->parent->sample_refs);
- LeaveCriticalSection(&sample->parent->cs);
- if (!ref) { if (sample->surface)
@@ -1131,6 +1161,10 @@ static HRESULT ddrawstreamsample_create(struct ddraw_stream *parent, IDirectDraw object->ref = 1; object->parent = parent;
- EnterCriticalSection(&parent->cs);
- InterlockedIncrement(&parent->sample_refs);
- LeaveCriticalSection(&parent->cs);
- if (surface) {
I know this was committed, but please take a look, I don't think it's consistent. Even if it works for now, it seems better to lock whole CreateSample(), and not just a fragment that touches this sample counter.
Release part looks wrong, because you probably don't want to decrement on every Release(), but only when ref == 0.
P.S. setting sample_refs to 0 initially is obviously also redundant.