SAGA Adaptor CPI v.1.0
|
00001 // Copyright (c) 2005-2009 Hartmut Kaiser 00002 // Copyright (c) 2005-2007 Andre Merzky (andre@merzky.net) 00003 // 00004 // Distributed under the Boost Software License, Version 1.0. (See accompanying 00005 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 00006 00007 #ifndef SAGA_SAGA_ADAPTORS_ADAPTOR_HPP 00008 #define SAGA_SAGA_ADAPTORS_ADAPTOR_HPP 00009 00010 #include <boost/thread/thread.hpp> 00011 #include <boost/thread/recursive_mutex.hpp> 00012 00013 #include <boost/version.hpp> 00014 #include <boost/plugin.hpp> 00015 #include <boost/plugin/export_plugin.hpp> 00016 #include <boost/thread.hpp> 00017 #include <boost/tokenizer.hpp> 00018 #include <boost/preprocessor/cat.hpp> 00019 #include <boost/preprocessor/stringize.hpp> 00020 00021 #include <saga/saga/adaptors/adaptor_data.hpp> 00022 #include <saga/saga/adaptors/adaptor_suite.hpp> 00023 #include <saga/saga/adaptors/adaptor_suite_data.hpp> 00024 #include <saga/saga/adaptors/utils/utils.hpp> 00025 00026 #include <saga/impl/engine/adaptor_selector.hpp> 00027 #include <saga/saga/uuid.hpp> 00028 00030 #ifndef SAGA_ADAPTOR_NAME 00031 # ifndef SAGA_ENGINE 00032 # error "SAGA_ADAPTOR_NAME needs to be defined for saga adaptor macros" 00033 # else 00034 # define SAGA_ADAPTOR_NAME engine // needed for get_name() 00035 # endif 00036 #endif 00037 00039 #ifndef SAGA_ADAPTOR_LIB_NAME 00040 #define SAGA_ADAPTOR_LIB_NAME \ 00041 BOOST_PP_CAT(libsaga_adaptor_, SAGA_ADAPTOR_NAME ) \ 00042 00043 #endif 00044 00046 namespace saga 00047 { 00048 // definition of cpi names 00049 namespace adaptors 00050 { 00051 // general usage 00052 char const* const attribute_cpi = "attribute_cpi"; 00053 char const* const permissions_cpi = "permissions_cpi"; 00054 00055 char const* const context_cpi = "context_cpi"; 00056 char const* const url_cpi = "url_cpi"; 00057 00058 // file package 00059 char const* const namespace_entry_cpi = "namespace_entry_cpi"; 00060 char const* const namespace_dir_cpi = "namespace_dir_cpi"; 00061 char const* const file_cpi = "file_cpi"; 00062 char const* const directory_cpi = "directory_cpi"; 00063 00064 // locical_file package 00065 char const* const logical_file_cpi = "logical_file_cpi"; 00066 char const* const logical_directory_cpi = "logical_directory_cpi"; 00067 00068 // job package 00069 char const* const job_cpi = "job_cpi"; 00070 char const* const job_service_cpi = "job_service_cpi"; 00071 00072 // stream package 00073 char const* const stream_cpi = "stream_cpi"; 00074 char const* const stream_server_cpi = "stream_server_cpi"; 00075 00076 // RPC package 00077 char const* const rpc_cpi = "rpc_cpi"; 00078 00079 // information services package 00080 char const* const advert_cpi = "advert_cpi"; 00081 char const* const advert_directory_cpi = "advert_directory_cpi"; 00082 00083 // Service discovery package 00084 char const* const discoverer_cpi = "discoverer_cpi"; 00085 00086 // cpr package 00087 char const* const cpr_job_cpi = "cpr_job_cpi"; 00088 char const* const cpr_job_service_cpi = "cpr_job_service_cpi"; 00089 char const* const cpr_checkpoint_cpi = "cpr_checkpoint_cpi"; 00090 char const* const cpr_directory_cpi = "cpr_directory_cpi"; 00091 00092 //Information System Navigator 00093 char const* const navigator_cpi = "navigator_cpi"; 00094 00095 // return the name of the implementing CPI for a saga object type 00096 inline std::string 00097 get_cpi_name(saga::object::type type) 00098 { 00099 switch (type) { 00100 case saga::object::Context: return context_cpi; 00101 case saga::object::URL: return url_cpi; 00102 case saga::object::NSEntry: return namespace_entry_cpi; 00103 case saga::object::NSDirectory: return namespace_dir_cpi; 00104 case saga::object::File: return file_cpi; 00105 case saga::object::Directory: return directory_cpi; 00106 case saga::object::LogicalFile: return logical_file_cpi; 00107 case saga::object::LogicalDirectory: return logical_directory_cpi; 00108 case saga::object::Job: return job_cpi; 00109 case saga::object::JobService: return job_service_cpi; 00110 case saga::object::Stream: return stream_cpi; 00111 case saga::object::StreamServer: return stream_server_cpi; 00112 case saga::object::RPC: return rpc_cpi; 00113 case saga::object::Advert: return advert_cpi; 00114 case saga::object::AdvertDirectory: return advert_directory_cpi; 00115 case saga::object::ServiceDiscoverer: return discoverer_cpi; 00116 case saga::object::CPRJob: return cpr_job_cpi; 00117 case saga::object::CPRJobService: return cpr_job_service_cpi; 00118 case saga::object::CPRCheckpoint: return cpr_checkpoint_cpi; 00119 case saga::object::CPRDirectory: return cpr_directory_cpi; 00120 case saga::object::EntityNavigator: return navigator_cpi; 00121 default: 00122 break; 00123 } 00124 return "Unknown"; 00125 } 00126 } 00127 00129 00130 class adaptor 00131 { 00132 private: 00133 // this mutex is used to synchronize access to the adaptor member data 00134 typedef boost::recursive_mutex mutex_type; 00135 mutex_type mtx_; 00136 00137 protected: 00138 // this uuid identifies the adaptor object 00139 saga::uuid adaptor_uuid_; 00140 00141 public: 00142 virtual ~adaptor (void) {} 00143 virtual impl::adaptor_selector::adaptor_info_list_type 00144 adaptor_register (saga::impl::session *) = 0; 00145 00146 // support functions for the adaptor_data helper class 00147 void lock_data() 00148 { 00149 #if BOOST_VERSION < 103500 00150 boost::detail::thread::lock_ops<mutex_type>::lock(mtx_); 00151 #else 00152 mtx_.lock(); 00153 #endif 00154 } 00155 void unlock_data() 00156 { 00157 #if BOOST_VERSION < 103500 00158 boost::detail::thread::lock_ops<mutex_type>::unlock(mtx_); 00159 #else 00160 mtx_.unlock(); 00161 #endif 00162 } 00163 00164 // access the identifying uuid of this adaptor 00165 saga::uuid const & get_uuid() const 00166 { 00167 return adaptor_uuid_; 00168 } 00169 00170 // access the identifying name of this adaptor 00171 virtual std::string get_name() const = 0; 00172 00173 00174 // get adaptor_suite, if any is available 00175 template <class Adaptor_Suite> 00176 Adaptor_Suite & get_adaptor_suite (void) 00177 { 00178 return saga::adaptors::utils::get_singleton <Adaptor_Suite> (); 00179 } 00180 00181 // initialize the adaptor using the preferences, return false to 00182 // cancel adaptor loading 00183 virtual bool init(saga::impl::session *, 00184 saga::ini::ini const& glob_ini, saga::ini::ini const& adap_ini) 00185 { return true; } 00186 }; 00189 } // namespace saga 00190 00192 // Forward the SAGA_ADAPTOR_REGISTER macro to the correct BOOST_PLUGIN macro 00193 // sequence 00194 #define SAGA_ADAPTOR_REGISTER(ActualType) \ 00195 BOOST_PLUGIN_EXPORT_LIST (SAGA_ADAPTOR_LIB_NAME) \ 00196 BOOST_PLUGIN_EXPORT (SAGA_ADAPTOR_LIB_NAME, saga::adaptor, \ 00197 ActualType, "adaptor"); \ 00198 00199 00200 #endif // SAGA_SAGA_ADAPTORS_ADAPTOR_HPP 00201