Merge branch 'master' into simd-cleanup
commit
67cc1c01be
|
@ -1,16 +1,37 @@
|
||||||
|
USING: help.markup help.syntax calendar quotations system ;
|
||||||
IN: alarms
|
IN: alarms
|
||||||
USING: help.markup help.syntax calendar quotations ;
|
|
||||||
|
|
||||||
HELP: alarm
|
HELP: alarm
|
||||||
{ $class-description "An alarm. Can be passed to " { $link cancel-alarm } "." } ;
|
{ $class-description "An alarm. Can be passed to " { $link cancel-alarm } "." } ;
|
||||||
|
|
||||||
|
HELP: current-alarm
|
||||||
|
{ $description "A symbol that contains the currently executing alarm, availble only to the alarm quotation. One use for this symbol is if a repeated alarm wishes to cancel itself from executing in the future."
|
||||||
|
}
|
||||||
|
{ $examples
|
||||||
|
{ $unchecked-example
|
||||||
|
"""USING: alarms calendar io threads ;"""
|
||||||
|
"""["""
|
||||||
|
""" "Hi, this should only get printed once..." print flush"""
|
||||||
|
""" current-alarm get cancel-alarm"""
|
||||||
|
"""] 1 seconds every"""
|
||||||
|
""
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
HELP: add-alarm
|
HELP: add-alarm
|
||||||
{ $values { "quot" quotation } { "time" timestamp } { "frequency" { $maybe duration } } { "alarm" alarm } }
|
{ $values { "quot" quotation } { "start" duration } { "interval" { $maybe "duration/f" } } { "alarm" alarm } }
|
||||||
{ $description "Creates and registers an alarm. If " { $snippet "frequency" } " is " { $link f } ", this will be a one-time alarm, otherwise it will fire with the given frequency. The quotation will be called from the alarm thread." } ;
|
{ $description "Creates and registers an alarm to start at " { $snippet "start" } " offset from the current time. If " { $snippet "interval" } " is " { $link f } ", this will be a one-time alarm, otherwise it will fire with the given frequency, with scheduling happening before the quotation is called in order to ensure that the next event will happen on time. The quotation will be called from a new thread spawned by the alarm thread. If a repeated alarm's quotation throws an exception, the alarm will not be rescheduled." } ;
|
||||||
|
|
||||||
HELP: later
|
HELP: later
|
||||||
{ $values { "quot" quotation } { "duration" duration } { "alarm" alarm } }
|
{ $values { "quot" quotation } { "duration" duration } { "alarm" alarm } }
|
||||||
{ $description "Creates and registers an alarm which calls the quotation once at " { $snippet "time" } " from now." } ;
|
{ $description "Creates and registers an alarm which calls the quotation once at " { $snippet "duration" } " offset from now." }
|
||||||
|
{ $examples
|
||||||
|
{ $unchecked-example
|
||||||
|
"USING: alarms io calendar ;"
|
||||||
|
"""[ "Break's over!" print flush ] 15 minutes drop"""
|
||||||
|
""
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
HELP: cancel-alarm
|
HELP: cancel-alarm
|
||||||
{ $values { "alarm" alarm } }
|
{ $values { "alarm" alarm } }
|
||||||
|
@ -20,16 +41,29 @@ HELP: every
|
||||||
{ $values
|
{ $values
|
||||||
{ "quot" quotation } { "duration" duration }
|
{ "quot" quotation } { "duration" duration }
|
||||||
{ "alarm" alarm } }
|
{ "alarm" alarm } }
|
||||||
{ $description "Creates and registers an alarm which calls the quotation repeatedly, using " { $snippet "dt" } " as the frequency." } ;
|
{ $description "Creates and registers an alarm which calls the quotation repeatedly, using " { $snippet "dt" } " as the frequency. If the quotation throws an exception that is not caught inside it, the alarm scheduler will cancel the alarm and will not reschedule it again." }
|
||||||
|
{ $examples
|
||||||
|
{ $unchecked-example
|
||||||
|
"USING: alarms io calendar ;"
|
||||||
|
"""[ "Hi Buddy." print flush ] 10 seconds every drop"""
|
||||||
|
""
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
ARTICLE: "alarms" "Alarms"
|
ARTICLE: "alarms" "Alarms"
|
||||||
"The " { $vocab-link "alarms" } " vocabulary provides a lightweight way to schedule one-time and recurring tasks without spawning a new thread."
|
"The " { $vocab-link "alarms" } " vocabulary provides a lightweight way to schedule one-time and recurring tasks without spawning a new thread. Alarms use " { $link nano-count } ", so they continue to work across system clock changes." $nl
|
||||||
{ $subsections
|
"The alarm class:"
|
||||||
alarm
|
{ $subsections alarm }
|
||||||
add-alarm
|
"Register a recurring alarm:"
|
||||||
later
|
{ $subsections every }
|
||||||
cancel-alarm
|
"Register a one-time alarm:"
|
||||||
}
|
{ $subsections later }
|
||||||
|
"The currently executing alarm:"
|
||||||
|
{ $subsections current-alarm }
|
||||||
|
"Low-level interface to add alarms:"
|
||||||
|
{ $subsections add-alarm }
|
||||||
|
"Cancelling an alarm:"
|
||||||
|
{ $subsections cancel-alarm }
|
||||||
"Alarms do not persist across image saves. Saving and restoring an image has the effect of calling " { $link cancel-alarm } " on all " { $link alarm } " instances." ;
|
"Alarms do not persist across image saves. Saving and restoring an image has the effect of calling " { $link cancel-alarm } " on all " { $link alarm } " instances." ;
|
||||||
|
|
||||||
ABOUT: "alarms"
|
ABOUT: "alarms"
|
||||||
|
|
|
@ -1,48 +1,66 @@
|
||||||
! Copyright (C) 2005, 2008 Slava Pestov, Doug Coleman.
|
! Copyright (C) 2005, 2008 Slava Pestov, Doug Coleman.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors assocs boxes calendar
|
USING: accessors assocs boxes calendar combinators.short-circuit
|
||||||
combinators.short-circuit fry heaps init kernel math.order
|
continuations fry heaps init kernel math.order
|
||||||
namespaces quotations threads ;
|
namespaces quotations threads math system ;
|
||||||
IN: alarms
|
IN: alarms
|
||||||
|
|
||||||
TUPLE: alarm
|
TUPLE: alarm
|
||||||
{ quot callable initial: [ ] }
|
{ quot callable initial: [ ] }
|
||||||
{ time timestamp }
|
{ start integer }
|
||||||
interval
|
interval
|
||||||
{ entry box } ;
|
{ entry box } ;
|
||||||
|
|
||||||
<PRIVATE
|
|
||||||
|
|
||||||
SYMBOL: alarms
|
SYMBOL: alarms
|
||||||
SYMBOL: alarm-thread
|
SYMBOL: alarm-thread
|
||||||
|
SYMBOL: current-alarm
|
||||||
|
|
||||||
|
: cancel-alarm ( alarm -- )
|
||||||
|
entry>> [ alarms get-global heap-delete ] if-box? ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
: notify-alarm-thread ( -- )
|
: notify-alarm-thread ( -- )
|
||||||
alarm-thread get-global interrupt ;
|
alarm-thread get-global interrupt ;
|
||||||
|
|
||||||
ERROR: bad-alarm-frequency frequency ;
|
GENERIC: >nanoseconds ( obj -- duration/f )
|
||||||
: check-alarm ( frequency/f -- frequency/f )
|
M: f >nanoseconds ;
|
||||||
dup { [ duration? ] [ not ] } 1|| [ bad-alarm-frequency ] unless ;
|
M: real >nanoseconds >integer ;
|
||||||
|
M: duration >nanoseconds duration>nanoseconds >integer ;
|
||||||
|
|
||||||
: <alarm> ( quot time frequency -- alarm )
|
: <alarm> ( quot start interval -- alarm )
|
||||||
check-alarm <box> alarm boa ;
|
alarm new
|
||||||
|
swap >nanoseconds >>interval
|
||||||
|
swap >nanoseconds nano-count + >>start
|
||||||
|
swap >>quot
|
||||||
|
<box> >>entry ;
|
||||||
|
|
||||||
: register-alarm ( alarm -- )
|
: register-alarm ( alarm -- )
|
||||||
[ dup time>> alarms get-global heap-push* ]
|
[ dup start>> alarms get-global heap-push* ]
|
||||||
[ entry>> >box ] bi
|
[ entry>> >box ] bi
|
||||||
notify-alarm-thread ;
|
notify-alarm-thread ;
|
||||||
|
|
||||||
: alarm-expired? ( alarm now -- ? )
|
: alarm-expired? ( alarm n -- ? )
|
||||||
[ time>> ] dip before=? ;
|
[ start>> ] dip <= ;
|
||||||
|
|
||||||
: reschedule-alarm ( alarm -- )
|
: reschedule-alarm ( alarm -- )
|
||||||
dup '[ _ interval>> time+ now max ] change-time register-alarm ;
|
dup interval>> nano-count + >>start register-alarm ;
|
||||||
|
|
||||||
: call-alarm ( alarm -- )
|
: call-alarm ( alarm -- )
|
||||||
[ entry>> box> drop ]
|
[ entry>> box> drop ]
|
||||||
[ quot>> "Alarm execution" spawn drop ]
|
[ dup interval>> [ reschedule-alarm ] [ drop ] if ]
|
||||||
[ dup interval>> [ reschedule-alarm ] [ drop ] if ] tri ;
|
[
|
||||||
|
[ ] [ quot>> ] [ ] tri
|
||||||
|
'[
|
||||||
|
_ current-alarm
|
||||||
|
[
|
||||||
|
_ [ _ dup interval>> [ cancel-alarm ] [ drop ] if rethrow ]
|
||||||
|
recover
|
||||||
|
] with-variable
|
||||||
|
] "Alarm execution" spawn drop
|
||||||
|
] tri ;
|
||||||
|
|
||||||
: (trigger-alarms) ( alarms now -- )
|
: (trigger-alarms) ( alarms n -- )
|
||||||
over heap-empty? [
|
over heap-empty? [
|
||||||
2drop
|
2drop
|
||||||
] [
|
] [
|
||||||
|
@ -54,11 +72,10 @@ ERROR: bad-alarm-frequency frequency ;
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
: trigger-alarms ( alarms -- )
|
: trigger-alarms ( alarms -- )
|
||||||
now (trigger-alarms) ;
|
nano-count (trigger-alarms) ;
|
||||||
|
|
||||||
: next-alarm ( alarms -- timestamp/f )
|
: next-alarm ( alarms -- nanos/f )
|
||||||
dup heap-empty?
|
dup heap-empty? [ drop f ] [ heap-peek drop start>> ] if ;
|
||||||
[ drop f ] [ heap-peek drop time>> ] if ;
|
|
||||||
|
|
||||||
: alarm-thread-loop ( -- )
|
: alarm-thread-loop ( -- )
|
||||||
alarms get-global
|
alarms get-global
|
||||||
|
@ -75,18 +92,13 @@ ERROR: bad-alarm-frequency frequency ;
|
||||||
[ alarm-thread-loop t ] "Alarms" spawn-server
|
[ alarm-thread-loop t ] "Alarms" spawn-server
|
||||||
alarm-thread set-global ;
|
alarm-thread set-global ;
|
||||||
|
|
||||||
[ init-alarms ] "alarms" add-init-hook
|
[ init-alarms ] "alarms" add-startup-hook
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: add-alarm ( quot time frequency -- alarm )
|
: add-alarm ( quot start interval -- alarm )
|
||||||
<alarm> [ register-alarm ] keep ;
|
<alarm> [ register-alarm ] keep ;
|
||||||
|
|
||||||
: later ( quot duration -- alarm )
|
: later ( quot duration -- alarm ) f add-alarm ;
|
||||||
hence f add-alarm ;
|
|
||||||
|
|
||||||
: every ( quot duration -- alarm )
|
: every ( quot duration -- alarm ) dup add-alarm ;
|
||||||
[ hence ] keep add-alarm ;
|
|
||||||
|
|
||||||
: cancel-alarm ( alarm -- )
|
|
||||||
entry>> [ alarms get-global heap-delete ] if-box? ;
|
|
||||||
|
|
|
@ -66,12 +66,12 @@ HELP: unbox-return
|
||||||
{ $notes "This is an internal word used by the compiler when compiling callbacks." } ;
|
{ $notes "This is an internal word used by the compiler when compiling callbacks." } ;
|
||||||
|
|
||||||
HELP: define-deref
|
HELP: define-deref
|
||||||
{ $values { "name" "a word name" } }
|
{ $values { "c-type" "a C type" } }
|
||||||
{ $description "Defines a word " { $snippet "*name" } " with stack effect " { $snippet "( c-ptr -- value )" } " for reading a value with C type " { $snippet "name" } " stored at an alien pointer." }
|
{ $description "Defines a word " { $snippet "*name" } " with stack effect " { $snippet "( c-ptr -- value )" } " for reading a value with C type " { $snippet "name" } " stored at an alien pointer." }
|
||||||
{ $notes "This is an internal word called when defining C types, there is no need to call it on your own." } ;
|
{ $notes "This is an internal word called when defining C types, there is no need to call it on your own." } ;
|
||||||
|
|
||||||
HELP: define-out
|
HELP: define-out
|
||||||
{ $values { "name" "a word name" } }
|
{ $values { "c-type" "a C type" } }
|
||||||
{ $description "Defines a word " { $snippet "<" { $emphasis "name" } ">" } " with stack effect " { $snippet "( value -- array )" } ". This word allocates a byte array large enough to hold a value with C type " { $snippet "name" } ", and writes the value at the top of the stack to the array." }
|
{ $description "Defines a word " { $snippet "<" { $emphasis "name" } ">" } " with stack effect " { $snippet "( value -- array )" } ". This word allocates a byte array large enough to hold a value with C type " { $snippet "name" } ", and writes the value at the top of the stack to the array." }
|
||||||
{ $notes "This is an internal word called when defining C types, there is no need to call it on your own." } ;
|
{ $notes "This is an internal word called when defining C types, there is no need to call it on your own." } ;
|
||||||
|
|
||||||
|
|
|
@ -218,13 +218,13 @@ M: c-type-name unbox-return c-type unbox-return ;
|
||||||
|
|
||||||
: little-endian? ( -- ? ) 1 <int> *char 1 = ; foldable
|
: little-endian? ( -- ? ) 1 <int> *char 1 = ; foldable
|
||||||
|
|
||||||
GENERIC: heap-size ( name -- size ) foldable
|
GENERIC: heap-size ( name -- size )
|
||||||
|
|
||||||
M: c-type-name heap-size c-type heap-size ;
|
M: c-type-name heap-size c-type heap-size ;
|
||||||
|
|
||||||
M: abstract-c-type heap-size size>> ;
|
M: abstract-c-type heap-size size>> ;
|
||||||
|
|
||||||
GENERIC: stack-size ( name -- size ) foldable
|
GENERIC: stack-size ( name -- size )
|
||||||
|
|
||||||
M: c-type-name stack-size c-type stack-size ;
|
M: c-type-name stack-size c-type stack-size ;
|
||||||
|
|
||||||
|
@ -297,20 +297,17 @@ M: long-long-type box-parameter ( n c-type -- )
|
||||||
M: long-long-type box-return ( c-type -- )
|
M: long-long-type box-return ( c-type -- )
|
||||||
f swap box-parameter ;
|
f swap box-parameter ;
|
||||||
|
|
||||||
: define-deref ( name -- )
|
: define-deref ( c-type -- )
|
||||||
[ CHAR: * prefix "alien.c-types" create ] [ c-getter 0 prefix ] bi
|
[ name>> CHAR: * prefix "alien.c-types" create ] [ c-getter 0 prefix ] bi
|
||||||
(( c-ptr -- value )) define-inline ;
|
(( c-ptr -- value )) define-inline ;
|
||||||
|
|
||||||
: define-out ( name -- )
|
: define-out ( c-type -- )
|
||||||
[ "alien.c-types" constructor-word ]
|
[ name>> "alien.c-types" constructor-word ]
|
||||||
[ dup c-setter '[ _ heap-size (byte-array) [ 0 @ ] keep ] ] bi
|
[ dup c-setter '[ _ heap-size (byte-array) [ 0 @ ] keep ] ] bi
|
||||||
(( value -- c-ptr )) define-inline ;
|
(( value -- c-ptr )) define-inline ;
|
||||||
|
|
||||||
: define-primitive-type ( c-type name -- )
|
: define-primitive-type ( c-type name -- )
|
||||||
[ typedef ]
|
[ typedef ] [ define-deref ] [ define-out ] tri ;
|
||||||
[ name>> define-deref ]
|
|
||||||
[ name>> define-out ]
|
|
||||||
tri ;
|
|
||||||
|
|
||||||
: if-void ( c-type true false -- )
|
: if-void ( c-type true false -- )
|
||||||
pick void? [ drop nip call ] [ nip call ] if ; inline
|
pick void? [ drop nip call ] [ nip call ] if ; inline
|
||||||
|
|
|
@ -2,7 +2,8 @@ USING: continuations kernel io debugger vocabs words system namespaces ;
|
||||||
|
|
||||||
:c
|
:c
|
||||||
:error
|
:error
|
||||||
|
|
||||||
"listener" vocab
|
"listener" vocab
|
||||||
[ restarts. vocab-main execute ]
|
[ restarts. vocab-main execute ]
|
||||||
[ die ] if*
|
[ error get die ] if*
|
||||||
1 exit
|
1 exit
|
||||||
|
|
|
@ -3,7 +3,7 @@ namespaces eval kernel vocabs.loader io ;
|
||||||
|
|
||||||
[
|
[
|
||||||
boot
|
boot
|
||||||
do-init-hooks
|
do-startup-hooks
|
||||||
[
|
[
|
||||||
(command-line) parse-command-line
|
(command-line) parse-command-line
|
||||||
load-vocab-roots
|
load-vocab-roots
|
||||||
|
@ -14,4 +14,4 @@ namespaces eval kernel vocabs.loader io ;
|
||||||
output-stream get [ stream-flush ] when*
|
output-stream get [ stream-flush ] when*
|
||||||
0 exit
|
0 exit
|
||||||
] [ print-error 1 exit ] recover
|
] [ print-error 1 exit ] recover
|
||||||
] set-boot-quot
|
] set-startup-quot
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
USING: init command-line system namespaces kernel vocabs.loader
|
USING: init command-line system namespaces kernel vocabs.loader io ;
|
||||||
io ;
|
|
||||||
|
|
||||||
[
|
[
|
||||||
boot
|
boot
|
||||||
do-init-hooks
|
do-startup-hooks
|
||||||
(command-line) parse-command-line
|
(command-line) parse-command-line
|
||||||
"run" get run
|
"run" get run
|
||||||
output-stream get [ stream-flush ] when*
|
output-stream get [ stream-flush ] when*
|
||||||
0 exit
|
0 exit
|
||||||
] set-boot-quot
|
] set-startup-quot
|
||||||
|
|
|
@ -145,7 +145,7 @@ SYMBOL: architecture
|
||||||
RESET
|
RESET
|
||||||
|
|
||||||
! Boot quotation, set in stage1.factor
|
! Boot quotation, set in stage1.factor
|
||||||
USERENV: bootstrap-boot-quot 20
|
USERENV: bootstrap-startup-quot 20
|
||||||
|
|
||||||
! Bootstrap global namesapce
|
! Bootstrap global namesapce
|
||||||
USERENV: bootstrap-global 21
|
USERENV: bootstrap-global 21
|
||||||
|
|
|
@ -35,8 +35,8 @@ SYMBOL: bootstrap-time
|
||||||
: count-words ( pred -- )
|
: count-words ( pred -- )
|
||||||
all-words swap count number>string write ; inline
|
all-words swap count number>string write ; inline
|
||||||
|
|
||||||
: print-time ( ms -- )
|
: print-time ( us -- )
|
||||||
1000 /i
|
1,000,000,000 /i
|
||||||
60 /mod swap
|
60 /mod swap
|
||||||
number>string write
|
number>string write
|
||||||
" minutes and " write number>string write " seconds." print ;
|
" minutes and " write number>string write " seconds." print ;
|
||||||
|
@ -56,9 +56,10 @@ SYMBOL: bootstrap-time
|
||||||
error-continuation set-global
|
error-continuation set-global
|
||||||
error set-global ; inline
|
error set-global ; inline
|
||||||
|
|
||||||
|
|
||||||
[
|
[
|
||||||
! We time bootstrap
|
! We time bootstrap
|
||||||
millis
|
nano-count
|
||||||
|
|
||||||
default-image-name "output-image" set-global
|
default-image-name "output-image" set-global
|
||||||
|
|
||||||
|
@ -83,14 +84,14 @@ SYMBOL: bootstrap-time
|
||||||
|
|
||||||
load-components
|
load-components
|
||||||
|
|
||||||
millis over - core-bootstrap-time set-global
|
nano-count over - core-bootstrap-time set-global
|
||||||
|
|
||||||
run-bootstrap-init
|
run-bootstrap-init
|
||||||
|
|
||||||
f error set-global
|
f error set-global
|
||||||
f error-continuation set-global
|
f error-continuation set-global
|
||||||
|
|
||||||
millis swap - bootstrap-time set-global
|
nano-count swap - bootstrap-time set-global
|
||||||
print-report
|
print-report
|
||||||
|
|
||||||
"deploy-vocab" get [
|
"deploy-vocab" get [
|
||||||
|
|
|
@ -16,7 +16,7 @@ ERROR: cairo-error message ;
|
||||||
|
|
||||||
: check-surface ( surface -- ) cairo_surface_status (check-cairo) ;
|
: check-surface ( surface -- ) cairo_surface_status (check-cairo) ;
|
||||||
|
|
||||||
: width>stride ( width -- stride ) "uint" heap-size * ; inline
|
: width>stride ( width -- stride ) uint heap-size * ; inline
|
||||||
|
|
||||||
: <image-surface> ( data dim -- surface )
|
: <image-surface> ( data dim -- surface )
|
||||||
[ CAIRO_FORMAT_ARGB32 ] dip first2 over width>stride
|
[ CAIRO_FORMAT_ARGB32 ] dip first2 over width>stride
|
||||||
|
|
|
@ -355,7 +355,7 @@ HELP: before
|
||||||
|
|
||||||
HELP: <zero>
|
HELP: <zero>
|
||||||
{ $values { "timestamp" timestamp } }
|
{ $values { "timestamp" timestamp } }
|
||||||
{ $description "Outputs a zero timestamp that consists of zeros for every slot. Used to see if timestamps are valid." } ;
|
{ $description "Returns a zero timestamp that consists of zeros for every slot. Used to see if timestamps are valid." } ;
|
||||||
|
|
||||||
HELP: valid-timestamp?
|
HELP: valid-timestamp?
|
||||||
{ $values { "timestamp" timestamp } { "?" "a boolean" } }
|
{ $values { "timestamp" timestamp } { "?" "a boolean" } }
|
||||||
|
@ -363,7 +363,7 @@ HELP: valid-timestamp?
|
||||||
|
|
||||||
HELP: unix-1970
|
HELP: unix-1970
|
||||||
{ $values { "timestamp" timestamp } }
|
{ $values { "timestamp" timestamp } }
|
||||||
{ $description "Outputs the beginning of UNIX time, or midnight, January 1, 1970." } ;
|
{ $description "Returns the beginning of UNIX time, or midnight, January 1, 1970." } ;
|
||||||
|
|
||||||
HELP: micros>timestamp
|
HELP: micros>timestamp
|
||||||
{ $values { "x" number } { "timestamp" timestamp } }
|
{ $values { "x" number } { "timestamp" timestamp } }
|
||||||
|
@ -377,13 +377,13 @@ HELP: micros>timestamp
|
||||||
|
|
||||||
HELP: gmt
|
HELP: gmt
|
||||||
{ $values { "timestamp" timestamp } }
|
{ $values { "timestamp" timestamp } }
|
||||||
{ $description "Outputs the time right now, but in the GMT timezone." } ;
|
{ $description "Returns the time right now, but in the GMT timezone." } ;
|
||||||
|
|
||||||
{ gmt now } related-words
|
{ gmt now } related-words
|
||||||
|
|
||||||
HELP: now
|
HELP: now
|
||||||
{ $values { "timestamp" timestamp } }
|
{ $values { "timestamp" timestamp } }
|
||||||
{ $description "Outputs the time right now in your computer's timezone." }
|
{ $description "Returns the time right now in your computer's timezone." }
|
||||||
{ $examples
|
{ $examples
|
||||||
{ $unchecked-example "USING: calendar prettyprint ;"
|
{ $unchecked-example "USING: calendar prettyprint ;"
|
||||||
"now ."
|
"now ."
|
||||||
|
@ -490,23 +490,23 @@ HELP: saturday
|
||||||
|
|
||||||
HELP: midnight
|
HELP: midnight
|
||||||
{ $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
|
{ $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
|
||||||
{ $description "Returns a timestamp that represents today at midnight, or the beginning of the day." } ;
|
{ $description "Returns a new timestamp that represents today at midnight, or the beginning of the day." } ;
|
||||||
|
|
||||||
HELP: noon
|
HELP: noon
|
||||||
{ $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
|
{ $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
|
||||||
{ $description "Returns a timestamp that represents today at noon, or the middle of the day." } ;
|
{ $description "Returns a new timestamp that represents today at noon, or the middle of the day." } ;
|
||||||
|
|
||||||
HELP: beginning-of-month
|
HELP: beginning-of-month
|
||||||
{ $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
|
{ $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
|
||||||
{ $description "Outputs a timestamp with the day set to one." } ;
|
{ $description "Returns a new timestamp with the day set to one." } ;
|
||||||
|
|
||||||
HELP: beginning-of-week
|
HELP: beginning-of-week
|
||||||
{ $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
|
{ $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
|
||||||
{ $description "Outputs a timestamp where the day of the week is Sunday." } ;
|
{ $description "Returns a new timestamp where the day of the week is Sunday." } ;
|
||||||
|
|
||||||
HELP: beginning-of-year
|
HELP: beginning-of-year
|
||||||
{ $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
|
{ $values { "object" object } { "new-timestamp" timestamp } }
|
||||||
{ $description "Outputs a timestamp with the month and day set to one, or January 1 of the input timestamp." } ;
|
{ $description "Returns a new timestamp with the month and day set to one, or January 1 of the input timestamp, given a year or a timestamp." } ;
|
||||||
|
|
||||||
HELP: time-since-midnight
|
HELP: time-since-midnight
|
||||||
{ $values { "timestamp" timestamp } { "duration" duration } }
|
{ $values { "timestamp" timestamp } { "duration" duration } }
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
USING: arrays calendar kernel math sequences tools.test
|
USING: arrays calendar kernel math sequences tools.test
|
||||||
continuations system math.order threads accessors ;
|
continuations system math.order threads accessors
|
||||||
|
random ;
|
||||||
IN: calendar.tests
|
IN: calendar.tests
|
||||||
|
|
||||||
[ f ] [ 2004 12 32 0 0 0 instant <timestamp> valid-timestamp? ] unit-test
|
[ f ] [ 2004 12 32 0 0 0 instant <timestamp> valid-timestamp? ] unit-test
|
||||||
|
@ -139,7 +140,7 @@ IN: calendar.tests
|
||||||
[ +gt+ ] [ 2005 1 1 12 30 0 instant <timestamp>
|
[ +gt+ ] [ 2005 1 1 12 30 0 instant <timestamp>
|
||||||
2004 1 1 13 30 0 instant <timestamp> <=> ] unit-test
|
2004 1 1 13 30 0 instant <timestamp> <=> ] unit-test
|
||||||
|
|
||||||
[ t ] [ now timestamp>micros micros - 1000000 < ] unit-test
|
[ t ] [ now timestamp>micros system-micros - 1000000 < ] unit-test
|
||||||
[ t ] [ 0 micros>timestamp unix-1970 = ] unit-test
|
[ t ] [ 0 micros>timestamp unix-1970 = ] unit-test
|
||||||
[ t ] [ 123456789000000 [ micros>timestamp timestamp>micros ] keep = ] unit-test
|
[ t ] [ 123456789000000 [ micros>timestamp timestamp>micros ] keep = ] unit-test
|
||||||
[ t ] [ 123456789123456000 [ micros>timestamp timestamp>micros ] keep = ] unit-test
|
[ t ] [ 123456789123456000 [ micros>timestamp timestamp>micros ] keep = ] unit-test
|
||||||
|
@ -170,3 +171,8 @@ IN: calendar.tests
|
||||||
[ f ] [ now dup midnight eq? ] unit-test
|
[ f ] [ now dup midnight eq? ] unit-test
|
||||||
[ f ] [ now dup easter eq? ] unit-test
|
[ f ] [ now dup easter eq? ] unit-test
|
||||||
[ f ] [ now dup beginning-of-year eq? ] unit-test
|
[ f ] [ now dup beginning-of-year eq? ] unit-test
|
||||||
|
|
||||||
|
[ t ] [ 1325376000 unix-time>timestamp 2012 <year-gmt> = ] unit-test
|
||||||
|
[ t ] [ 1356998399 unix-time>timestamp 2013 <year-gmt> 1 seconds time- = ] unit-test
|
||||||
|
|
||||||
|
[ t ] [ 1500000000 random [ unix-time>timestamp timestamp>unix-time ] keep = ] unit-test
|
||||||
|
|
|
@ -17,6 +17,8 @@ TUPLE: duration
|
||||||
|
|
||||||
C: <duration> duration
|
C: <duration> duration
|
||||||
|
|
||||||
|
: instant ( -- duration ) 0 0 0 0 0 0 <duration> ;
|
||||||
|
|
||||||
TUPLE: timestamp
|
TUPLE: timestamp
|
||||||
{ year integer }
|
{ year integer }
|
||||||
{ month integer }
|
{ month integer }
|
||||||
|
@ -34,6 +36,15 @@ C: <timestamp> timestamp
|
||||||
: <date> ( year month day -- timestamp )
|
: <date> ( year month day -- timestamp )
|
||||||
0 0 0 gmt-offset-duration <timestamp> ;
|
0 0 0 gmt-offset-duration <timestamp> ;
|
||||||
|
|
||||||
|
: <date-gmt> ( year month day -- timestamp )
|
||||||
|
0 0 0 instant <timestamp> ;
|
||||||
|
|
||||||
|
: <year> ( year -- timestamp )
|
||||||
|
1 1 <date> ;
|
||||||
|
|
||||||
|
: <year-gmt> ( year -- timestamp )
|
||||||
|
1 1 <date-gmt> ;
|
||||||
|
|
||||||
ERROR: not-a-month ;
|
ERROR: not-a-month ;
|
||||||
M: not-a-month summary
|
M: not-a-month summary
|
||||||
drop "Months are indexed starting at 1" ;
|
drop "Months are indexed starting at 1" ;
|
||||||
|
@ -132,8 +143,7 @@ GENERIC: easter ( obj -- obj' )
|
||||||
32 2 e * + 2 i * + h - k - 7 mod :> l
|
32 2 e * + 2 i * + h - k - 7 mod :> l
|
||||||
a 11 h * + 22 l * + 451 /i :> m
|
a 11 h * + 22 l * + 451 /i :> m
|
||||||
|
|
||||||
h l + 7 m * - 114 + 31 /mod 1 + :> ( month day )
|
h l + 7 m * - 114 + 31 /mod 1 + ;
|
||||||
month day ;
|
|
||||||
|
|
||||||
M: integer easter ( year -- timestamp )
|
M: integer easter ( year -- timestamp )
|
||||||
dup easter-month-day <date> ;
|
dup easter-month-day <date> ;
|
||||||
|
@ -149,7 +159,6 @@ M: timestamp easter ( timestamp -- timestamp )
|
||||||
: >time< ( timestamp -- hour minute second )
|
: >time< ( timestamp -- hour minute second )
|
||||||
[ hour>> ] [ minute>> ] [ second>> ] tri ;
|
[ hour>> ] [ minute>> ] [ second>> ] tri ;
|
||||||
|
|
||||||
: instant ( -- duration ) 0 0 0 0 0 0 <duration> ;
|
|
||||||
: years ( x -- duration ) instant clone swap >>year ;
|
: years ( x -- duration ) instant clone swap >>year ;
|
||||||
: months ( x -- duration ) instant clone swap >>month ;
|
: months ( x -- duration ) instant clone swap >>month ;
|
||||||
: days ( x -- duration ) instant clone swap >>day ;
|
: days ( x -- duration ) instant clone swap >>day ;
|
||||||
|
@ -376,7 +385,7 @@ M: duration time-
|
||||||
|
|
||||||
: gmt ( -- timestamp )
|
: gmt ( -- timestamp )
|
||||||
#! GMT time, right now
|
#! GMT time, right now
|
||||||
unix-1970 micros microseconds time+ ;
|
unix-1970 system-micros microseconds time+ ;
|
||||||
|
|
||||||
: now ( -- timestamp ) gmt >local-time ;
|
: now ( -- timestamp ) gmt >local-time ;
|
||||||
: hence ( duration -- timestamp ) now swap time+ ;
|
: hence ( duration -- timestamp ) now swap time+ ;
|
||||||
|
@ -430,6 +439,9 @@ M: timestamp day-name day-of-week day-names nth ;
|
||||||
: beginning-of-month ( timestamp -- new-timestamp )
|
: beginning-of-month ( timestamp -- new-timestamp )
|
||||||
midnight 1 >>day ;
|
midnight 1 >>day ;
|
||||||
|
|
||||||
|
: end-of-month ( timestamp -- new-timestamp )
|
||||||
|
[ midnight ] [ days-in-month ] bi >>day ;
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: day-offset ( timestamp m -- new-timestamp n )
|
: day-offset ( timestamp m -- new-timestamp n )
|
||||||
|
@ -522,8 +534,13 @@ M: timestamp december clone 12 >>month ;
|
||||||
: beginning-of-week ( timestamp -- new-timestamp )
|
: beginning-of-week ( timestamp -- new-timestamp )
|
||||||
midnight sunday ;
|
midnight sunday ;
|
||||||
|
|
||||||
: beginning-of-year ( timestamp -- new-timestamp )
|
GENERIC: beginning-of-year ( object -- new-timestamp )
|
||||||
beginning-of-month 1 >>month ;
|
M: timestamp beginning-of-year beginning-of-month 1 >>month ;
|
||||||
|
M: integer beginning-of-year <year> ;
|
||||||
|
|
||||||
|
GENERIC: end-of-year ( object -- new-timestamp )
|
||||||
|
M: timestamp end-of-year 12 >>month 31 >>day ;
|
||||||
|
M: integer end-of-year 12 31 <date> ;
|
||||||
|
|
||||||
: time-since-midnight ( timestamp -- duration )
|
: time-since-midnight ( timestamp -- duration )
|
||||||
dup midnight time- ;
|
dup midnight time- ;
|
||||||
|
@ -531,9 +548,13 @@ M: timestamp december clone 12 >>month ;
|
||||||
: since-1970 ( duration -- timestamp )
|
: since-1970 ( duration -- timestamp )
|
||||||
unix-1970 time+ >local-time ;
|
unix-1970 time+ >local-time ;
|
||||||
|
|
||||||
M: timestamp sleep-until timestamp>micros sleep-until ;
|
: timestamp>unix-time ( timestamp -- seconds )
|
||||||
|
unix-1970 time- second>> ;
|
||||||
|
|
||||||
M: duration sleep hence sleep-until ;
|
: unix-time>timestamp ( seconds -- timestamp )
|
||||||
|
seconds unix-1970 time+ ;
|
||||||
|
|
||||||
|
M: duration sleep duration>nanoseconds nano-count + sleep-until ;
|
||||||
|
|
||||||
{
|
{
|
||||||
{ [ os unix? ] [ "calendar.unix" ] }
|
{ [ os unix? ] [ "calendar.unix" ] }
|
||||||
|
|
|
@ -16,4 +16,4 @@ SYMBOL: time
|
||||||
] "Time model update" spawn drop ;
|
] "Time model update" spawn drop ;
|
||||||
|
|
||||||
f <model> time set-global
|
f <model> time set-global
|
||||||
[ time-thread ] "calendar.model" add-init-hook
|
[ time-thread ] "calendar.model" add-startup-hook
|
||||||
|
|
|
@ -14,6 +14,9 @@ IN: calendar.unix
|
||||||
: timespec>seconds ( timespec -- seconds )
|
: timespec>seconds ( timespec -- seconds )
|
||||||
[ sec>> seconds ] [ nsec>> nanoseconds ] bi time+ ;
|
[ sec>> seconds ] [ nsec>> nanoseconds ] bi time+ ;
|
||||||
|
|
||||||
|
: timespec>nanoseconds ( timespec -- seconds )
|
||||||
|
[ sec>> 1000000000 * ] [ nsec>> ] bi + ;
|
||||||
|
|
||||||
: timespec>unix-time ( timespec -- timestamp )
|
: timespec>unix-time ( timespec -- timestamp )
|
||||||
timespec>seconds since-1970 ;
|
timespec>seconds since-1970 ;
|
||||||
|
|
||||||
|
|
|
@ -69,4 +69,4 @@ M: remote-channel from ( remote-channel -- value )
|
||||||
[
|
[
|
||||||
H{ } clone \ remote-channels set-global
|
H{ } clone \ remote-channels set-global
|
||||||
start-channel-node
|
start-channel-node
|
||||||
] "channel-registry" add-init-hook
|
] "channel-registry" add-startup-hook
|
||||||
|
|
|
@ -278,8 +278,9 @@ M: struct binary-zero? >c-ptr [ 0 = ] all? ;
|
||||||
slots empty? [ struct-must-have-slots ] when
|
slots empty? [ struct-must-have-slots ] when
|
||||||
class redefine-struct-tuple-class
|
class redefine-struct-tuple-class
|
||||||
slots make-slots dup check-struct-slots :> slot-specs
|
slots make-slots dup check-struct-slots :> slot-specs
|
||||||
|
slot-specs offsets-quot call :> unaligned-size
|
||||||
slot-specs struct-alignment :> alignment
|
slot-specs struct-alignment :> alignment
|
||||||
slot-specs offsets-quot call alignment align :> size
|
unaligned-size alignment align :> size
|
||||||
|
|
||||||
class slot-specs size alignment c-type-for-class :> c-type
|
class slot-specs size alignment c-type-for-class :> c-type
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ TUPLE: objc-error alien reason ;
|
||||||
M: objc-error summary ( error -- )
|
M: objc-error summary ( error -- )
|
||||||
drop "Objective C exception" ;
|
drop "Objective C exception" ;
|
||||||
|
|
||||||
[ [ objc-error ] 19 setenv ] "cocoa.application" add-init-hook
|
[ [ objc-error ] 19 setenv ] "cocoa.application" add-startup-hook
|
||||||
|
|
||||||
: running.app? ( -- ? )
|
: running.app? ( -- ? )
|
||||||
#! Test if we're running a .app.
|
#! Test if we're running a .app.
|
||||||
|
|
|
@ -27,7 +27,7 @@ SYMBOL: frameworks
|
||||||
|
|
||||||
frameworks [ V{ } clone ] initialize
|
frameworks [ V{ } clone ] initialize
|
||||||
|
|
||||||
[ frameworks get [ load-framework ] each ] "cocoa" add-init-hook
|
[ frameworks get [ load-framework ] each ] "cocoa" add-startup-hook
|
||||||
|
|
||||||
SYNTAX: FRAMEWORK: scan [ load-framework ] [ frameworks get push ] bi ;
|
SYNTAX: FRAMEWORK: scan [ load-framework ] [ frameworks get push ] bi ;
|
||||||
|
|
||||||
|
|
|
@ -76,13 +76,13 @@ MACRO: (send) ( selector super? -- quot )
|
||||||
: super-send ( receiver args... selector -- return... ) t (send) ; inline
|
: super-send ( receiver args... selector -- return... ) t (send) ; inline
|
||||||
|
|
||||||
! Runtime introspection
|
! Runtime introspection
|
||||||
SYMBOL: class-init-hooks
|
SYMBOL: class-startup-hooks
|
||||||
|
|
||||||
class-init-hooks [ H{ } clone ] initialize
|
class-startup-hooks [ H{ } clone ] initialize
|
||||||
|
|
||||||
: (objc-class) ( name word -- class )
|
: (objc-class) ( name word -- class )
|
||||||
2dup execute dup [ 2nip ] [
|
2dup execute dup [ 2nip ] [
|
||||||
drop over class-init-hooks get at [ call( -- ) ] when*
|
drop over class-startup-hooks get at [ call( -- ) ] when*
|
||||||
2dup execute dup [ 2nip ] [
|
2dup execute dup [ 2nip ] [
|
||||||
2drop "No such class: " prepend throw
|
2drop "No such class: " prepend throw
|
||||||
] if
|
] if
|
||||||
|
@ -229,7 +229,7 @@ ERROR: no-objc-type name ;
|
||||||
: class-exists? ( string -- class ) objc_getClass >boolean ;
|
: class-exists? ( string -- class ) objc_getClass >boolean ;
|
||||||
|
|
||||||
: define-objc-class-word ( quot name -- )
|
: define-objc-class-word ( quot name -- )
|
||||||
[ class-init-hooks get set-at ]
|
[ class-startup-hooks get set-at ]
|
||||||
[
|
[
|
||||||
[ "cocoa.classes" create ] [ '[ _ objc-class ] ] bi
|
[ "cocoa.classes" create ] [ '[ _ objc-class ] ] bi
|
||||||
(( -- class )) define-declared
|
(( -- class )) define-declared
|
||||||
|
|
|
@ -69,4 +69,4 @@ SYMBOL: main-vocab-hook
|
||||||
: ignore-cli-args? ( -- ? )
|
: ignore-cli-args? ( -- ? )
|
||||||
os macosx? "run" get "ui" = and ;
|
os macosx? "run" get "ui" = and ;
|
||||||
|
|
||||||
[ default-cli-args ] "command-line" add-init-hook
|
[ default-cli-args ] "command-line" add-startup-hook
|
||||||
|
|
|
@ -4,7 +4,7 @@ USING: kernel math vectors arrays accessors namespaces ;
|
||||||
IN: compiler.cfg
|
IN: compiler.cfg
|
||||||
|
|
||||||
TUPLE: basic-block < identity-tuple
|
TUPLE: basic-block < identity-tuple
|
||||||
id
|
{ id integer }
|
||||||
number
|
number
|
||||||
{ instructions vector }
|
{ instructions vector }
|
||||||
{ successors vector }
|
{ successors vector }
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
! Copyright (C) 2008, 2009 Slava Pestov, Daniel Ehrenberg.
|
! Copyright (C) 2008, 2009 Slava Pestov, Daniel Ehrenberg.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel sequences words fry generic accessors
|
USING: alien.c-types kernel sequences words fry generic accessors
|
||||||
classes.tuple classes classes.algebra definitions
|
classes.tuple classes classes.algebra definitions
|
||||||
stack-checker.dependencies quotations classes.tuple.private math
|
stack-checker.dependencies quotations classes.tuple.private math
|
||||||
math.partial-dispatch math.private math.intervals sets.private
|
math.partial-dispatch math.private math.intervals sets.private
|
||||||
|
@ -8,6 +8,7 @@ math.floats.private math.integers.private layouts math.order
|
||||||
vectors hashtables combinators effects generalizations assocs
|
vectors hashtables combinators effects generalizations assocs
|
||||||
sets combinators.short-circuit sequences.private locals growable
|
sets combinators.short-circuit sequences.private locals growable
|
||||||
stack-checker namespaces compiler.tree.propagation.info ;
|
stack-checker namespaces compiler.tree.propagation.info ;
|
||||||
|
FROM: math => float ;
|
||||||
IN: compiler.tree.propagation.transforms
|
IN: compiler.tree.propagation.transforms
|
||||||
|
|
||||||
\ equal? [
|
\ equal? [
|
||||||
|
@ -307,3 +308,11 @@ CONSTANT: lookup-table-at-max 256
|
||||||
in-d>> second value-info class>> growable class<=
|
in-d>> second value-info class>> growable class<=
|
||||||
[ \ push def>> ] [ f ] if
|
[ \ push def>> ] [ f ] if
|
||||||
] "custom-inlining" set-word-prop
|
] "custom-inlining" set-word-prop
|
||||||
|
|
||||||
|
! We want to constant-fold calls to heap-size, and recompile those
|
||||||
|
! calls when a C type is redefined
|
||||||
|
\ heap-size [
|
||||||
|
dup word? [
|
||||||
|
[ inlined-dependency depends-on ] [ heap-size '[ _ ] ] bi
|
||||||
|
] [ drop f ] if
|
||||||
|
] 1 define-partial-eval
|
||||||
|
|
|
@ -60,6 +60,4 @@ M: thread (serialize) ( obj -- )
|
||||||
|
|
||||||
[
|
[
|
||||||
H{ } clone \ registered-remote-threads set-global
|
H{ } clone \ registered-remote-threads set-global
|
||||||
] "remote-thread-registry" add-init-hook
|
] "remote-thread-registry" add-startup-hook
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -156,7 +156,7 @@ SYMBOL: event-stream-callbacks
|
||||||
[
|
[
|
||||||
event-stream-callbacks
|
event-stream-callbacks
|
||||||
[ [ drop expired? not ] assoc-filter H{ } assoc-like ] change-global
|
[ [ drop expired? not ] assoc-filter H{ } assoc-like ] change-global
|
||||||
] "core-foundation" add-init-hook
|
] "core-foundation" add-startup-hook
|
||||||
|
|
||||||
: add-event-source-callback ( quot -- id )
|
: add-event-source-callback ( quot -- id )
|
||||||
event-stream-counter <alien>
|
event-stream-counter <alien>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors alien alien.c-types alien.syntax kernel math
|
USING: accessors alien alien.c-types alien.syntax kernel math
|
||||||
namespaces sequences destructors combinators threads heaps
|
namespaces sequences destructors combinators threads heaps
|
||||||
deques calendar core-foundation core-foundation.strings
|
deques calendar system core-foundation core-foundation.strings
|
||||||
core-foundation.file-descriptors core-foundation.timers
|
core-foundation.file-descriptors core-foundation.timers
|
||||||
core-foundation.time ;
|
core-foundation.time ;
|
||||||
IN: core-foundation.run-loop
|
IN: core-foundation.run-loop
|
||||||
|
@ -96,12 +96,15 @@ TUPLE: run-loop fds sources timers ;
|
||||||
: ((reset-timer)) ( timer counter timestamp -- )
|
: ((reset-timer)) ( timer counter timestamp -- )
|
||||||
nip >CFAbsoluteTime CFRunLoopTimerSetNextFireDate ;
|
nip >CFAbsoluteTime CFRunLoopTimerSetNextFireDate ;
|
||||||
|
|
||||||
|
: nano-count>timestamp ( x -- timestamp )
|
||||||
|
nano-count - nanoseconds now time+ ;
|
||||||
|
|
||||||
: (reset-timer) ( timer counter -- )
|
: (reset-timer) ( timer counter -- )
|
||||||
yield {
|
yield {
|
||||||
{ [ dup 0 = ] [ now ((reset-timer)) ] }
|
{ [ dup 0 = ] [ now ((reset-timer)) ] }
|
||||||
{ [ run-queue deque-empty? not ] [ 1 - (reset-timer) ] }
|
{ [ run-queue deque-empty? not ] [ 1 - (reset-timer) ] }
|
||||||
{ [ sleep-queue heap-empty? ] [ 5 minutes hence ((reset-timer)) ] }
|
{ [ sleep-queue heap-empty? ] [ 5 minutes hence ((reset-timer)) ] }
|
||||||
[ sleep-queue heap-peek nip micros>timestamp ((reset-timer)) ]
|
[ sleep-queue heap-peek nip nano-count>timestamp ((reset-timer)) ]
|
||||||
} cond ;
|
} cond ;
|
||||||
|
|
||||||
: reset-timer ( timer -- )
|
: reset-timer ( timer -- )
|
||||||
|
@ -121,8 +124,8 @@ PRIVATE>
|
||||||
: init-thread-timer ( -- )
|
: init-thread-timer ( -- )
|
||||||
timer-callback <CFTimer> add-timer-to-run-loop ;
|
timer-callback <CFTimer> add-timer-to-run-loop ;
|
||||||
|
|
||||||
: run-one-iteration ( us -- handled? )
|
: run-one-iteration ( nanos -- handled? )
|
||||||
reset-run-loop
|
reset-run-loop
|
||||||
CFRunLoopDefaultMode
|
CFRunLoopDefaultMode
|
||||||
swap [ microseconds ] [ 5 minutes ] if* >CFTimeInterval
|
swap [ nanoseconds ] [ 5 minutes ] if* >CFTimeInterval
|
||||||
t CFRunLoopRunInMode kCFRunLoopRunHandledSource = ;
|
t CFRunLoopRunInMode kCFRunLoopRunHandledSource = ;
|
||||||
|
|
|
@ -149,4 +149,4 @@ SYMBOL: cached-lines
|
||||||
: cached-line ( font string -- line )
|
: cached-line ( font string -- line )
|
||||||
cached-lines get [ <line> ] 2cache ;
|
cached-lines get [ <line> ] 2cache ;
|
||||||
|
|
||||||
[ <cache-assoc> cached-lines set-global ] "core-text" add-init-hook
|
[ <cache-assoc> cached-lines set-global ] "core-text" add-startup-hook
|
||||||
|
|
|
@ -127,4 +127,4 @@ MEMO: (cache-font-metrics) ( font -- metrics )
|
||||||
[
|
[
|
||||||
\ (cache-font) reset-memoized
|
\ (cache-font) reset-memoized
|
||||||
\ (cache-font-metrics) reset-memoized
|
\ (cache-font-metrics) reset-memoized
|
||||||
] "core-text.fonts" add-init-hook
|
] "core-text.fonts" add-startup-hook
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
! Copyright (C) 2008 Slava Pestov.
|
! Copyright (C) 2008 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: bootstrap.image.private kernel namespaces system
|
USING: bootstrap.image.private kernel namespaces system layouts
|
||||||
layouts vocabs parser sequences cpu.x86.assembler parser
|
vocabs sequences cpu.x86.assembler parser
|
||||||
cpu.x86.assembler.operands ;
|
cpu.x86.assembler.operands ;
|
||||||
IN: bootstrap.x86
|
IN: bootstrap.x86
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ MEMO: sse-version ( -- n )
|
||||||
sse_version
|
sse_version
|
||||||
"sse-version" get string>number [ min ] when* ;
|
"sse-version" get string>number [ min ] when* ;
|
||||||
|
|
||||||
[ \ sse-version reset-memoized ] "cpu.x86.features" add-init-hook
|
[ \ sse-version reset-memoized ] "cpu.x86.features" add-startup-hook
|
||||||
|
|
||||||
: sse? ( -- ? ) sse-version 10 >= ;
|
: sse? ( -- ? ) sse-version 10 >= ;
|
||||||
: sse2? ( -- ? ) sse-version 20 >= ;
|
: sse2? ( -- ? ) sse-version 20 >= ;
|
||||||
|
|
|
@ -1413,7 +1413,7 @@ enable-fixnum-log2
|
||||||
flush
|
flush
|
||||||
1 exit
|
1 exit
|
||||||
] when
|
] when
|
||||||
] "cpu.x86" add-init-hook ;
|
] "cpu.x86" add-startup-hook ;
|
||||||
|
|
||||||
: enable-sse2 ( version -- )
|
: enable-sse2 ( version -- )
|
||||||
20 >= [
|
20 >= [
|
||||||
|
|
|
@ -32,14 +32,14 @@ ERROR: sqlite-sql-error < sql-error n string ;
|
||||||
|
|
||||||
: sqlite-open ( path -- db )
|
: sqlite-open ( path -- db )
|
||||||
normalize-path
|
normalize-path
|
||||||
"void*" <c-object>
|
void* <c-object>
|
||||||
[ sqlite3_open sqlite-check-result ] keep *void* ;
|
[ sqlite3_open sqlite-check-result ] keep *void* ;
|
||||||
|
|
||||||
: sqlite-close ( db -- )
|
: sqlite-close ( db -- )
|
||||||
sqlite3_close sqlite-check-result ;
|
sqlite3_close sqlite-check-result ;
|
||||||
|
|
||||||
: sqlite-prepare ( db sql -- handle )
|
: sqlite-prepare ( db sql -- handle )
|
||||||
utf8 encode dup length "void*" <c-object> "void*" <c-object>
|
utf8 encode dup length void* <c-object> void* <c-object>
|
||||||
[ sqlite3_prepare_v2 sqlite-check-result ] 2keep
|
[ sqlite3_prepare_v2 sqlite-check-result ] 2keep
|
||||||
drop *void* ;
|
drop *void* ;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
unportable
|
|
@ -49,7 +49,7 @@ M: cannot-find-source error.
|
||||||
|
|
||||||
: edit-error ( error -- )
|
: edit-error ( error -- )
|
||||||
[ error-file ] [ error-line ] bi
|
[ error-file ] [ error-line ] bi
|
||||||
2dup and [ edit-location ] [ 2drop ] if ;
|
over [ 1 or edit-location ] [ 2drop ] if ;
|
||||||
|
|
||||||
: :edit ( -- )
|
: :edit ( -- )
|
||||||
error get edit-error ;
|
error get edit-error ;
|
||||||
|
|
|
@ -32,4 +32,4 @@ HOOK: (set-os-envs) os ( seq -- )
|
||||||
os windows? ";" ":" ? split
|
os windows? ";" ":" ? split
|
||||||
[ add-vocab-root ] each
|
[ add-vocab-root ] each
|
||||||
] when*
|
] when*
|
||||||
] "environment" add-init-hook
|
] "environment" add-startup-hook
|
||||||
|
|
|
@ -22,7 +22,7 @@ server-state f
|
||||||
|
|
||||||
: expire-state ( class -- )
|
: expire-state ( class -- )
|
||||||
new
|
new
|
||||||
-1/0. millis [a,b] >>expires
|
-1/0. system-micros [a,b] >>expires
|
||||||
delete-tuples ;
|
delete-tuples ;
|
||||||
|
|
||||||
TUPLE: server-state-manager < filter-responder timeout ;
|
TUPLE: server-state-manager < filter-responder timeout ;
|
||||||
|
@ -33,4 +33,4 @@ TUPLE: server-state-manager < filter-responder timeout ;
|
||||||
20 minutes >>timeout ; inline
|
20 minutes >>timeout ; inline
|
||||||
|
|
||||||
: touch-state ( state manager -- )
|
: touch-state ( state manager -- )
|
||||||
timeout>> hence timestamp>millis >>expires drop ;
|
timeout>> hence timestamp>micros >>expires drop ;
|
||||||
|
|
|
@ -35,7 +35,7 @@ M: f (reset-game-input) ;
|
||||||
: reset-game-input ( -- )
|
: reset-game-input ( -- )
|
||||||
(reset-game-input) ;
|
(reset-game-input) ;
|
||||||
|
|
||||||
[ reset-game-input ] "game-input" add-init-hook
|
[ reset-game-input ] "game-input" add-startup-hook
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ sequences locals combinators.short-circuit threads
|
||||||
namespaces assocs arrays combinators hints alien
|
namespaces assocs arrays combinators hints alien
|
||||||
core-foundation.run-loop accessors sequences.private
|
core-foundation.run-loop accessors sequences.private
|
||||||
alien.c-types alien.data math parser game.input vectors
|
alien.c-types alien.data math parser game.input vectors
|
||||||
bit-arrays ;
|
bit-arrays unix.types ;
|
||||||
IN: game.input.iokit
|
IN: game.input.iokit
|
||||||
|
|
||||||
SINGLETON: iokit-game-input-backend
|
SINGLETON: iokit-game-input-backend
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue