st/wgl: add some mutex checking code

This would have caught the locking bug that was fixed in the earlier
"st/wgl: fix locking issue in stw_st_framebuffer_present_locked()"
patch.

v2: minor coding style changes by Brian.

Reviewed-by: Sinclair Yeh <syeh@vmware.com>
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
José Fonseca 2015-11-10 14:41:30 -07:00 committed by Brian Paul
parent 166769fe4b
commit a1c9feafd5

View file

@ -52,6 +52,28 @@ stw_st_framebuffer(struct st_framebuffer_iface *stfb)
return (struct stw_st_framebuffer *) stfb;
}
/**
* Is the given mutex held by the calling thread?
*/
static bool
own_mutex(const CRITICAL_SECTION *cs)
{
// We can't compare OwningThread with our thread handle/id (see
// http://stackoverflow.com/a/12675635 ) but we can compare with the
// OwningThread member of a critical section we know we own.
CRITICAL_SECTION dummy;
InitializeCriticalSection(&dummy);
EnterCriticalSection(&dummy);
if (0)
_debug_printf("%p %p\n", cs->OwningThread, dummy.OwningThread);
bool ret = cs->OwningThread == dummy.OwningThread;
LeaveCriticalSection(&dummy);
DeleteCriticalSection(&dummy);
return ret;
}
/**
* Remove outdated textures and create the requested ones.
*/
@ -165,6 +187,8 @@ stw_st_framebuffer_present_locked(HDC hdc,
struct stw_st_framebuffer *stwfb = stw_st_framebuffer(stfb);
struct pipe_resource *resource;
assert(own_mutex(&stwfb->fb->mutex));
resource = stwfb->textures[statt];
if (resource) {
stw_framebuffer_present_locked(hdc, stwfb->fb, resource);
@ -173,6 +197,8 @@ stw_st_framebuffer_present_locked(HDC hdc,
stw_framebuffer_unlock(stwfb->fb);
}
assert(!own_mutex(&stwfb->fb->mutex));
return TRUE;
}