You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							188 lines
						
					
					
						
							6.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							188 lines
						
					
					
						
							6.7 KiB
						
					
					
				| /* | |
|     Copyright 2005-2013 Intel Corporation.  All Rights Reserved. | |
|  | |
|     This file is part of Threading Building Blocks. | |
|  | |
|     Threading Building Blocks is free software; you can redistribute it | |
|     and/or modify it under the terms of the GNU General Public License | |
|     version 2 as published by the Free Software Foundation. | |
|  | |
|     Threading Building Blocks is distributed in the hope that it will be | |
|     useful, but WITHOUT ANY WARRANTY; without even the implied warranty | |
|     of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
|     GNU General Public License for more details. | |
|  | |
|     You should have received a copy of the GNU General Public License | |
|     along with Threading Building Blocks; if not, write to the Free Software | |
|     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA | |
|  | |
|     As a special exception, you may use this file as part of a free software | |
|     library without restriction.  Specifically, if other files instantiate | |
|     templates or use macros or inline functions from this file, or you compile | |
|     this file and link it with other files to produce an executable, this | |
|     file does not by itself cause the resulting executable to be covered by | |
|     the GNU General Public License.  This exception does not however | |
|     invalidate any other reasons why the executable file might be covered by | |
|     the GNU General Public License. | |
| */ | |
| 
 | |
