tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

mozgbm.cpp (1657B)


      1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim:expandtab:shiftwidth=4:tabstop=4:
      3 */
      4 /* This Source Code Form is subject to the terms of the Mozilla Public
      5 * License, v. 2.0. If a copy of the MPL was not distributed with this
      6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      7 
      8 #include "prlink.h"
      9 
     10 #include <gbm.h>
     11 
     12 #define GET_FUNC(func, lib)                                  \
     13    func##_fn =                                              \
     14      (decltype(func##_fn))PR_FindFunctionSymbol(lib, #func) \
     15 
     16 #define IS_FUNC_LOADED(func)                                          \
     17    (func != nullptr)                                                 \
     18 
     19 static struct gbm_device * (*gbm_create_device_fn)(int fd);
     20 static void (*gbm_device_destroy_fn)(struct gbm_device* gbm);
     21 
     22 bool IsGBMLibraryLoaded() {
     23  static bool isLoaded =
     24         (IS_FUNC_LOADED(gbm_create_device_fn) &&
     25          IS_FUNC_LOADED(gbm_device_destroy_fn));
     26 
     27  return isLoaded;
     28 }
     29 
     30 bool LoadGBMLibrary() {
     31  static PRLibrary* gbmLib = nullptr;
     32  static bool gbmInitialized = false;
     33 
     34  //TODO Thread safe
     35  if (!gbmInitialized) {
     36    gbmInitialized = true;
     37    gbmLib = PR_LoadLibrary("libgbm.so.1");
     38    if (!gbmLib) {
     39      return false;
     40    }
     41 
     42    GET_FUNC(gbm_create_device, gbmLib);
     43    GET_FUNC(gbm_device_destroy, gbmLib);
     44  }
     45 
     46  return IsGBMLibraryLoaded();
     47 }
     48 
     49 struct gbm_device *
     50 gbm_create_device(int fd)
     51 {
     52  if (!LoadGBMLibrary()) {
     53    return nullptr;
     54  }
     55  return gbm_create_device_fn(fd);
     56 }
     57 
     58 void
     59 gbm_device_destroy(struct gbm_device* gbm)
     60 {
     61  if (!LoadGBMLibrary()) {
     62    return;
     63  }
     64  return gbm_device_destroy_fn(gbm);
     65 }