summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* Parallelize ping client and server.Andy Wingo2017-02-142-2/+4
| | | | | * examples/ping-client.scm: * examples/ping-server.scm: Parallelize.
* Fix ping-clientAndy Wingo2017-02-141-6/+10
| | | | | * examples/ping-client.scm: Fix for run-fibers changes, to only exit when done.
* Fix spurious epoll trafficAndy Wingo2017-02-141-1/+1
| | | | | | | | | | * fibers/internal.scm (schedule-fibers-for-fd): Fix sense of the POLLERR test. This was causing us to register and unregister our fd's with the kernel all the time. This was a scalability bottleneck as adding or removing an fd from an epoll set is serialized in the kernel through one mutex (!!!!), the "epmutex"; because you can nest epoll instances the kernel uses this to prevent cycles. Hint found in Voellmy's paper on the MIO system for Haskell.
* Minor tweak to web serverAndy Wingo2017-02-141-2/+3
| | | | | * fibers/web/server.scm (socket-loop): Move set-nonblocking! call to client where it parallelizes better.
* Gracefully handle EPIPEAndy Wingo2017-02-121-3/+4
| | | | | | * fibers/web/server.scm (client-loop): Avoid error when reading from shut-down socket (EPIPE). Perhaps a read that gives EPIPE should produce an EOF object anyway.
* Cope with migration of initial fiberAndy Wingo2017-02-121-1/+4
| | | | * fibers.scm (run-fibers): Allow migration of main fiber.
* Add concurrent web serverAndy Wingo2017-02-114-7/+335
| | | | | | | | * fibers.texi (Concurrent Web Server): New section. * fibers/web/server.scm: Add web server that can run handlers concurrently. * examples/concurrent-web-hello.scm: New file. * Makefile.am (SOURCES): Add (fibers web server).
* Add condition variable implementationAndy Wingo2017-02-116-6/+227
| | | | | | | | | * fibers/conditions.scm: * tests/conditions.scm: New files. * Makefile.am: Add new files. * fibers.texi (Conditions): New section. * fibers/timers.scm (sleep-operation): Rename from wait-operation. * tests/foreign.scm: Adapt to sleep-operation change.
* Fix channel CAS logicAndy Wingo2017-02-081-4/+4
| | | | | * fibers/channels.scm (put-operation, get-operation): Fix bogus CAS that could cause us to spin in an allocation loop.
* Prevent GC from waking up epollAndy Wingo2017-02-081-7/+27
| | | | | * epoll.c (do_epoll_wait): Leave Guile to do the epoll, preventing libgc from having to interrupt us for GC.
* Better exception handlingAndy Wingo2017-02-071-4/+17
| | | | | | | * fibers/internal.scm (create-fiber): Add a start-stack and a catch-all around the fiber thunk. Note that in practice this needs the recent post-2.1.6 patch in Guile (498f3f95684361f3591106a8f9cb9065fd649288) to work well.
* Update doc version.Andy Wingo2017-01-191-3/+3
| | | | * fibers.texi: Update version.
* Fibers v0.5.0.v0.5.0Andy Wingo2017-01-192-1/+12
| | | | | * configure.ac: Bump version. * NEWS: Update.
* Update documentation.Andy Wingo2017-01-191-2/+9
| | | | * fibers.texi (Using Fibers): Update.
* Better findability for epoll extension.Andy Wingo2017-01-194-1/+44
| | | | | | | * fibers/config.scm.in: New file. * Makefile.am: Wire up new file. * env.in: Define FIBERS_BUILD_DIR. * fibers/epoll.scm: Use (fibers config) to get dir for epoll extension.
* Randomized round-robin work sharing/stealingAndy Wingo2017-01-182-63/+76
| | | | | | | | | | | | | * fibers.scm (start-auxiliary-threads, stop-auxiliary-threads): Adapt to scheduler-remote-peers change. (spawn-fiber): Adapt to use choose-parallel-scheduler. * fibers/internal.scm (<scheduler>): Add choose-parallel-scheduler field. (shuffle, make-selector): New helpers. (make-scheduler): Adapt to initialize choose-parallel-scheduler field. (choose-parallel-scheduler): New public function. (run-scheduler): Use fiber-stealer.
* More speedup tests.Andy Wingo2017-01-181-3/+7
| | | | * tests/speedup.scm (do-times): Add different loop-to tests.
* Add test for parallel speedup.Andy Wingo2017-01-182-1/+57
| | | | | * tests/speedup.scm: New file. * Makefile.am (TESTS): Add new file.
* Pin worker threads to CPUs if appropriateAndy Wingo2017-01-171-21/+58
| | | | | | | | * fibers.scm (with-affinity): New helper. (%run-fibers): Add affinity argument. (start-auxiliary-threads): Add affinities argument. (compute-affinities): New helper. (run-fibers): If the parallelism is complete, pin threads to CPUs.
* Update TODOAndy Wingo2017-01-081-4/+0
|
* Update documentationAndy Wingo2017-01-081-85/+211
| | | | * fibers.texi: Update.
* Disable parallelism in scheduling-order testsAndy Wingo2017-01-081-4/+4
| | | | | | * tests/basic.scm (assert-run-fibers-terminates): Allow keyword args to run-fibers. (run-order, wakeup-order): Disable parallelism.
* create-fiber always captures dynamic stateAndy Wingo2017-01-083-13/+12
| | | | | | | * fibers/internal.scm (create-fiber): Remove dynamic-state argument; always capture the current dynamic state. * fibers/timers.scm (timer-operation): * fibers.scm (spawn-fiber): Adapt.
* Enable preemption by defaultAndy Wingo2017-01-081-3/+2
| | | | | * fibers.scm (run-fibers): Enable preemption by default with a period of 10ms.
* Peer schedulers share a prompt tagAndy Wingo2017-01-081-15/+17
| | | | | | | | * fibers/internal.scm (make-scheduler): Peer schedulers share a prompt tag. This eliminates TOCTTOU bugs in suspend-current-fiber when computing the suspension prompt tag. (run-scheduler): Inline run-fiber and just use the same prompt tag for all fibers.
* Fix race between with-interrupts and thread startAndy Wingo2017-01-081-4/+10
| | | | * fibers/interrupts.scm (with-interrupts/thread-cputime): Fix race.
* Fix clock-nanosleep wrapperAndy Wingo2017-01-081-9/+7
| | | | | * fibers/posix-clocks.scm (clock-nanosleep): clock_nanosleep returns the error value directly; it doesn't set errno. Fix.
* Web server uses dedicated fiber threadAndy Wingo2017-01-061-55/+56
| | | | | | | * web/server/fibers.scm: Instead of manually cothreading between fibers and the web server, instead have the web server use our new support for CML operations from outside fibers to use channels to communicate with a pool of threads running fibers.
* Allow run-fibers thread to be cleanly cancelledAndy Wingo2017-01-061-3/+4
| | | | | * fibers.scm (run-fibers): Spawn and cancel aux threads within a dynamic-wind.
* Add support for operations from foreign threadsAndy Wingo2017-01-054-2/+123
| | | | | | | | | | * tests/foreign.scm: New file. * Makefile.am: Add new file. * fibers/operations.scm (perform-operation): Support blocking operations from foreign threads (without a scheduler). * fibers/timers.scm (timer-sched, *timer-sched*, timer-operation): Add support for timeouts that use an auxiliary thread instead of relying on the current scheduler.
* Remove epoll dep on suspendable portsAndy Wingo2017-01-042-21/+50
| | | | | | | | | * epoll.c (scm_primitive_epoll_wake): New function. (scm_primitive_epoll_wait): If the epoll was woken, drain the read pipe directly. (init_fibers_epoll): Adapt prototypes. * fibers/epoll.scm (epoll-wake!): Use primitive-epoll-wake. (epoll): Let primitive-epoll-wait handle wakeup.
* Centralize operation wrap handlingAndy Wingo2017-01-043-28/+28
| | | | | | | * fibers/operations.scm (<base-op>): Update comment. (perform-operation): Wrap resume proc before calling block function. * fibers/channels.scm (put-operation, get-operation): * fibers/timers.scm (timer-operation): Adapt to pre-wrapped resume proc.
* Prepare for support for blocking operationsAndy Wingo2017-01-044-62/+58
| | | | | | | | | | | | * fibers/operations.scm (perform-operation): Block function takes sched and resume function, not fiber. Will allow blocking operations in the future. * fibers/internal.scm (add-timer): Rename from resume-on-timer; just call a thunk after a time has passed. * fibers/timers.scm (timer-operation): Adapt to resume-on-timer and operation changes. * fibers/channels.scm (put-operation, get-operation): Adapt to operation changes.
* Fix ,spawn-fiberAndy Wingo2016-12-301-1/+1
| | | | | * fibers/repl.scm (spawn-fiber): Use spawn-fiber instead of create-fiber to get right dynamic-state.
* Fix spawn-fiber outside run-fibersAndy Wingo2016-12-302-24/+53
| | | | | | | | | * fibers.scm (run-fibers): Require init thunk for run-fibers without a scheduler. (spawn-fiber): Incorporate helper procedures, remove dynamic-state argument (as it's always the current dynamic state), and add parallel? argument. Ensure the fiber will have the right read/write waiters. * tests/basic.scm: Update.
* Enable parallelism by defaultAndy Wingo2016-12-291-18/+50
| | | | | | * fibers.scm (run-fibers): Default to use all current processor cores. (%run-fibers, start-auxiliary-threads, stop-auxiliary-threads): New helpers.
* Flesh out remote peers interfaceAndy Wingo2016-12-291-3/+14
| | | | | | | * fibers/internal.scm (<scheduler>): Add remote-peers setter, and expose getter publically. (make-scheduler): Change remote-peers arg to "parallelism", and use setter to initialize remote peers.
* C-c works on threads stuck in epollAndy Wingo2016-12-292-11/+21
| | | | | | | | * epoll.c (scm_primitive_epoll_wait): Add wakefd argument, and use facilities from git guile to ensure that C-c will wake a thread sleeping in epoll. (init_fibers_epoll): Declare additional primitive-epoll-wait arg. * fibers/epoll.scm (epoll): Tell Guile about the wake fd.
* Remove #:keep-scheduler? argAndy Wingo2016-12-273-32/+27
| | | | | | | * fibers.scm (run-fibers): Remove #:keep-scheduler? argument; instead, only destroy schedulers that we create. * fibers.texi (Using Fibers): Update run-fibers docs. * web/server/fibers.scm (server-read): Adapt.
* Fix yield-current-fiberAndy Wingo2016-12-231-5/+8
| | | | | | * fibers/internal.scm (yield-current-fiber): Fix to allow yield-current-fiber to be run from an interrupt tick, when it's possible that no fiber is current.
* Enable work stealing in run-schedulerAndy Wingo2016-12-222-43/+58
| | | | | | | | | | | | | | | | * fibers.scm (run-fibers): Store result in an atomic box, given that the initial fiber could migrate. * fibers/internal.scm (<scheduler>): Add remote-peers field. (<fiber>): Add set-fiber-scheduler!. (make-scheduler): Adapt to <scheduler> change. (scheduler-finished?): New helper. (scheduler-poll-timeout): Take a finished? predicate to know when to wait and when to return directly. (schedule-runnables-for-next-turn): Plumb finished? predicate through. (run-scheduler): Avoid returning until finished? is true. Refactor to add work stealing. (steal-fiber!): New helper.
* Get current scheduler from current fiberAndy Wingo2016-12-222-41/+37
| | | | | | | | | | | | | | | | | | | * fibers.scm (run-fibers): Refine #:keep-scheduler? default. (current-fiber-scheduler): Rename from require-current-scheduler, and use the current fiber to get at the scheduler. (spawn-fiber): Let create-fiber handle dynamic state shenanigans, as it needs to ensure that current-fiber is bound in the thunk. * fibers/internal.scm (with-scheduler): Don't parameterize current-scheduler, as that binding for a given scheduler needs to change over time, and the with-dynamic-state prevents this from happening. (schedule-fiber!): Wake schedulers not on the current kernel thread. (run-fiber): Don't parameterize current-fiber; it's lost across the with-dynamic-state. (create-fiber): Instead set current-fiber inside the with-dynamic-state. (suspend-current-fiber, yield-current-fiber): Get current scheduler from current fiber.
* run-scheduler pops one fiber at a timeAndy Wingo2016-12-221-13/+15
| | | | * fibers/internal.scm (run-scheduler): Pop one fiber at a time.
* Rework runqueue as pair of stacksAndy Wingo2016-12-223-23/+93
| | | | | | | | | | * fibers/stack.scm: New file. * Makefile.am: Add new file. * fibers/internal.scm: Rework runqueue to have separate current and next stacks. We want to expose the current runqueue so that remote schedulers can steal work, but we also need to know when we flip the next runqueue to the current runqueue so that we can pull in additional wakeups from epoll and timers.
* Beginnings of work stealingAndy Wingo2016-12-212-4/+26
| | | | | | | | * fibers/deque.scm (update!): Don't spin if value didn't change. (dequeue!): New function. * fibers/internal.scm (schedule-fibers-for-fd): Add comment about stealing and fd's. (steal-work!): New internal function.
* Bump version to 0.4.0v0.4.0Andy Wingo2016-12-162-3/+3
|
* Update NEWS.Andy Wingo2016-12-161-0/+24
| | | | * NEWS: Update.
* Add REPL commands to manualAndy Wingo2016-12-162-1/+38
|
* Add examples to fibers.texiAndy Wingo2016-12-162-1/+199
|
* Update fibers manualAndy Wingo2016-12-161-23/+23
|