CppCMS
|
00001 00002 // 00003 // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com> 00004 // 00005 // See accompanying file COPYING.TXT file for licensing details. 00006 // 00008 #ifndef CPPCMS_SERVICE_H 00009 #define CPPCMS_SERVICE_H 00010 00011 #include <cppcms/defs.h> 00012 #include <booster/noncopyable.h> 00013 #include <booster/hold_ptr.h> 00014 #include <booster/function.h> 00015 #include <locale> 00016 #include <memory> 00017 #include <cppcms/locale_fwd.h> 00018 #include <cppcms/json.h> 00019 00020 namespace booster { 00021 namespace aio { 00022 class io_service; 00023 } 00024 } 00025 00029 namespace cppcms { 00030 namespace impl { 00031 struct cached_settings; 00032 class service; 00033 namespace cgi { 00034 class acceptor; 00035 } 00036 } 00037 00038 class applications_pool; 00039 class thread_pool; 00040 class session_pool; 00041 class cache_pool; 00042 class forwarder; 00043 00044 namespace json { 00045 class value; 00046 } 00047 namespace views { 00048 class manager; 00049 } 00050 00058 00059 class CPPCMS_API service : public booster::noncopyable 00060 { 00061 public: 00067 static json::value load_settings(int argc,char *argv[]); 00071 service(json::value const &v); 00078 service(int argc,char *argv[]); 00084 ~service(); 00085 00095 void run(); 00096 00100 void shutdown(); 00101 00105 json::value const &settings(); 00106 00110 cppcms::applications_pool &applications_pool(); 00114 cppcms::thread_pool &thread_pool(); 00118 cppcms::session_pool &session_pool(); 00122 cppcms::views::manager &views_pool(); 00126 cppcms::cache_pool &cache_pool(); 00130 cppcms::forwarder &forwarder(); 00131 00135 locale::generator const &generator(); 00139 std::locale locale(); 00143 std::locale locale(std::string const &name); 00144 00145 00150 booster::aio::io_service &get_io_service(); 00151 00156 void post(booster::function<void()> const &handler); 00157 00162 void after_fork(booster::function<void()> const &handler); 00163 00167 int threads_no(); 00168 00172 int procs_no(); 00173 00186 int process_id(); 00187 00189 00190 // internal functions never call it directly 00191 00192 cppcms::impl::service &impl(); 00193 00194 impl::cached_settings const &cached_settings(); 00195 00196 00198 00199 private: 00200 void setup(); 00201 std::auto_ptr<cppcms::impl::cgi::acceptor> setup_acceptor(json::value const &,int,int shift=0); 00202 void stop(); 00203 void start_acceptor(bool after_fork=false); 00204 void setup_exit_handling(); 00205 bool prefork(); 00206 void run_prepare(); 00207 void after_fork_exec(); 00208 void run_acceptor(); 00209 void run_event_loop(); 00210 #ifdef CPPCMS_WIN32 00211 void run_win_console(); 00212 #endif 00213 #ifdef CPPCMS_WIN_NATIVE 00214 void win_service_prepare(); 00215 void win_service_exec(); 00216 void run_win_service(); 00217 #endif 00218 booster::hold_ptr<impl::service> impl_; 00219 }; 00220 00221 } // 00222 00223 00224 00225 00226 #endif