httpd responder changes, fix gc race

cvs
Slava Pestov 2004-09-23 03:42:45 +00:00
parent 6ed8e58242
commit ab6c6b20c3
6 changed files with 56 additions and 31 deletions

View File

@ -22,15 +22,19 @@ FFI:
- clean up listener's action popups
- jedit ==> jedit-word, jedit takes a file name
- introduce ifte* and ?str-head/?str-tail where appropriate
- namespace clone drops static var bindings
- add a socket timeout
- fix error postoning -- not all errors thrown by i/o code are
postponed
- sbuf-hashcode
- vector-hashcode
- some way to run httpd from command line
+ bignums:
- move some s48_ functions into bignum.c
- remove unused functions
- add a socket timeout
- >lower, >upper for strings
- accept multi-line input in listener
@ -75,12 +79,6 @@ FFI:
+ native:
- fix error postoning -- not all errors thrown by i/o code are
postponed
- sbuf-hashcode
- vector-hashcode
- irc: stack underflow?
- gc call in the middle of some ops might affect callstack
- better i/o scheduler
+ JVM compiler:
@ -98,7 +96,6 @@ FFI:
+ misc:
- some way to run httpd from command line
- don't rehash strings on every startup
- 'cascading' styles
- ditch expand
@ -106,7 +103,6 @@ FFI:
+ httpd:
- 'default responder' for when we go to root
- wiki responder:
- port to native
- text styles

View File

@ -75,6 +75,8 @@ global [ <namespace> "httpd-responders" set ] bind
[ resource-responder ] "get" set
] extend add-responder
"file" set-default-responder
! <responder> [
! "wiki" "responder" set
! [ wiki-get-responder ] "get" set

View File

@ -76,25 +76,44 @@ USE: strings
"404" "httpd-responders" get get*
] unless* ;
: default-responder ( -- responder )
"default" get-responder ;
: set-default-responder ( name -- )
get-responder "default" "httpd-responders" get set* ;
: responder-argument ( argument -- argument )
dup f-or-"" [ drop "default-argument" get ] when ;
: call-responder ( method argument responder -- )
[ responder-argument swap get call ] bind ;
: trim-/ ( url -- url )
#! Trim a leading /, if there is one.
"/" ?str-head drop ;
: serve-default-responder ( method url -- )
default-responder call-responder ;
: serve-explicit-responder ( method url -- )
"/" split1 dup [
swap get-responder call-responder
] [
! Just a responder name by itself
drop "request" get "/" cat2 redirect drop
] ifte ;
: log-responder ( url -- )
"Calling responder " swap cat2 log ;
: trim-/ ( url -- url )
#! Trim a leading /, if there is one.
"/" ?str-head drop ;
: serve-responder ( method url -- )
dup log-responder trim-/ "/" split1 dup [
swap get-responder call-responder
#! Responder URLs come in two forms:
#! /foo/bar... - default-responder used
#! /responder/foo/bar - responder foo, argument bar
dup log-responder trim-/ "responder/" ?str-head [
serve-explicit-responder
] [
! Just a responder name by itself
drop "/" swap "/" cat3 redirect drop
serve-default-responder
] ifte ;
: no-such-responder ( -- )

View File

@ -36,6 +36,7 @@ void init_arena(CELL size)
init_zone(&prior,size);
allot_profiling = false;
gc_in_progress = false;
gc_protect = false;
}
void allot_profile_step(CELL a)
@ -59,21 +60,21 @@ void allot_profile_step(CELL a)
void check_memory(void)
{
if(active.here > active.alarm)
{
if(active.here > active.limit)
{
fprintf(stderr,"Out of memory\n");
fprintf(stderr,"active.base = %ld\n",active.base);
fprintf(stderr,"active.here = %ld\n",active.here);
fprintf(stderr,"active.limit = %ld\n",active.limit);
fflush(stderr);
exit(1);
}
if(gc_protect)
return;
/* Execute the 'garbage-collection' word */
call(userenv[GC_ENV]);
if(active.here > active.limit)
{
fprintf(stderr,"Out of memory\n");
fprintf(stderr,"active.base = %ld\n",active.base);
fprintf(stderr,"active.here = %ld\n",active.here);
fprintf(stderr,"active.limit = %ld\n",active.limit);
fflush(stderr);
exit(1);
}
/* Execute the 'garbage-collection' word */
call(userenv[GC_ENV]);
}
void flip_zones()

View File

@ -10,6 +10,9 @@ ZONE prior;
bool allot_profiling;
/* we can temporarily disable GC */
bool gc_protect;
void* alloc_guarded(CELL size);
void init_zone(ZONE* zone, CELL size);
void init_arena(CELL size);
@ -29,7 +32,8 @@ INLINE void* allot(CELL a)
active.here += align8(a);
if(allot_profiling)
allot_profile_step(align8(a));
check_memory();
if(active.here > active.alarm)
check_memory();
return (void*)h;
}

View File

@ -101,7 +101,10 @@ void primitive_datastack(void)
void primitive_callstack(void)
{
/* we don't want gc word to end up on callstack. */
gc_protect = true;
dpush(tag_object(stack_to_vector(cs_bot,cs)));
gc_protect = false;
}
/* Returns top of stack */