solving https://savannah.cern.ch/bugs/?72266 by introducing a map
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 6 Sep 2010 08:14:21 +0000 (08:14 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 6 Sep 2010 08:14:21 +0000 (08:14 +0000)
of dependencies for HLT component libraries in the AliHLTComponentHandler
this issues needs to solved later in a generic way, either generating this
dependency map automatically, or including dependencies in the linker also
in the aliroot build system.

HLT/BASE/AliHLTComponentHandler.cxx
HLT/BASE/AliHLTComponentHandler.h

index f68f914..068875a 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/** @file   AliHLTComponentHandler.cxx
-    @author Matthias Richter, Timm Steinbeck
-    @date   
-    @brief  Implementation of HLT component handler. */
+/// @file   AliHLTComponentHandler.cxx
+/// @author Matthias Richter, Timm Steinbeck
+/// @date   
+/// @brief  Implementation of HLT component handler.
+///
 
 // see header file for class documentation
 // or
@@ -104,6 +105,22 @@ AliHLTComponentHandler::AliHLTComponentHandler(AliHLTAnalysisEnvironment* pEnv)
   AddStandardComponents();
 }
 
+/*
+2010-09-06 TODO: This is a workaround for unresolved library dependencies
+with the aliroot build system. Some of the component libraries might need
+libraries not linked to the aliroot executable. I also tried to link component
+libraries to their dependencies in aliroot, but there is some awkward dependency
+and even a flaw in the build system leaving the library not built if the
+dependency was not found.
+Ideally we decouple library and component handler. The library handler needs to
+manage all dependencies, the unload-problem, etc.
+This issue is releated to https://savannah.cern.ch/task/?16325
+*/
+const std::pair<const char*, const char*> AliHLTComponentHandler::fgkLibDep[] = {
+  make_pair("libAliHLTUtil.so", "libANALYSIS.so"),
+  make_pair("libAliHLTUtil.so", "libANALYSISalice.so")
+};
+
 AliHLTComponentHandler::~AliHLTComponentHandler()
 {
   // see header file for class documentation
@@ -389,7 +406,9 @@ int AliHLTComponentHandler::LoadLibrary( const char* libraryPath, int bActivateA
        hLib.fHandle=pRootHandle;
     }
     
-    if (hLib.fHandle==NULL && gSystem->Load(libraryPath)>=0) {
+    if (hLib.fHandle==NULL &&
+       LoadDependencies(libraryPath) >=0 &&
+       gSystem->Load(libraryPath)>=0) {
       int* pRootHandle=new int;
       if (pRootHandle) *pRootHandle=1;
       hLib.fHandle=pRootHandle;
@@ -452,6 +471,33 @@ int AliHLTComponentHandler::LoadLibrary( const char* libraryPath, int bActivateA
   return iResult;
 }
 
+int AliHLTComponentHandler::LoadDependencies( const char* libraryPath)
+{
+  // Load external library dependencies defined in a static array
+  if (!libraryPath) return -EINVAL;
+
+#ifndef HAVE_DLFCN_H
+  for (unsigned i=0; i<sizeof(fgkLibDep)/sizeof(fgkLibDep[0]); i++) {
+    if (strcmp(libraryPath, (fgkLibDep[i]).first)==0) {
+      HLTInfo("loading library dependency for %s: %s", libraryPath, (fgkLibDep[i]).second);
+      int result=gSystem->Load((fgkLibDep[i]).second);
+      if (result<0) {
+       HLTError("failed to load library dependency for %s: %s", libraryPath, (fgkLibDep[i]).second);
+       return result;
+      }
+    }
+  }
+#else
+  static bool bWarning=true;
+  if (bWarning) {
+    bWarning=false;
+    HLTWarning("function not supposed to be used with dlopen, all library dependencies need to be compiled in");
+  }
+#endif // !HAVE_DLFCN_H
+
+  return 0;
+}
+
 int AliHLTComponentHandler::UnloadLibrary( const char* libraryPath )
 {
   // see header file for class documentation
index f57be1e..149aa82 100644 (file)
@@ -1,18 +1,18 @@
 //-*- Mode: C++ -*-
-// @(#) $Id$
+// $Id$
 
 #ifndef ALIHLTCOMPONENTHANDLER_H
 #define ALIHLTCOMPONENTHANDLER_H
-/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
- * See cxx source for full Copyright notice                               */
+//* This file is property of and copyright by the ALICE HLT Project        * 
+//* ALICE Experiment at CERN, All rights reserved.                         *
+//* See cxx source for full Copyright notice                               *
 
-/** @file   AliHLTComponentHandler.h
-    @author Matthias Richter, Timm Steinbeck
-    @date   
-    @brief  Global handling of HLT processing components
-    @note   The handler is part of the interface and both used in the
-            Online (PubSub) and Offline (AliRoot) context.
-                                                                          */
+/// @file   AliHLTComponentHandler.h
+/// @author Matthias Richter, Timm Steinbeck
+/// @date   
+/// @brief  Global handling of HLT processing components
+/// @note   The handler is part of the interface and both used in the
+///         Online (PubSub) and Offline (AliRoot) context.
 
 // see below for class documentation
 // or
@@ -21,6 +21,7 @@
 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt   
 
 #include <vector>
+#include <utility>
 //#include "TObject.h"
 #include "AliHLTDataTypes.h"
 #include "AliHLTLogging.h"
@@ -103,6 +104,11 @@ class AliHLTComponentHandler : public AliHLTLogging {
   int LoadLibrary( const char* libraryPath, int bActivateAgents=1);
 
   /**
+   * Load external library dependencies defined in a static array.
+   */
+  int LoadDependencies( const char* libraryPath);
+
+  /**
    * Find a symbol in a dynamically loaded library.
    * @param library      library
    * @param symbol       the symbol to find
@@ -355,7 +361,9 @@ class AliHLTComponentHandler : public AliHLTLogging {
   /** the global singleton */
   static AliHLTComponentHandler* fgpInstance;                      //!transient
   /** number of used instances of the global singleton */
-  static int fgNofInstances;                                       //!transient 
+  static int fgNofInstances;                                       //!transient
+  /// library dependencies
+  static const std::pair<const char*, const char*> fgkLibDep[];    //!transient
 
   ClassDef(AliHLTComponentHandler, 2);