00001 // Copyright 2010 Google Inc. 00017 00018 #ifndef NET_INSTAWEB_APACHE_APACHE_REWRITE_DRIVER_FACTORY_H_ 00019 #define NET_INSTAWEB_APACHE_APACHE_REWRITE_DRIVER_FACTORY_H_ 00020 00021 #include <cstdio> 00022 #include <set> 00023 #include <string> 00024 #include <vector> 00025 00026 #include "base/scoped_ptr.h" 00027 #include "net/instaweb/apache/apache_config.h" 00028 #include "net/instaweb/apache/apache_resource_manager.h" 00029 #include "net/instaweb/rewriter/public/rewrite_driver_factory.h" 00030 #include "net/instaweb/util/public/basictypes.h" 00031 #include "net/instaweb/util/public/ref_counted_owner.h" 00032 #include "net/instaweb/util/public/shared_circular_buffer.h" 00033 00034 struct apr_pool_t; 00035 struct server_rec; 00036 00037 namespace net_instaweb { 00038 00039 class AbstractSharedMem; 00040 class ApacheCache; 00041 class ApacheConfig; 00042 class ApacheMessageHandler; 00043 class ApacheResourceManager; 00044 class SerfUrlAsyncFetcher; 00045 class SharedMemLockManager; 00046 class SharedMemRefererStatistics; 00047 class SharedMemStatistics; 00048 class SlowWorker; 00049 class SyncFetcherAdapter; 00050 class UrlPollableAsyncFetcher; 00051 00053 class ApacheRewriteDriverFactory : public RewriteDriverFactory { 00054 public: 00055 ApacheRewriteDriverFactory(server_rec* server, const StringPiece& version); 00056 virtual ~ApacheRewriteDriverFactory(); 00057 00058 virtual Hasher* NewHasher(); 00059 00065 UrlPollableAsyncFetcher* SubResourceFetcher(); 00066 00067 GoogleString hostname_identifier() { return hostname_identifier_; } 00068 00069 AbstractSharedMem* shared_mem_runtime() const { 00070 return shared_mem_runtime_.get(); 00071 } 00072 SharedMemRefererStatistics* shared_mem_referer_statistics() const { 00073 return shared_mem_referer_statistics_.get(); 00074 } 00079 ApacheMessageHandler* apache_message_handler() { 00080 return apache_message_handler_; 00081 } 00103 bool is_root_process() const { return is_root_process_; } 00104 void RootInit(); 00105 void ChildInit(); 00106 00107 void DumpRefererStatistics(Writer* writer); 00108 00109 SlowWorker* slow_worker() { return slow_worker_.get(); } 00110 00114 Statistics* MakeSharedMemStatistics(); 00115 00116 ApacheResourceManager* MakeApacheResourceManager(server_rec* server); 00117 00121 void set_fetch_with_gzip(bool x) { fetch_with_gzip_ = x; } 00122 00123 void set_num_rewrite_threads(int x) { num_rewrite_threads_ = x; } 00124 void set_num_expensive_rewrite_threads(int x) { 00125 num_expensive_rewrite_threads_ = x; 00126 } 00127 00128 void set_message_buffer_size(int x) { 00129 message_buffer_size_ = x; 00130 } 00131 00136 void list_outstanding_urls_on_error(bool x) { 00137 list_outstanding_urls_on_error_ = x; 00138 } 00139 00144 ApacheCache* GetCache(ApacheConfig* config); 00145 00149 UrlPollableAsyncFetcher* GetFetcher(ApacheConfig* config); 00150 00152 void AddHtmlRewriteTimeUs(int64 rewrite_time_us); 00153 00157 bool PoolDestroyed(ApacheResourceManager* rm); 00158 00161 virtual RewriteOptions* NewRewriteOptions(); 00162 00165 virtual RewriteOptions* NewRewriteOptionsForQuery(); 00166 00170 static void Initialize(Statistics* statistics); 00171 00172 protected: 00173 virtual UrlFetcher* DefaultUrlFetcher(); 00174 virtual UrlAsyncFetcher* DefaultAsyncUrlFetcher(); 00175 00177 virtual MessageHandler* DefaultHtmlParseMessageHandler(); 00178 virtual MessageHandler* DefaultMessageHandler(); 00179 virtual FileSystem* DefaultFileSystem(); 00180 virtual Timer* DefaultTimer(); 00181 virtual CacheInterface* DefaultCacheInterface(); 00182 virtual NamedLockManager* DefaultLockManager(); 00183 virtual QueuedWorkerPool* CreateWorkerPool(WorkerPoolName name); 00184 00187 virtual bool ShouldWriteResourcesToFileSystem() { return false; } 00188 00191 void ParentOrChildInit(); 00195 void SharedCircularBufferInit(bool is_root); 00198 void SharedMemRefererStatisticsInit(bool is_root); 00199 00202 virtual void ShutDown(); 00203 00204 private: 00207 void AutoDetectThreadCounts(); 00208 00209 apr_pool_t* pool_; 00210 server_rec* server_rec_; 00211 scoped_ptr<SharedMemStatistics> shared_mem_statistics_; 00212 scoped_ptr<AbstractSharedMem> shared_mem_runtime_; 00213 scoped_ptr<SharedCircularBuffer> shared_circular_buffer_; 00214 scoped_ptr<SlowWorker> slow_worker_; 00215 00220 std::string version_; 00221 00222 bool statistics_frozen_; 00223 bool is_root_process_; 00224 bool fetch_with_gzip_; 00225 bool list_outstanding_urls_on_error_; 00226 00227 scoped_ptr<SharedMemRefererStatistics> shared_mem_referer_statistics_; 00228 00232 const GoogleString hostname_identifier_; 00238 ApacheMessageHandler* apache_message_handler_; 00243 ApacheMessageHandler* apache_html_parse_message_handler_; 00244 00252 typedef std::set<ApacheResourceManager*> ApacheResourceManagerSet; 00253 ApacheResourceManagerSet uninitialized_managers_; 00254 00255 Histogram* html_rewrite_time_us_histogram_; 00256 00258 bool thread_counts_finalized_; 00259 00261 int num_rewrite_threads_; 00262 int num_expensive_rewrite_threads_; 00263 00266 int message_buffer_size_; 00267 00270 typedef std::map<GoogleString, ApacheCache*> PathCacheMap; 00271 PathCacheMap path_cache_map_; 00272 00276 typedef std::map<GoogleString, UrlPollableAsyncFetcher*> FetcherMap; 00277 FetcherMap fetcher_map_; 00278 00279 DISALLOW_COPY_AND_ASSIGN(ApacheRewriteDriverFactory); 00280 }; 00281 00282 } 00283 00284 #endif ///< NET_INSTAWEB_APACHE_APACHE_REWRITE_DRIVER_FACTORY_H_