added an mmap cache to avoid repeated mmaps/munmaps
This commit is contained in:
parent
5f051d3122
commit
0f2bcdb2a0
BIN
bin/ikarus
BIN
bin/ikarus
Binary file not shown.
|
@ -94,14 +94,46 @@ ik_munmap_from_segment(unsigned char* base, int size, ikpcb* pcb){
|
||||||
*s = 0;
|
*s = 0;
|
||||||
p++; s++;
|
p++; s++;
|
||||||
}
|
}
|
||||||
|
ikpage* r = pcb->uncached_pages;
|
||||||
|
if (r){
|
||||||
|
ikpage* cache = pcb->cached_pages;
|
||||||
|
do{
|
||||||
|
r->base = base;
|
||||||
|
ikpage* next = r->next;
|
||||||
|
r->next = cache;
|
||||||
|
cache = r;
|
||||||
|
r = next;
|
||||||
|
base += pagesize;
|
||||||
|
size -= pagesize;
|
||||||
|
} while(r && size);
|
||||||
|
pcb->cached_pages = cache;
|
||||||
|
pcb->uncached_pages = r;
|
||||||
|
}
|
||||||
|
if(size){
|
||||||
ik_munmap(base, size);
|
ik_munmap(base, size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void*
|
void*
|
||||||
ik_mmap_typed(int size, unsigned int type, ikpcb* pcb){
|
ik_mmap_typed(int size, unsigned int type, ikpcb* pcb){
|
||||||
unsigned char* p = ik_mmap(size);
|
unsigned char* p;
|
||||||
|
if(size == pagesize) {
|
||||||
|
ikpage* s = pcb->cached_pages;
|
||||||
|
if(s){
|
||||||
|
p = s->base;
|
||||||
|
pcb->cached_pages = s->next;
|
||||||
|
s->next = pcb->uncached_pages;
|
||||||
|
pcb->uncached_pages = s;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
p = ik_mmap(size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
p = ik_mmap(size);
|
||||||
|
}
|
||||||
extend_table_maybe(p, size, pcb);
|
extend_table_maybe(p, size, pcb);
|
||||||
set_segment_type(p, size, type, pcb);
|
set_segment_type(p, size, type, pcb);
|
||||||
return p;
|
return p;
|
||||||
|
@ -219,6 +251,7 @@ ikp ik_mmap_protected(int size){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define CACHE_SIZE (pagesize * 8) /* must be multiple of pagesize*/
|
||||||
|
|
||||||
ikpcb* ik_make_pcb(){
|
ikpcb* ik_make_pcb(){
|
||||||
ikpcb* pcb = ik_malloc(sizeof(ikpcb));
|
ikpcb* pcb = ik_malloc(sizeof(ikpcb));
|
||||||
|
@ -237,6 +270,19 @@ ikpcb* ik_make_pcb(){
|
||||||
pcb->frame_base = pcb->frame_pointer;
|
pcb->frame_base = pcb->frame_pointer;
|
||||||
pcb->frame_redline = pcb->stack_base + 2 * 4096;
|
pcb->frame_redline = pcb->stack_base + 2 * 4096;
|
||||||
|
|
||||||
|
|
||||||
|
{ /* make cache ikpage */
|
||||||
|
ikpage* p = ik_mmap(CACHE_SIZE * sizeof(ikpage));
|
||||||
|
ikpage* q = 0;
|
||||||
|
ikpage* e = p + CACHE_SIZE;
|
||||||
|
while(p < e){
|
||||||
|
p->next = q;
|
||||||
|
q = p;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
pcb->uncached_pages = q;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
/* compute extent of heap and stack */
|
/* compute extent of heap and stack */
|
||||||
unsigned char* lo_mem;
|
unsigned char* lo_mem;
|
||||||
|
@ -303,6 +349,7 @@ void ik_delete_pcb(ikpcb* pcb){
|
||||||
int vecsize = (segment_index(end) - segment_index(base)) * pagesize;
|
int vecsize = (segment_index(end) - segment_index(base)) * pagesize;
|
||||||
ik_munmap(pcb->dirty_vector_base, vecsize);
|
ik_munmap(pcb->dirty_vector_base, vecsize);
|
||||||
ik_munmap(pcb->segment_vector_base, vecsize);
|
ik_munmap(pcb->segment_vector_base, vecsize);
|
||||||
|
|
||||||
ik_free(pcb, sizeof(ikpcb));
|
ik_free(pcb, sizeof(ikpcb));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,11 @@ inthash(int key) {
|
||||||
typedef unsigned char* ikp;
|
typedef unsigned char* ikp;
|
||||||
void ik_error(ikp args);
|
void ik_error(ikp args);
|
||||||
|
|
||||||
|
typedef struct ikpage{
|
||||||
|
ikp base;
|
||||||
|
struct ikpage* next;
|
||||||
|
} ikpage;
|
||||||
|
|
||||||
typedef struct ikpages{
|
typedef struct ikpages{
|
||||||
ikp base;
|
ikp base;
|
||||||
int size;
|
int size;
|
||||||
|
@ -94,6 +99,8 @@ typedef struct {
|
||||||
ikp heap_base;
|
ikp heap_base;
|
||||||
int heap_size;
|
int heap_size;
|
||||||
ikpages* heap_pages;
|
ikpages* heap_pages;
|
||||||
|
ikpage* cached_pages; /* pages cached so that we don't map/unmap */
|
||||||
|
ikpage* uncached_pages; /* ikpages cached so that we don't malloc/free */
|
||||||
ikp stack_base;
|
ikp stack_base;
|
||||||
int stack_size;
|
int stack_size;
|
||||||
ikp oblist;
|
ikp oblist;
|
||||||
|
|
|
@ -1,129 +0,0 @@
|
||||||
let s:so_save = &so | let s:siso_save = &siso | set so=0 siso=0
|
|
||||||
argglobal
|
|
||||||
setlocal noarabic
|
|
||||||
setlocal autoindent
|
|
||||||
setlocal autoread
|
|
||||||
setlocal nobinary
|
|
||||||
setlocal bufhidden=
|
|
||||||
setlocal buflisted
|
|
||||||
setlocal buftype=
|
|
||||||
setlocal nocindent
|
|
||||||
setlocal cinkeys=0{,0},0),:,0#,!^F,o,O,e
|
|
||||||
setlocal cinoptions=
|
|
||||||
setlocal cinwords=if,else,while,do,for,switch
|
|
||||||
setlocal comments=s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-
|
|
||||||
setlocal commentstring=/*%s*/
|
|
||||||
setlocal complete=.,w,b,u,t,i
|
|
||||||
setlocal completefunc=
|
|
||||||
setlocal nocopyindent
|
|
||||||
setlocal nocursorcolumn
|
|
||||||
setlocal nocursorline
|
|
||||||
setlocal define=
|
|
||||||
setlocal dictionary=
|
|
||||||
setlocal nodiff
|
|
||||||
setlocal equalprg=
|
|
||||||
setlocal errorformat=
|
|
||||||
setlocal expandtab
|
|
||||||
if &filetype != 'scheme'
|
|
||||||
setlocal filetype=scheme
|
|
||||||
endif
|
|
||||||
setlocal foldcolumn=0
|
|
||||||
setlocal foldenable
|
|
||||||
setlocal foldexpr=0
|
|
||||||
setlocal foldignore=#
|
|
||||||
setlocal foldlevel=0
|
|
||||||
setlocal foldmarker={{{,}}}
|
|
||||||
setlocal foldmethod=manual
|
|
||||||
setlocal foldminlines=1
|
|
||||||
setlocal foldnestmax=20
|
|
||||||
setlocal foldtext=foldtext()
|
|
||||||
setlocal formatexpr=
|
|
||||||
setlocal formatoptions=tcq
|
|
||||||
setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s*
|
|
||||||
setlocal grepprg=
|
|
||||||
setlocal iminsert=0
|
|
||||||
setlocal imsearch=0
|
|
||||||
setlocal include=
|
|
||||||
setlocal includeexpr=
|
|
||||||
setlocal indentexpr=
|
|
||||||
setlocal indentkeys=0{,0},:,0#,!^F,o,O,e
|
|
||||||
setlocal noinfercase
|
|
||||||
setlocal iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
|
|
||||||
setlocal keymap=
|
|
||||||
setlocal keywordprg=
|
|
||||||
setlocal nolinebreak
|
|
||||||
setlocal lisp
|
|
||||||
setlocal nolist
|
|
||||||
setlocal makeprg=
|
|
||||||
setlocal matchpairs=(:),{:},[:]
|
|
||||||
setlocal modeline
|
|
||||||
setlocal modifiable
|
|
||||||
setlocal nrformats=octal,hex
|
|
||||||
setlocal nonumber
|
|
||||||
setlocal numberwidth=4
|
|
||||||
setlocal omnifunc=
|
|
||||||
setlocal path=
|
|
||||||
setlocal nopreserveindent
|
|
||||||
setlocal nopreviewwindow
|
|
||||||
setlocal quoteescape=\\
|
|
||||||
setlocal noreadonly
|
|
||||||
setlocal norightleft
|
|
||||||
setlocal rightleftcmd=search
|
|
||||||
setlocal noscrollbind
|
|
||||||
setlocal shiftwidth=2
|
|
||||||
setlocal noshortname
|
|
||||||
setlocal nosmartindent
|
|
||||||
setlocal softtabstop=0
|
|
||||||
setlocal nospell
|
|
||||||
setlocal spellcapcheck=[.?!]\\_[\\])'\"\ \ ]\\+
|
|
||||||
setlocal spellfile=
|
|
||||||
setlocal spelllang=en
|
|
||||||
setlocal statusline=
|
|
||||||
setlocal suffixesadd=
|
|
||||||
setlocal swapfile
|
|
||||||
setlocal synmaxcol=3000
|
|
||||||
if &syntax != 'scheme'
|
|
||||||
setlocal syntax=scheme
|
|
||||||
endif
|
|
||||||
setlocal tabstop=8
|
|
||||||
setlocal tags=
|
|
||||||
setlocal textwidth=68
|
|
||||||
setlocal thesaurus=
|
|
||||||
setlocal nowinfixheight
|
|
||||||
setlocal nowinfixwidth
|
|
||||||
setlocal wrap
|
|
||||||
setlocal wrapmargin=0
|
|
||||||
silent! normal! zE
|
|
||||||
184,239fold
|
|
||||||
240,283fold
|
|
||||||
284,285fold
|
|
||||||
286,294fold
|
|
||||||
295,298fold
|
|
||||||
299,311fold
|
|
||||||
313,349fold
|
|
||||||
350,361fold
|
|
||||||
184
|
|
||||||
normal zc
|
|
||||||
240
|
|
||||||
normal zc
|
|
||||||
284
|
|
||||||
normal zc
|
|
||||||
286
|
|
||||||
normal zc
|
|
||||||
295
|
|
||||||
normal zc
|
|
||||||
299
|
|
||||||
normal zc
|
|
||||||
313
|
|
||||||
normal zc
|
|
||||||
350
|
|
||||||
normal zc
|
|
||||||
let s:l = 615 - ((33 * winheight(0) + 17) / 35)
|
|
||||||
if s:l < 1 | let s:l = 1 | endif
|
|
||||||
exe s:l
|
|
||||||
normal! zt
|
|
||||||
615
|
|
||||||
normal! 0
|
|
||||||
let &so = s:so_save | let &siso = s:siso_save
|
|
||||||
doautoall SessionLoadPost
|
|
||||||
" vim: set ft=vim :
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
|
||||||
|
(module (s-car s-cdr (s-cons make-stream) stream? s-head)
|
||||||
|
(import scheme)
|
||||||
|
(define-record stream (car cdr))
|
||||||
|
(define (s-car x)
|
||||||
|
(if (stream? x)
|
||||||
|
((stream-car x))
|
||||||
|
(error 's-car "~s is not a stream" x)))
|
||||||
|
(define (s-cdr x)
|
||||||
|
(if (stream? x)
|
||||||
|
((stream-cdr x))
|
||||||
|
(error 's-cdr "~s is not a stream" x)))
|
||||||
|
(define-syntax s-cons
|
||||||
|
(syntax-rules ()
|
||||||
|
[(_ a d) (make-stream (lambda () a) (lambda () d))]))
|
||||||
|
(define (s-head n s)
|
||||||
|
(unless (and (fixnum? n) (fx>= n 0))
|
||||||
|
(error 's-head
|
||||||
|
"length must be a non-negative fixnum, got ~s"
|
||||||
|
n))
|
||||||
|
(unless (stream? s)
|
||||||
|
(error 's-head "~s is not a stream" s))
|
||||||
|
(let f ([n n] [s s] [ac '()])
|
||||||
|
(cond
|
||||||
|
[(fxzero? n) (reverse ac)]
|
||||||
|
[else
|
||||||
|
(f (fx- n 1) (s-cdr s) (cons (s-car s) ac))]))))
|
||||||
|
|
||||||
|
|
||||||
|
(define (going-up x lim)
|
||||||
|
(cond ((= x lim) (s-cons x (going-down (- x 1) (+ lim 1))))
|
||||||
|
(else (s-cons x (going-up (+ x 1) lim)))))
|
||||||
|
(define (going-down x lim)
|
||||||
|
(cond ((= x 0) (going-up 1 lim))
|
||||||
|
(else (s-cons x (going-down (- x 1) lim)))))
|
||||||
|
(define s (going-up 1 1))
|
||||||
|
|
||||||
|
#!eof
|
||||||
|
|
||||||
|
Path: g2news2.google.com!news3.google.com!newshub.sdsu.edu!tethys.csu.net!okeanos.csu.net!53ab2750!not-for-mail
|
||||||
|
Sender: luv...@localhost.localdomain
|
||||||
|
Newsgroups: comp.lang.scheme
|
||||||
|
Subject: Re: Stream problem
|
||||||
|
References: <1164352610.327618.225810@l39g2000cwd.googlegroups.com>
|
||||||
|
From: Andru Luvisi <luv...@andru.sonoma.edu>
|
||||||
|
Message-ID: <8764cq9fhg.fsf@localhost.localdomain>
|
||||||
|
Lines: 21
|
||||||
|
User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.4
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=us-ascii
|
||||||
|
Date: 05 Dec 2006 13:53:31 -0800
|
||||||
|
NNTP-Posting-Host: 130.157.65.249
|
||||||
|
X-Trace: okeanos.csu.net 1165355611 130.157.65.249 (Tue, 05 Dec 2006 13:53:31 PST)
|
||||||
|
NNTP-Posting-Date: Tue, 05 Dec 2006 13:53:31 PST
|
||||||
|
|
||||||
|
|
||||||
|
Several of the answers that have been posted involve using reverse,
|
||||||
|
which has the disadvantage that the later you go in the stream, the
|
||||||
|
more of it you will need to hold in ram if you are processing and
|
||||||
|
discarding elements as you go.
|
||||||
|
|
||||||
|
(define (going-up x lim)
|
||||||
|
(cond ((= x lim) (s-cons x (going-down (- x 1) (+ lim 1))))
|
||||||
|
(else (s-cons x (going-up (+ x 1) lim)))))
|
||||||
|
(define (going-down x lim)
|
||||||
|
(cond ((= x 0) (going-up 1 lim))
|
||||||
|
(else (s-cons x (going-down (- x 1) lim)))))
|
||||||
|
(define s (going-up 1 1))
|
||||||
|
|
||||||
|
Andru
|
||||||
|
--
|
||||||
|
Andru Luvisi
|
||||||
|
|
||||||
|
Quote Of The Moment:
|
||||||
|
Quidquid latine dictum sit, altum viditur.
|
||||||
|
( Whatever is said in Latin sounds profound. )
|
BIN
lib/ikarus.boot
BIN
lib/ikarus.boot
Binary file not shown.
Loading…
Reference in New Issue