vrclient: Wait for pending command stream operations before IVRClientCore::Cleanup()

Command stream callbacks may try to access VR client objects.
This commit is contained in:
Józef Kucia 2018-04-19 16:11:32 +02:00
parent a1031dbce4
commit bd96c106ce
5 changed files with 60 additions and 5 deletions

View File

@ -180,8 +180,8 @@ method_overrides = [
]
method_overrides_data = [
("IVRClientCore", "struct client_core_data"),
("IVRCompositor", "struct compositor_data"),
("IVRClientCore", "struct client_core_data", None),
("IVRCompositor", "struct compositor_data", "destroy_compositor_data"),
]
def display_sdkver(s):
@ -359,7 +359,7 @@ def handle_method(cfile, classname, winclassname, cppname, method, cpp, cpp_h, e
cfile.write(")")
if is_method_overridden:
cfile.write(", %s" % iface_version[iface_version.find("_") + 1:].lstrip("0"))
for classname_pattern, user_data_type in method_overrides_data:
for classname_pattern, user_data_type, _ in method_overrides_data:
if classname_pattern in classname:
cfile.write(", &_this->user_data")
break
@ -448,7 +448,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(vrclient);
cfile.write("typedef struct __%s {\n" % winclassname)
cfile.write(" vtable_ptr *vtable;\n")
cfile.write(" void *linux_side;\n")
for classname_pattern, user_data_type in method_overrides_data:
for classname_pattern, user_data_type, _ in method_overrides_data:
if classname_pattern in classnode.spelling:
cfile.write(" %s user_data;\n" % user_data_type)
break
@ -477,6 +477,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(vrclient);
cfile.write(" return r;\n}\n\n")
cfile.write("void destroy_%s(void *object)\n{\n" % winclassname)
cfile.write(" TRACE(\"%p\\n\", object);\n")
for classname_pattern, user_data_type, user_data_destructor in method_overrides_data:
if user_data_destructor and classname_pattern in classnode.spelling:
cfile.write(" struct __%s *win_object = object;\n" % winclassname)
cfile.write(" %s(&win_object->user_data);\n" % user_data_destructor)
break
cfile.write(" HeapFree(GetProcessHeap(), 0, object);\n}\n\n")
cpp.write("#ifdef __cplusplus\n}\n#endif\n")

View File

@ -664,3 +664,17 @@ uint32_t ivrcompositor_get_vulkan_device_extensions_required(
return cpp_func(linux_side, phys_dev, value, bufsize);
}
void destroy_compositor_data(struct compositor_data *data)
{
IWineD3D11Device *wined3d_device;
TRACE("%p\n", data);
if ((wined3d_device = data->wined3d_device))
{
TRACE("Waiting for device %p\n", wined3d_device);
wined3d_device->lpVtbl->wait_idle(wined3d_device);
}
}

View File

@ -58,6 +58,8 @@ struct compositor_data
IWineD3D11Device *wined3d_device;
};
void destroy_compositor_data(struct compositor_data *data);
EVRInitError ivrclientcore_002_init(EVRInitError (*cpp_func)(void *, EVRApplicationType),
void *linux_side, EVRApplicationType application_type,
unsigned int version, struct client_core_data *user_data);

View File

@ -392,6 +392,8 @@ winIVRCompositor_IVRCompositor_022 *create_winIVRCompositor_IVRCompositor_022(vo
void destroy_winIVRCompositor_IVRCompositor_022(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_022 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -771,6 +773,8 @@ winIVRCompositor_IVRCompositor_021 *create_winIVRCompositor_IVRCompositor_021(vo
void destroy_winIVRCompositor_IVRCompositor_021(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_021 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -1134,6 +1138,8 @@ winIVRCompositor_IVRCompositor_020 *create_winIVRCompositor_IVRCompositor_020(vo
void destroy_winIVRCompositor_IVRCompositor_020(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_020 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -1489,6 +1495,8 @@ winIVRCompositor_IVRCompositor_019 *create_winIVRCompositor_IVRCompositor_019(vo
void destroy_winIVRCompositor_IVRCompositor_019(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_019 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -1828,6 +1836,8 @@ winIVRCompositor_IVRCompositor_018 *create_winIVRCompositor_IVRCompositor_018(vo
void destroy_winIVRCompositor_IVRCompositor_018(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_018 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -2142,6 +2152,8 @@ winIVRCompositor_IVRCompositor_016 *create_winIVRCompositor_IVRCompositor_016(vo
void destroy_winIVRCompositor_IVRCompositor_016(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_016 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -2472,6 +2484,8 @@ winIVRCompositor_IVRCompositor_015 *create_winIVRCompositor_IVRCompositor_015(vo
void destroy_winIVRCompositor_IVRCompositor_015(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_015 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -2738,6 +2752,8 @@ winIVRCompositor_IVRCompositor_014 *create_winIVRCompositor_IVRCompositor_014(vo
void destroy_winIVRCompositor_IVRCompositor_014(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_014 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -2988,6 +3004,8 @@ winIVRCompositor_IVRCompositor_013 *create_winIVRCompositor_IVRCompositor_013(vo
void destroy_winIVRCompositor_IVRCompositor_013(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_013 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -3230,6 +3248,8 @@ winIVRCompositor_IVRCompositor_012 *create_winIVRCompositor_IVRCompositor_012(vo
void destroy_winIVRCompositor_IVRCompositor_012(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_012 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -3456,6 +3476,8 @@ winIVRCompositor_IVRCompositor_011 *create_winIVRCompositor_IVRCompositor_011(vo
void destroy_winIVRCompositor_IVRCompositor_011(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_011 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -3682,6 +3704,8 @@ winIVRCompositor_IVRCompositor_010 *create_winIVRCompositor_IVRCompositor_010(vo
void destroy_winIVRCompositor_IVRCompositor_010(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_010 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -3908,6 +3932,8 @@ winIVRCompositor_IVRCompositor_009 *create_winIVRCompositor_IVRCompositor_009(vo
void destroy_winIVRCompositor_IVRCompositor_009(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_009 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -4150,6 +4176,8 @@ winIVRCompositor_IVRCompositor_008 *create_winIVRCompositor_IVRCompositor_008(vo
void destroy_winIVRCompositor_IVRCompositor_008(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_008 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -4336,6 +4364,8 @@ winIVRCompositor_IVRCompositor_007 *create_winIVRCompositor_IVRCompositor_007(vo
void destroy_winIVRCompositor_IVRCompositor_007(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_007 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -4530,6 +4560,8 @@ winIVRCompositor_IVRCompositor_006 *create_winIVRCompositor_IVRCompositor_006(vo
void destroy_winIVRCompositor_IVRCompositor_006(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_006 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}
@ -4756,6 +4788,8 @@ winIVRCompositor_IVRCompositor_005 *create_winIVRCompositor_IVRCompositor_005(vo
void destroy_winIVRCompositor_IVRCompositor_005(void *object)
{
TRACE("%p\n", object);
struct __winIVRCompositor_IVRCompositor_005 *win_object = object;
destroy_compositor_data(&win_object->user_data);
HeapFree(GetProcessHeap(), 0, object);
}

2
wine

@ -1 +1 @@
Subproject commit 1b8c5cf02b12c586f7a3a98530f25300113a8a5d
Subproject commit eb514943de9f0cb91dcde6c8d543c4fb2bdf7c3e