--- parser3/src/main/pa_stylesheet_manager.C 2003/03/06 16:15:25 1.16.2.7 +++ parser3/src/main/pa_stylesheet_manager.C 2003/03/17 14:48:06 1.16.4.1 @@ -1,13 +1,13 @@ /** @file Parser: sql driver manager implementation. - Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ #include "pa_config_includes.h" #ifdef XML -static const char* IDENT_STYLESHEET_MANAGER_C="$Date: 2003/03/06 16:15:25 $"; +static const char* IDENT_STYLESHEET_MANAGER_C="$Date: 2003/03/17 14:48:06 $"; #include "pa_stylesheet_manager.h" #include "pa_stylesheet_connection.h" @@ -20,88 +20,108 @@ static const char* IDENT_STYLESHEET_MANA // globals -Stylesheet_manager stylesheet_manager; +Stylesheet_manager *stylesheet_manager; // consts -const time_t SECOND=1; -const time_t EXPIRE_UNUSED_CONNECTION_SECONDS=5*60; -const time_t CHECK_EXPIRED_CONNECTION_SECONDS=EXPIRE_UNUSED_CONNECTION_SECONDS*2; +const int EXPIRE_UNUSED_CONNECTION_SECONDS=5*60; +const int CHECK_EXPIRED_CONNECTION_SECONDS=EXPIRE_UNUSED_CONNECTION_SECONDS*2; // helpers -static void expire_connection(Stylesheet_connection& connection, time_t older_dies) { +static void expire_connection(Array::Item *value, void *info) { + Stylesheet_connection& connection=*static_cast(value); + time_t older_dies=reinterpret_cast(info); + if(connection.connected() && connection.expired(older_dies)) connection.disconnect(); } -static void expire_connections( - Stylesheet_manager::connection_cache_type::key_type /*key*/, - Stylesheet_manager::connection_cache_type::value_type stack, - time_t older_dies) { - for(int i=0; i<=stack->top_index(); i++) - expire_connection(*stack->get(i), older_dies); +static void expire_connections(const Hash::Key& key, Hash::Val *value, void *info) { + Stack& stack=*static_cast(value); + for(int i=0; i<=stack.top_index(); i++) + expire_connection(stack.get(i), info); } // Stylesheet_manager -Stylesheet_manager::Stylesheet_manager(): prev_expiration_pass_time(0) { - - cache_managers.put(StringPtr(new String("stylesheet")), this); -} - +Stylesheet_manager::Stylesheet_manager(Pool& apool) : Cache_manager(apool), + connection_cache(apool), + prev_expiration_pass_time(0) { + } Stylesheet_manager::~Stylesheet_manager() { - connection_cache.for_each(expire_connections, time(0)+SECOND/*=in future=expire all*/); + connection_cache.for_each(expire_connections, + reinterpret_cast(time(0)+1/*=in future=expire all*/)); } -Stylesheet_connectionPtr Stylesheet_manager::get_connection(StringPtr file_spec) { - Stylesheet_connectionPtr result=get_connection_from_cache(file_spec); - if(!result) - result=Stylesheet_connectionPtr(new Stylesheet_connection(file_spec)); - return result; +Stylesheet_connection_ptr Stylesheet_manager::get_connection(const String& request_file_spec) { + Pool& pool=request_file_spec.pool(); // request pool + + // first trying to get cached stylesheet + Stylesheet_connection *connection=get_connection_from_cache(request_file_spec); + if(!connection) { + // then just construct it + + // make global_file_spec C-string on global pool + const char *request_file_spec_cstr=request_file_spec.cstr(String::UL_FILE_SPEC); + char *global_file_spec_cstr=(char *)malloc_atomic(strlen(request_file_spec_cstr)+1); + strcpy(global_file_spec_cstr, request_file_spec_cstr); + // make global_file_spec string on global pool + String& global_file_spec=*new(this->pool()) String(this->pool(), global_file_spec_cstr); + + connection=new(this->pool()) Stylesheet_connection(this->pool(), global_file_spec); + } + // associate with services[request] (deassociates at close) + connection->set_services(&pool); + // return autoclosing object for it + return Stylesheet_connection_ptr(connection); } -void Stylesheet_manager::close_connection(StringPtr file_spec, +void Stylesheet_manager::close_connection(const String& file_spec, Stylesheet_connection& connection) { - put_connection_to_cache(file_spec, Stylesheet_connectionPtr(&connection)); + // deassociate from services[request] + connection.set_services(0); + put_connection_to_cache(file_spec, connection); } + // stylesheet cache /// @todo get rid of memory spending Stack [zeros deep inside got accumulated] -Stylesheet_connectionPtr Stylesheet_manager::get_connection_from_cache(StringPtr file_spec) { +Stylesheet_connection *Stylesheet_manager::get_connection_from_cache(const String& file_spec) { SYNCHRONIZED; - if(connection_cache_type::value_type connections=connection_cache.get(file_spec)) + if(Stack *connections=static_cast(connection_cache.get(file_spec))) while(connections->top_index()>=0) { // there are cached stylesheets to that 'file_spec' - Stylesheet_connectionPtr result=connections->pop(); + Stylesheet_connection *result=static_cast(connections->pop()); if(result->connected()) // not expired? return result; } - return Stylesheet_connectionPtr(0); + return 0; } -void Stylesheet_manager::put_connection_to_cache(StringPtr file_spec, - Stylesheet_connectionPtr connection) { +void Stylesheet_manager::put_connection_to_cache(const String& file_spec, + Stylesheet_connection& connection) { SYNCHRONIZED; - connection_cache_type::value_type connections=connection_cache.get(file_spec); + Stack *connections=static_cast(connection_cache.get(file_spec)); if(!connections) { // there are no cached stylesheets to that 'file_spec' yet? - connections=connection_cache_type::value_type(new connection_cache_type::value_type::element_type); + connections=NEW Stack(pool()); // NOTE: never freed up! connection_cache.put(file_spec, connections); } - connections->push(connection); + connections->push(&connection); } void Stylesheet_manager::maybe_expire_cache() { time_t now=time(0); if(prev_expiration_pass_time(now-EXPIRE_UNUSED_CONNECTION_SECONDS)); prev_expiration_pass_time=now; } } -/* + static void add_connection_to_status_cache_table(Array::Item *value, void *info) { Stylesheet_connection& connection=*static_cast(value); Table& table=*static_cast(info); @@ -114,7 +134,11 @@ static void add_connection_to_status_cac row+=&connection.file_spec(); // time time_t time_stamp=connection.get_time_used(); - row+=new(pool) String(pool, pool.copy(ctime(&time_stamp))); + const char *unsafe_time_cstr=ctime(&time_stamp); + int time_buf_size=strlen(unsafe_time_cstr); + char *safe_time_buf=(char *)pool.malloc_atomic(time_buf_size); + memcpy(safe_time_buf, unsafe_time_cstr, time_buf_size); + row+=new(pool) String(pool, safe_time_buf, time_buf_size); table+=&row; } @@ -125,10 +149,9 @@ static void add_connections_to_status_ca for(int countdown=stack.top_index(); countdown-->=0; ) add_connection_to_status_cache_table(iter.next(), info); } -*/ -ValuePtr Stylesheet_manager::get_status(Pool& pool, StringPtr source) { - VHashPtr result(new VHash); -/* +Value& Stylesheet_manager::get_status(Pool& pool, const String *source) { + VHash& result=*new(pool) VHash(pool); + // cache { Array& columns=*new(pool) Array(pool); @@ -140,7 +163,7 @@ ValuePtr Stylesheet_manager::get_status( result.hash(source).put(*new(pool) String(pool, "cache"), new(pool) VTable(pool, &table)); } -*/ + return result; }