| #ifndef __TBB_runtime_loader_H | |
| #define __TBB_runtime_loader_H | |
|  | |
| #if ! TBB_PREVIEW_RUNTIME_LOADER | |
|     #error Set TBB_PREVIEW_RUNTIME_LOADER to include runtime_loader.h | |
| #endif | |
|  | |
| #include "tbb/tbb_stddef.h" | |
| #include <climits> | |
|  | |
| #if _MSC_VER | |
|     #if ! __TBB_NO_IMPLICIT_LINKAGE | |
|         #ifdef _DEBUG | |
|             #pragma comment( linker, "/nodefaultlib:tbb_debug.lib" ) | |
|             #pragma comment( linker, "/defaultlib:tbbproxy_debug.lib" ) | |
|         #else | |
|             #pragma comment( linker, "/nodefaultlib:tbb.lib" ) | |
|             #pragma comment( linker, "/defaultlib:tbbproxy.lib" ) | |
|         #endif | |
|     #endif | |
| #endif | |
|  | |
| namespace tbb { | |
| 
 | |
| namespace interface6 { | |
| 
 | |
| //! Load TBB at runtime. | |
| /*! | |
|  | |
| \b Usage: | |
|  | |
| In source code: | |
|  | |
| \code | |
| #include "tbb/runtime_loader.h" | |
|  | |
| char const * path[] = { "<install dir>/lib/ia32", NULL }; | |
| tbb::runtime_loader loader( path ); | |
|  | |
| // Now use TBB. | |
| \endcode | |
|  | |
| Link with \c tbbproxy.lib (or \c libtbbproxy.a) instead of \c tbb.lib (\c libtbb.dylib, | |
| \c libtbb.so). | |
|  | |
| TBB library will be loaded at runtime from \c <install dir>/lib/ia32 directory. | |
|  | |
| \b Attention: | |
|  | |
| All \c runtime_loader objects (in the same module, i.e. exe or dll) share some global state. | |
| The most noticeable piece of global state is loaded TBB library. | |
| There are some implications: | |
|  | |
|     -   Only one TBB library can be loaded per module. | |
|  | |
|     -   If one object has already loaded TBB library, another object will not load TBB. | |
|         If the loaded TBB library is suitable for the second object, both will use TBB | |
|         cooperatively, otherwise the second object will report an error. | |
|  | |
|     -   \c runtime_loader objects will not work (correctly) in parallel due to absence of | |
|         syncronization. | |
|  | |
| */ | |
| 
 | |
| class runtime_loader : tbb::internal::no_copy { | |
| 
 | |
|     public: | |
| 
 | |
|         //! Error mode constants. | |
|         enum error_mode { | |
|             em_status,     //!< Save status of operation and continue. | |
|             em_throw,      //!< Throw an exception of tbb::runtime_loader::error_code type. | |
|             em_abort       //!< Print message to \c stderr and call \c abort(). | |
|         }; // error_mode | |
|  | |
|         //! Error codes. | |
|         enum error_code { | |
|             ec_ok,         //!< No errors. | |
|             ec_bad_call,   //!< Invalid function call (e. g. load() called when TBB is already loaded). | |
|             ec_bad_arg,    //!< Invalid argument passed. | |
|             ec_bad_lib,    //!< Invalid library found (e. g. \c TBB_runtime_version symbol not found). | |
|             ec_bad_ver,    //!< TBB found but version is not suitable. | |
|             ec_no_lib      //!< No suitable TBB library found. | |
|         }; // error_code | |
|  | |
|         //! Initialize object but do not load TBB. | |
|         runtime_loader( error_mode mode = em_abort ); | |
| 
 | |
|         //! Initialize object and load TBB. | |
|         /*! | |
|             See load() for details. | |
|  | |
|             If error mode is \c em_status, call status() to check whether TBB was loaded or not. | |
|         */ | |
|         runtime_loader( | |
|             char const * path[],                           //!< List of directories to search TBB in. | |
|             int          min_ver = TBB_INTERFACE_VERSION,  //!< Minimal suitable version of TBB. | |
|             int          max_ver = INT_MAX,                //!< Maximal suitable version of TBB. | |
|             error_mode   mode    = em_abort                //!< Error mode for this object. | |
|         ); | |
| 
 | |
|         //! Destroy object. | |
|         ~runtime_loader(); | |
| 
 | |
|         //! Load TBB. | |
|         /*! | |
|             The method searches the directories specified in \c path[] array for the TBB library. | |
|             When the library is found, it is loaded and its version is checked. If the version is | |
|             not suitable, the library is unloaded, and the search continues. | |
|  | |
|             \b Note: | |
|  | |
|             For security reasons, avoid using relative directory names. For example, never load | |
|             TBB from current (\c "."), parent (\c "..") or any other relative directory (like | |
|             \c "lib" ). Use only absolute directory names (e. g. "/usr/local/lib"). | |
|  | |
|             For the same security reasons, avoid using system default directories (\c "") on | |
|             Windows. (See http://www.microsoft.com/technet/security/advisory/2269637.mspx for | |
|             details.) | |
|  | |
|             Neglecting these rules may cause your program to execute 3-rd party malicious code. | |
|  | |
|             \b Errors: | |
|                 -   \c ec_bad_call - TBB already loaded by this object. | |
|                 -   \c ec_bad_arg - \p min_ver and/or \p max_ver negative or zero, | |
|                     or \p min_ver > \p max_ver. | |
|                 -   \c ec_bad_ver - TBB of unsuitable version already loaded by another object. | |
|                 -   \c ec_no_lib - No suitable library found. | |
|         */ | |
|         error_code | |
|         load( | |
|             char const * path[],                           //!< List of directories to search TBB in. | |
|             int          min_ver = TBB_INTERFACE_VERSION,  //!< Minimal suitable version of TBB. | |
|             int          max_ver = INT_MAX                 //!< Maximal suitable version of TBB. | |
|  | |
|         ); | |
| 
 | |
| 
 | |
|         //! Report status. | |
|         /*! | |
|             If error mode is \c em_status, the function returns status of the last operation. | |
|         */ | |
|         error_code status(); | |
| 
 | |
|     private: | |
| 
 | |
|         error_mode const my_mode; | |
|         error_code       my_status; | |
|         bool             my_loaded; | |
| 
 | |
| }; // class runtime_loader | |
|  | |
| } // namespace interface6 | |
|  | |
| using interface6::runtime_loader; | |
| 
 | |
| } // namespace tbb | |
|  | |
| #endif /* __TBB_runtime_loader_H */ | |
| 
 |