--- parser3/src/classes/op.C 2007/06/09 16:22:08 1.170 +++ parser3/src/classes/op.C 2008/02/14 09:10:23 1.174 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_OP_C="$Date: 2007/06/09 16:22:08 $"; +static const char * const IDENT_OP_C="$Date: 2008/02/14 09:10:23 $"; #include "classes.h" #include "pa_vmethod_frame.h" @@ -278,7 +278,7 @@ static void _while(Request& r, MethodPar } static void _use(Request& r, MethodParams& params) { - Value& vfile=params.as_no_junction(0, "file name must not be code"); + Value& vfile=params.as_no_junction(0, FILE_NAME_MUST_NOT_BE_CODE); r.use_file(r.main_class, vfile.as_string()); } @@ -616,7 +616,8 @@ const String* locked_process_and_cache_p &info, false/*as_text*/, false/*do_append*/, - false/*block == don't wait till other thread release lock*/) ? info.processed_code: 0; + false/*block == don't wait till other thread release lock*/, + false/*dun throw exception if lock failed*/) ? info.processed_code: 0; time_t now=time(0); if(scope.expires<=now) @@ -669,9 +670,8 @@ static const String& as_file_spec(Reques return r.absolute(params.as_string(index, "filespec must be string")); } static void _cache(Request& r, MethodParams& params) { - if(params.count()==0) - { - // return current expiration time + if(params.count()==0) { + // ^cache[] -- return current expiration time Cache_scope* scope=static_cast(r.classes_conf.get(cache_data_name)); if(!scope) throw Exception(PARSER_RUNTIME, @@ -683,8 +683,8 @@ static void _cache(Request& r, MethodPar time_t now=time(0); - // ^cache[filename] ^cache(seconds) ^cache[expires date] if(params.count()==1) { + // ^cache[filename] ^cache(seconds) ^cache[expires date] if(params[0].is_string()) { // filename? cache_delete(as_file_spec(r, params, 0)); return; @@ -708,7 +708,7 @@ static void _cache(Request& r, MethodPar "invalid number of parameters"); // file_spec, expires, body code - const String& file_spec=r.absolute(params.as_string(0, "filespec must be string")); + const String& file_spec=as_file_spec(r, params, 0); Cache_scope scope={as_expires(r, params, 1, now), 0}; @@ -723,10 +723,10 @@ static void _cache(Request& r, MethodPar Cache_get_result cached=cache_get(r.charsets, file_spec, now); if(cached.body) { // have cached copy - if(cached.expired) { - scope.body_from_disk=cached.body; // storing for user to retrive it with ^cache[] - } else { - // and it's not expired yet write it out + if(cached.expired) { + scope.body_from_disk=cached.body; // storing for user to retrive it with ^cache[] + } else { + // and it's not expired yet write it out r.write_assign_lang(*cached.body); // happy with it return; @@ -734,17 +734,17 @@ static void _cache(Request& r, MethodPar } // no cached info or it's already expired - try { - // try to process and store in file - const String* processed_body=locked_process_and_cache_put(r, body_code, catch_code, scope, file_spec); - // write it out - r.write_assign_lang(*processed_body); - // happy with it - return; - } catch(...) { - // we fail during get exclusive lock - // nvm we just process it a bit later - } + + // trying to process it under lock and store result in file + const String* processed_body=locked_process_and_cache_put(r, body_code, catch_code, scope, file_spec); + if(processed_body){ + // write it out + r.write_assign_lang(*processed_body); + // happy with it + return; + } else { + // we fail while get exclusive lock. nvm, we just execute body_code a bit later + } } else { // instructed not to cache; forget cached copy cache_delete(file_spec);