Home | History | Annotate | Download | only in base
      1 /*
      2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef WEBRTC_BASE_LATEBINDINGSYMBOLTABLE_H_
     12 #define WEBRTC_BASE_LATEBINDINGSYMBOLTABLE_H_
     13 
     14 #include <string.h>
     15 
     16 #include "webrtc/base/common.h"
     17 
     18 namespace rtc {
     19 
     20 #if defined(WEBRTC_POSIX)
     21 typedef void *DllHandle;
     22 #else
     23 #error Not implemented for this platform
     24 #endif
     25 
     26 // This is the base class for "symbol table" classes to simplify the dynamic
     27 // loading of symbols from DLLs. Currently the implementation only supports
     28 // Linux and OS X, and pure C symbols (or extern "C" symbols that wrap C++
     29 // functions).  Sub-classes for specific DLLs are generated via the "supermacro"
     30 // files latebindingsymboltable.h.def and latebindingsymboltable.cc.def. See
     31 // talk/sound/pulseaudiosymboltable.(h|cc) for an example.
     32 class LateBindingSymbolTable {
     33  public:
     34   struct TableInfo {
     35     const char *dll_name;
     36     int num_symbols;
     37     // Array of size num_symbols.
     38     const char *const *symbol_names;
     39   };
     40 
     41   LateBindingSymbolTable(const TableInfo *info, void **table);
     42   ~LateBindingSymbolTable();
     43 
     44   bool IsLoaded() const;
     45   // Loads the DLL and the symbol table. Returns true iff the DLL and symbol
     46   // table loaded successfully.
     47   bool Load();
     48   // Like load, but allows overriding the dll path for when the dll path is
     49   // dynamic.
     50   bool LoadFromPath(const char *dll_path);
     51   void Unload();
     52 
     53   // Gets the raw OS handle to the DLL. Be careful what you do with it.
     54   DllHandle GetDllHandle() const { return handle_; }
     55 
     56  private:
     57   void ClearSymbols();
     58 
     59   const TableInfo *info_;
     60   void **table_;
     61   DllHandle handle_;
     62   bool undefined_symbols_;
     63 
     64   RTC_DISALLOW_COPY_AND_ASSIGN(LateBindingSymbolTable);
     65 };
     66 
     67 }  // namespace rtc
     68 
     69 #endif  // WEBRTC_BASE_LATEBINDINGSYMBOLTABLE_H_
     70