blob: 83c9f1b5baab08e93d7552f61d8601bfe7ef39be [file] [log] [blame]
Saurabh Shah66c941b2016-07-06 17:34:05 -07001/*
2* Copyright (c) 2017, The Linux Foundation. All rights reserved.
3*
4* Redistribution and use in source and binary forms, with or without
5* modification, are permitted provided that the following conditions are
6* met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above
10* copyright notice, this list of conditions and the following
11* disclaimer in the documentation and/or other materials provided
12* with the distribution.
13* * Neither the name of The Linux Foundation nor the names of its
14* contributors may be used to endorse or promote products derived
15* from this software without specific prior written permission.
16*
17* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30#include <dlfcn.h>
31
32#include "drm_lib_loader.h"
33
34#define __CLASS__ "DRMLibLoader"
35
36using std::mutex;
37using std::lock_guard;
38
39namespace drm_utils {
40
41DRMLibLoader *DRMLibLoader::s_instance = nullptr;
42mutex DRMLibLoader::s_lock;
43
44DRMLibLoader *DRMLibLoader::GetInstance() {
45 lock_guard<mutex> obj(s_lock);
46
47 if (!s_instance) {
48 s_instance = new DRMLibLoader();
49 }
50
51 return s_instance;
52}
53
Saurabh Shahab7807c2017-02-08 15:41:08 -080054void DRMLibLoader::Destroy() {
55 lock_guard<mutex> obj(s_lock);
56 if (s_instance) {
57 delete s_instance;
58 s_instance = nullptr;
59 }
60}
61
Saurabh Shah66c941b2016-07-06 17:34:05 -070062DRMLibLoader::DRMLibLoader() {
63 if (Open("libsdedrm.so")) {
64 if (Sym("GetDRMManager", reinterpret_cast<void **>(&func_get_drm_manager_)) &&
65 Sym("DestroyDRMManager", reinterpret_cast<void **>(&func_destroy_drm_manager_))) {
66 is_loaded_ = true;
67 }
68 }
69}
70
Saurabh Shahab7807c2017-02-08 15:41:08 -080071DRMLibLoader::~DRMLibLoader() {
72 if (lib_) {
73 ::dlclose(lib_);
74 lib_ = nullptr;
75 }
76}
77
Saurabh Shah66c941b2016-07-06 17:34:05 -070078bool DRMLibLoader::Open(const char *lib_name) {
79 lib_ = ::dlopen(lib_name, RTLD_NOW);
80
81 return (lib_ != nullptr);
82}
83
84bool DRMLibLoader::Sym(const char *func_name, void **func_ptr) {
85 if (lib_) {
86 *func_ptr = ::dlsym(lib_, func_name);
87 }
88
89 return (*func_ptr != nullptr);
90}
91
92} // namespace drm_utils