1/* 2 * Copyright 2013, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Ingo Weinhold <ingo_weinhold@gmx.de> 7 */ 8 9 10#include <package/solver/Solver.h> 11 12 13typedef BPackageKit::BSolver* CreateSolverFunction(); 14 15 16#include <dlfcn.h> 17#include <pthread.h> 18 19 20static CreateSolverFunction* sCreateSolver = NULL; 21 22static pthread_once_t sLoadLibsolvSolverAddOnInitOnce = PTHREAD_ONCE_INIT; 23 24 25static void 26load_libsolv_solver_add_on() 27{ 28 int flags = 0; 29#ifdef HAIKU_TARGET_PLATFORM_HAIKU 30 void* imageHandle = dlopen("libpackage-add-on-libsolv.so", flags); 31#else 32#ifdef HAIKU_HOST_PLATFORM_LINUX 33 flags = RTLD_LAZY | RTLD_LOCAL; 34#endif 35 void* imageHandle = dlopen("libpackage-add-on-libsolv_build.so", flags); 36#endif 37 if (imageHandle == NULL) 38 return; 39 40 sCreateSolver = (CreateSolverFunction*)dlsym(imageHandle, "create_solver"); 41 if (sCreateSolver == NULL) 42 dlclose(imageHandle); 43} 44 45 46namespace BPackageKit { 47 48 49BSolver::BSolver() 50{ 51} 52 53 54BSolver::~BSolver() 55{ 56} 57 58 59/*static*/ status_t 60BSolver::Create(BSolver*& _solver) 61{ 62 pthread_once(&sLoadLibsolvSolverAddOnInitOnce, &load_libsolv_solver_add_on); 63 if (sCreateSolver == NULL) 64 return B_NOT_SUPPORTED; 65 66 BSolver* solver = sCreateSolver(); 67 if (solver == NULL) 68 return B_NO_MEMORY; 69 70 status_t error = solver->Init(); 71 if (error != B_OK) { 72 delete solver; 73 return error; 74 } 75 76 _solver = solver; 77 return B_OK; 78} 79 80 81} // namespace BPackageKit 82