2010-02-24 03:18:29 -05:00
|
|
|
! Copyright (C) 2008, 2010 Slava Pestov
|
2008-04-11 13:18:39 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-09-27 00:14:57 -04:00
|
|
|
USING: accessors alien alien.c-types alien.syntax kernel math
|
|
|
|
namespaces sequences destructors combinators threads heaps
|
2009-11-20 00:51:09 -05:00
|
|
|
deques calendar system core-foundation core-foundation.strings
|
2008-12-13 05:57:37 -05:00
|
|
|
core-foundation.file-descriptors core-foundation.timers
|
|
|
|
core-foundation.time ;
|
2008-04-11 13:18:39 -04:00
|
|
|
IN: core-foundation.run-loop
|
|
|
|
|
2009-02-22 20:13:08 -05:00
|
|
|
CONSTANT: kCFRunLoopRunFinished 1
|
|
|
|
CONSTANT: kCFRunLoopRunStopped 2
|
|
|
|
CONSTANT: kCFRunLoopRunTimedOut 3
|
|
|
|
CONSTANT: kCFRunLoopRunHandledSource 4
|
2008-04-11 13:18:39 -04:00
|
|
|
|
|
|
|
TYPEDEF: void* CFRunLoopRef
|
2008-12-06 18:35:04 -05:00
|
|
|
TYPEDEF: void* CFRunLoopSourceRef
|
2008-04-11 13:18:39 -04:00
|
|
|
|
2008-04-11 14:20:03 -04:00
|
|
|
FUNCTION: CFRunLoopRef CFRunLoopGetMain ( ) ;
|
2008-07-14 23:21:10 -04:00
|
|
|
FUNCTION: CFRunLoopRef CFRunLoopGetCurrent ( ) ;
|
2008-04-11 14:20:03 -04:00
|
|
|
|
2008-04-11 13:18:39 -04:00
|
|
|
FUNCTION: SInt32 CFRunLoopRunInMode (
|
2008-12-18 19:09:22 -05:00
|
|
|
CFStringRef mode,
|
|
|
|
CFTimeInterval seconds,
|
|
|
|
Boolean returnAfterSourceHandled
|
2008-04-11 13:18:39 -04:00
|
|
|
) ;
|
|
|
|
|
2008-12-06 18:35:04 -05:00
|
|
|
FUNCTION: CFRunLoopSourceRef CFFileDescriptorCreateRunLoopSource (
|
|
|
|
CFAllocatorRef allocator,
|
|
|
|
CFFileDescriptorRef f,
|
|
|
|
CFIndex order
|
|
|
|
) ;
|
|
|
|
|
|
|
|
FUNCTION: void CFRunLoopAddSource (
|
2008-12-18 19:09:22 -05:00
|
|
|
CFRunLoopRef rl,
|
|
|
|
CFRunLoopSourceRef source,
|
|
|
|
CFStringRef mode
|
2008-12-06 18:35:04 -05:00
|
|
|
) ;
|
|
|
|
|
2008-12-11 23:48:19 -05:00
|
|
|
FUNCTION: void CFRunLoopRemoveSource (
|
2008-12-18 19:09:22 -05:00
|
|
|
CFRunLoopRef rl,
|
|
|
|
CFRunLoopSourceRef source,
|
|
|
|
CFStringRef mode
|
2008-12-11 23:48:19 -05:00
|
|
|
) ;
|
|
|
|
|
2008-12-12 02:11:37 -05:00
|
|
|
FUNCTION: void CFRunLoopAddTimer (
|
2008-12-18 19:09:22 -05:00
|
|
|
CFRunLoopRef rl,
|
|
|
|
CFRunLoopTimerRef timer,
|
|
|
|
CFStringRef mode
|
2008-12-12 02:11:37 -05:00
|
|
|
) ;
|
|
|
|
|
|
|
|
FUNCTION: void CFRunLoopRemoveTimer (
|
2008-12-18 19:09:22 -05:00
|
|
|
CFRunLoopRef rl,
|
|
|
|
CFRunLoopTimerRef timer,
|
|
|
|
CFStringRef mode
|
2008-12-12 02:11:37 -05:00
|
|
|
) ;
|
|
|
|
|
2009-09-12 20:43:23 -04:00
|
|
|
CFSTRING: CFRunLoopDefaultMode "kCFRunLoopDefaultMode"
|
2008-12-13 00:57:16 -05:00
|
|
|
|
|
|
|
TUPLE: run-loop fds sources timers ;
|
|
|
|
|
|
|
|
: <run-loop> ( -- run-loop )
|
|
|
|
V{ } clone V{ } clone V{ } clone \ run-loop boa ;
|
|
|
|
|
|
|
|
: run-loop ( -- run-loop )
|
2009-02-20 21:51:13 -05:00
|
|
|
\ run-loop [ <run-loop> ] initialize-alien ;
|
2008-12-13 00:57:16 -05:00
|
|
|
|
|
|
|
: add-source-to-run-loop ( source -- )
|
|
|
|
[ run-loop sources>> push ]
|
|
|
|
[
|
|
|
|
CFRunLoopGetMain
|
|
|
|
swap CFRunLoopDefaultMode
|
|
|
|
CFRunLoopAddSource
|
|
|
|
] bi ;
|
|
|
|
|
|
|
|
: create-fd-source ( CFFileDescriptor -- source )
|
|
|
|
f swap 0 CFFileDescriptorCreateRunLoopSource ;
|
|
|
|
|
|
|
|
: add-fd-to-run-loop ( fd callback -- )
|
|
|
|
[
|
|
|
|
<CFFileDescriptor> |CFRelease
|
|
|
|
[ run-loop fds>> push ]
|
|
|
|
[ create-fd-source |CFRelease add-source-to-run-loop ]
|
|
|
|
bi
|
|
|
|
] with-destructors ;
|
|
|
|
|
|
|
|
: add-timer-to-run-loop ( timer -- )
|
|
|
|
[ run-loop timers>> push ]
|
|
|
|
[
|
|
|
|
CFRunLoopGetMain
|
|
|
|
swap CFRunLoopDefaultMode
|
|
|
|
CFRunLoopAddTimer
|
|
|
|
] bi ;
|
|
|
|
|
2010-02-24 02:50:34 -05:00
|
|
|
: invalidate-run-loop-timers ( -- )
|
2010-02-24 03:18:29 -05:00
|
|
|
run-loop [
|
|
|
|
[ [ CFRunLoopTimerInvalidate ] [ CFRelease ] bi ] each
|
|
|
|
V{ } clone
|
|
|
|
] change-timers drop ;
|
2010-02-24 02:50:34 -05:00
|
|
|
|
2008-12-13 00:57:16 -05:00
|
|
|
<PRIVATE
|
|
|
|
|
2010-02-28 18:22:18 -05:00
|
|
|
: (reset-timer) ( timer timestamp -- )
|
|
|
|
>CFAbsoluteTime CFRunLoopTimerSetNextFireDate ;
|
2008-12-13 00:57:16 -05:00
|
|
|
|
2010-02-28 18:22:18 -05:00
|
|
|
: nano-count>micros ( x -- n )
|
|
|
|
nano-count - 1,000 /f system-micros + ;
|
2009-11-20 00:51:09 -05:00
|
|
|
|
2010-02-28 18:22:18 -05:00
|
|
|
: reset-timer ( timer -- )
|
2008-12-13 00:57:16 -05:00
|
|
|
yield {
|
2010-02-28 18:22:18 -05:00
|
|
|
{ [ run-queue deque-empty? not ] [ yield system-micros (reset-timer) ] }
|
|
|
|
{ [ sleep-queue heap-empty? ] [ system-micros 1,000,000 + (reset-timer) ] }
|
|
|
|
[ sleep-queue heap-peek nip nano-count>micros (reset-timer) ]
|
2008-12-13 00:57:16 -05:00
|
|
|
} cond ;
|
|
|
|
|
|
|
|
PRIVATE>
|
|
|
|
|
|
|
|
: reset-run-loop ( -- )
|
|
|
|
run-loop
|
|
|
|
[ timers>> [ reset-timer ] each ]
|
|
|
|
[ fds>> [ enable-all-callbacks ] each ] bi ;
|
|
|
|
|
|
|
|
: timer-callback ( -- callback )
|
2009-10-21 22:10:11 -04:00
|
|
|
void { CFRunLoopTimerRef void* } "cdecl"
|
2008-12-13 00:57:16 -05:00
|
|
|
[ 2drop reset-run-loop yield ] alien-callback ;
|
|
|
|
|
|
|
|
: init-thread-timer ( -- )
|
|
|
|
timer-callback <CFTimer> add-timer-to-run-loop ;
|
|
|
|
|
2009-11-19 15:18:27 -05:00
|
|
|
: run-one-iteration ( nanos -- handled? )
|
2008-12-13 00:57:16 -05:00
|
|
|
reset-run-loop
|
|
|
|
CFRunLoopDefaultMode
|
2009-11-19 15:18:27 -05:00
|
|
|
swap [ nanoseconds ] [ 5 minutes ] if* >CFTimeInterval
|
2008-12-13 00:57:16 -05:00
|
|
|
t CFRunLoopRunInMode kCFRunLoopRunHandledSource = ;
|