\r
- clean up listener's action popups\r
- jedit ==> jedit-word, jedit takes a file name\r
-- introduce ifte* and ?str-head/?str-tail where appropriate\r
- namespace clone drops static var bindings\r
+- add a socket timeout\r
+- fix error postoning -- not all errors thrown by i/o code are\r
+ postponed\r
+- sbuf-hashcode\r
+- vector-hashcode\r
+- some way to run httpd from command line\r
\r
+ bignums:\r
\r
- move some s48_ functions into bignum.c\r
- remove unused functions\r
\r
-- add a socket timeout\r
- >lower, >upper for strings\r
- accept multi-line input in listener\r
\r
\r
+ native:\r
\r
-- fix error postoning -- not all errors thrown by i/o code are\r
- postponed\r
-- sbuf-hashcode\r
-- vector-hashcode\r
-- irc: stack underflow?\r
-- gc call in the middle of some ops might affect callstack\r
- better i/o scheduler\r
\r
+ JVM compiler:\r
\r
+ misc:\r
\r
-- some way to run httpd from command line\r
- don't rehash strings on every startup\r
- 'cascading' styles\r
- ditch expand\r
\r
+ httpd:\r
\r
-- 'default responder' for when we go to root\r
- wiki responder:\r
- port to native\r
- text styles\r
[ resource-responder ] "get" set
] extend add-responder
+"file" set-default-responder
+
! <responder> [
! "wiki" "responder" set
! [ wiki-get-responder ] "get" set
"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 ( -- )
init_zone(&prior,size);
allot_profiling = false;
gc_in_progress = false;
+ gc_protect = false;
}
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()
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);
active.here += align8(a);
if(allot_profiling)
allot_profile_step(align8(a));
- check_memory();
+ if(active.here > active.alarm)
+ check_memory();
return (void*)h;
}
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 */