Commit 4262513e authored by Kiran Pawar's avatar Kiran Pawar Committed by Aaron Plattner
Browse files

vdpau_wrapper.c: Track dynamic library handles and free them on exit using...


vdpau_wrapper.c: Track dynamic library handles and free them on exit using __attribute__((destructor))
Signed-off-by: default avatarKiran Pawar <kpawar@nvidia.com>
Tested-by: default avatarAaron Plattner <aplattner@nvidia.com>
Signed-off-by: default avatarAaron Plattner <aplattner@nvidia.com>
parent c4a2273e
...@@ -40,6 +40,17 @@ typedef void SetDllHandle( ...@@ -40,6 +40,17 @@ typedef void SetDllHandle(
void * driver_dll_handle void * driver_dll_handle
); );
static void * _vdp_backend_dll;
static void * _vdp_trace_dll;
static void * _vdp_driver_dll;
static VdpDeviceCreateX11 * _vdp_imp_device_create_x11_proc;
#if defined(__GNUC__)
static void _vdp_close_driver(void) __attribute__((destructor));
#endif
#if DEBUG #if DEBUG
static void _vdp_wrapper_error_breakpoint(char const * file, int line, char const * function) static void _vdp_wrapper_error_breakpoint(char const * file, int line, char const * function)
...@@ -87,23 +98,16 @@ static char * _vdp_get_driver_name_from_dri2( ...@@ -87,23 +98,16 @@ static char * _vdp_get_driver_name_from_dri2(
return driver_name; return driver_name;
} }
VdpStatus vdp_device_create_x11( static VdpStatus _vdp_open_driver(
Display * display, Display * display,
int screen, int screen)
/* output parameters follow */
VdpDevice * device,
VdpGetProcAddress * * get_proc_address
)
{ {
char const * vdpau_driver; char const * vdpau_driver;
char * vdpau_driver_dri2 = NULL; char * vdpau_driver_dri2 = NULL;
char vdpau_driver_lib[PATH_MAX]; char vdpau_driver_lib[PATH_MAX];
void * backend_dll;
char const * vdpau_trace; char const * vdpau_trace;
char const * func_name; char const * func_name;
VdpDeviceCreateX11 * vdp_imp_device_create_x11;
vdpau_driver = getenv("VDPAU_DRIVER"); vdpau_driver = getenv("VDPAU_DRIVER");
if (!vdpau_driver) { if (!vdpau_driver) {
vdpau_driver = vdpau_driver_dri2 = vdpau_driver = vdpau_driver_dri2 =
...@@ -125,13 +129,13 @@ VdpStatus vdp_device_create_x11( ...@@ -125,13 +129,13 @@ VdpStatus vdp_device_create_x11(
return VDP_STATUS_NO_IMPLEMENTATION; return VDP_STATUS_NO_IMPLEMENTATION;
} }
backend_dll = dlopen(vdpau_driver_lib, RTLD_NOW | RTLD_GLOBAL); _vdp_driver_dll = dlopen(vdpau_driver_lib, RTLD_NOW | RTLD_GLOBAL);
if (!backend_dll) { if (!_vdp_driver_dll) {
/* Try again using the old path, which is guaranteed to fit in PATH_MAX /* Try again using the old path, which is guaranteed to fit in PATH_MAX
* if the complete path fit above. */ * if the complete path fit above. */
snprintf(vdpau_driver_lib, sizeof(vdpau_driver_lib), DRIVER_LIB_FORMAT, snprintf(vdpau_driver_lib, sizeof(vdpau_driver_lib), DRIVER_LIB_FORMAT,
"", vdpau_driver, ""); "", vdpau_driver, "");
backend_dll = dlopen(vdpau_driver_lib, RTLD_NOW | RTLD_GLOBAL); _vdp_driver_dll = dlopen(vdpau_driver_lib, RTLD_NOW | RTLD_GLOBAL);
} }
if (vdpau_driver_dri2) { if (vdpau_driver_dri2) {
...@@ -139,26 +143,28 @@ VdpStatus vdp_device_create_x11( ...@@ -139,26 +143,28 @@ VdpStatus vdp_device_create_x11(
vdpau_driver_dri2 = NULL; vdpau_driver_dri2 = NULL;
} }
if (!backend_dll) { if (!_vdp_driver_dll) {
fprintf(stderr, "Failed to open VDPAU backend %s\n", dlerror()); fprintf(stderr, "Failed to open VDPAU backend %s\n", dlerror());
_VDP_ERROR_BREAKPOINT(); _VDP_ERROR_BREAKPOINT();
return VDP_STATUS_NO_IMPLEMENTATION; return VDP_STATUS_NO_IMPLEMENTATION;
} }
_vdp_backend_dll = _vdp_driver_dll;
vdpau_trace = getenv("VDPAU_TRACE"); vdpau_trace = getenv("VDPAU_TRACE");
if (vdpau_trace && atoi(vdpau_trace)) { if (vdpau_trace && atoi(vdpau_trace)) {
void * trace_dll;
SetDllHandle * set_dll_handle; SetDllHandle * set_dll_handle;
trace_dll = dlopen(VDPAU_MODULEDIR "/libvdpau_trace.so.1", RTLD_NOW | RTLD_GLOBAL); _vdp_trace_dll = dlopen(VDPAU_MODULEDIR "/libvdpau_trace.so.1",
if (!trace_dll) { RTLD_NOW | RTLD_GLOBAL);
if (!_vdp_trace_dll) {
fprintf(stderr, "Failed to open VDPAU trace library %s\n", dlerror()); fprintf(stderr, "Failed to open VDPAU trace library %s\n", dlerror());
_VDP_ERROR_BREAKPOINT(); _VDP_ERROR_BREAKPOINT();
return VDP_STATUS_NO_IMPLEMENTATION; return VDP_STATUS_NO_IMPLEMENTATION;
} }
set_dll_handle = (SetDllHandle*)dlsym( set_dll_handle = (SetDllHandle*)dlsym(
trace_dll, _vdp_trace_dll,
"vdp_trace_set_backend_handle" "vdp_trace_set_backend_handle"
); );
if (!set_dll_handle) { if (!set_dll_handle) {
...@@ -167,9 +173,9 @@ VdpStatus vdp_device_create_x11( ...@@ -167,9 +173,9 @@ VdpStatus vdp_device_create_x11(
return VDP_STATUS_NO_IMPLEMENTATION; return VDP_STATUS_NO_IMPLEMENTATION;
} }
set_dll_handle(backend_dll); set_dll_handle(_vdp_backend_dll);
backend_dll = trace_dll; _vdp_backend_dll = _vdp_trace_dll;
func_name = "vdp_trace_device_create_x11"; func_name = "vdp_trace_device_create_x11";
} }
...@@ -177,17 +183,52 @@ VdpStatus vdp_device_create_x11( ...@@ -177,17 +183,52 @@ VdpStatus vdp_device_create_x11(
func_name = "vdp_imp_device_create_x11"; func_name = "vdp_imp_device_create_x11";
} }
vdp_imp_device_create_x11 = (VdpDeviceCreateX11*)dlsym( _vdp_imp_device_create_x11_proc = (VdpDeviceCreateX11*)dlsym(
backend_dll, _vdp_backend_dll,
func_name func_name
); );
if (!vdp_imp_device_create_x11) { if (!_vdp_imp_device_create_x11_proc) {
fprintf(stderr, "%s\n", dlerror()); fprintf(stderr, "%s\n", dlerror());
_VDP_ERROR_BREAKPOINT(); _VDP_ERROR_BREAKPOINT();
return VDP_STATUS_NO_IMPLEMENTATION; return VDP_STATUS_NO_IMPLEMENTATION;
} }
return vdp_imp_device_create_x11( return VDP_STATUS_OK;
}
static void _vdp_close_driver(void)
{
if (_vdp_driver_dll) {
dlclose(_vdp_driver_dll);
_vdp_driver_dll = NULL;
}
if (_vdp_trace_dll) {
dlclose(_vdp_trace_dll);
_vdp_trace_dll = NULL;
}
_vdp_backend_dll = NULL;
_vdp_imp_device_create_x11_proc = NULL;
}
VdpStatus vdp_device_create_x11(
Display * display,
int screen,
/* output parameters follow */
VdpDevice * device,
VdpGetProcAddress * * get_proc_address
)
{
VdpStatus status;
if (!_vdp_imp_device_create_x11_proc) {
status = _vdp_open_driver(display, screen);
if (status != VDP_STATUS_OK) {
_vdp_close_driver();
return status;
}
}
return _vdp_imp_device_create_x11_proc(
display, display,
screen, screen,
device, device,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment