whitequark
e02ef03304
Add #[derive(Debug)] for SliceStack and OwnedStack.
2016-08-30 12:20:34 -04:00
whitequark
5a77a01863
Implement OwnedStack.
2016-08-30 12:20:34 -04:00
whitequark
4b32c18f70
Rename Yielder::generate to Yielder::suspend.
...
This makes more sense, because "generate" implies *running*
a generator, not *returning* from a generator. That name was
a vestige of the time when libfringe only really provided a .next()
implementation, which made marginally more sense together with
.generate(), but it doesn't anymore when we have .resume().
2016-08-30 12:20:34 -04:00
edef
f21b8dc936
Update the license headers for MIT/Apache
2016-08-20 23:45:01 +02:00
whitequark
f8cf95f686
Implement SliceStack.
2016-08-19 15:12:42 +02:00
whitequark
e0ad79ea0c
Add an OR1K port.
2016-08-19 15:12:42 +02:00
whitequark
d4b7c427c9
impl Iterator for Generator<Input=()>.
2016-08-13 13:38:04 +02:00
whitequark
145c18125a
Explain how trampolines work.
2016-08-13 13:38:04 +02:00
whitequark
b79e7c0a9b
Rename Stack::top() to Stack::base(), which is correct.
...
Fixes #25 .
2016-08-13 13:38:04 +02:00
whitequark
7d5075edc2
Add more examples to README.
...
This also renames some functions for a mild increase in backtrace
clarity.
2016-08-13 13:38:04 +02:00
whitequark
f34ddc6805
Don't use core::intrinsics.
...
The core::intrinsics::unreachable() we used at the end of every naked
function is essentially pointless, as #[naked] implies that intrinsic
at the end of the function. rustc currently does not implement that
behavior (rust-lang/rust#32487 ), but it is a bug. On top of that,
anything except a single asm!() in naked functions is likely to be
disallowed in the future (rust-lang/rust#32490 ).
A nice side effect is that we avoid the core_intrinsics feature,
which will be never stabilized, though neither asm nor
naked_functions are likely to be stabilized soon.
2016-08-13 13:38:04 +02:00
whitequark
ddbf9a5afe
Reimplement Generator to pass both input and output values around.
2016-08-13 13:38:04 +02:00
whitequark
308df32ac2
Use a more semantically correct PhantomData field in Generator.
2016-08-13 13:38:04 +02:00
whitequark
302ceef10a
Clarify the Windows situation.
...
Also, remove the Windows OsStack implementation. It will not ever
be useful in libfringe, as even if we add support for Windows
using fibers, the OS allocates stacks for fibers and we needn't
do it manually.
2016-08-13 13:38:04 +02:00
whitequark
a5d3430e63
Make Generator safe in presence of destructors.
2016-08-13 13:38:04 +02:00
whitequark
23cf17865d
Remove workaround for rust-lang/rust#25544 .
2016-08-13 13:38:04 +02:00
edef
ca43ba0498
Make fringe::Context private.
2016-08-13 13:38:04 +02:00
edef
b1a6b17d0a
Move the Context tests and benches into src/
...
This concludes preparations for making Context private again.
2016-08-13 13:38:04 +02:00
whitequark
892a7696ec
Allow unwinding to propagate across a context swap.
...
The main purpose of this is having nice backtraces in gdb, although
it also slightly simplifies poisoning state of the API consumers
after a panic.
2016-08-13 13:38:04 +02:00
whitequark
40fbfdde0c
Kill impl StackPointer.
...
That was a silly idea for a silly abstraction, and it brought no
improvement, only confusion. So, revert it.
2016-08-13 13:38:04 +02:00
edef
bb699c0f6e
Allow inlining Generator::state
2016-08-13 12:52:12 +02:00
edef
8c761d944f
Fix Windows x64 ABI
2016-07-17 16:57:23 -04:00
whitequark
15d2fbaf51
Add an inline hint on Generator::next().
...
This improves the generate benchmark by about 1ns.
2016-07-17 13:56:03 -04:00
whitequark
16c674b4f4
Implement the GuardedStack marker trait.
2016-07-17 13:56:03 -04:00
whitequark
7ffad26cfd
Implement the safe Generator abstraction.
...
close #24
2016-07-17 13:55:56 -04:00
whitequark
758088c673
Fix Stack::new(0).
2016-07-17 13:55:43 -04:00
whitequark
aa364056fd
Add more documentation, and rephrase it elsewhere.
2016-07-16 20:54:47 -04:00
whitequark
ebd9ca8dec
Allocate guard page under existing stack, not in it.
...
This fixes a segfault when the allocated stack is just one page long.
This also refactors the fringe::os module to use Result consistently.
close #22
2016-07-16 20:54:33 -04:00
John Ericson
75ca6f66e1
Move x86 trampoline to naked function
...
Close #19
2016-07-16 16:39:19 -04:00
John Ericson
1ea4b01eda
Use mostly the same registers for consistency
...
The exception to this is %eax is used not %edi on x86 because its
caller-save
2016-07-16 16:39:14 -04:00
whitequark
cbe136b762
Completely rework fringe::Context and fringe::arch.
...
The new design concerns itself with one thing and exactly one thing:
passing values back and forth with an extern "C" function.
This allows to simplify fringe::arch into a single primitive, swap.
Close #21
2016-07-16 15:04:15 -04:00
edef
0d7b3d7091
add Windows support to OsStack
...
Fix #18
2016-04-16 07:51:10 +02:00
edef
6284a22caa
add fpsr, eflags for good measure
...
courtesy of @whitequark
2016-04-16 07:41:00 +02:00
John Ericson
35fb046fb5
Factor out common code between x86 and x86_64
...
Fix #17
2016-04-14 13:37:15 +02:00
John Ericson
368fa9d3bf
Remove unnecessary unsafety
2016-04-12 14:40:12 +02:00
edef
32fdbbb474
move OutStack's bound to a where clause
2016-04-03 20:07:45 +02:00
edef
daece1a8d3
Registers::{swap2 => swap}, to match Context::swap
2016-04-03 19:56:15 +02:00
edef
976b971436
get rid of the old Context::swap
...
The two-parameter version is the only necessary API.
2016-04-03 19:55:25 +02:00
edef
a50e6771b4
coerce rust_trampoline to a function pointer properly
2016-04-03 12:00:21 +02:00
edef
644cd81f9e
fix parameter passing to arch/x86_64/swap.s
2016-04-03 11:59:14 +02:00
edef
3397e0bcf1
at least allow different lifetimes in Context::swap2
...
Really we should allow swapping between different stack types easily, so
we can easily swap between contexts with different stack types.
2016-03-22 08:46:27 +01:00
edef
b986931817
remove copyright years
...
They're obnoxious to update, and I'm told they have no legal value.
2016-03-22 08:25:23 +01:00
edef
709dad1c4a
add Context::swap2, to allow distinct save/restore contexts
...
Fix #5
Context::swap is now implemented in terms of Context::swap2, and it
might make sense to remove Context::swap entirely at some point.
2016-03-22 07:50:50 +01:00
edef
2b23083455
get rid of some minor warnings
2016-03-22 07:35:25 +01:00
edef
4ffdba3ea6
minor style fixes
2016-03-16 00:20:45 +01:00
edef
bb2b92bf6b
remove feature attributes for stable stuff
2016-03-16 00:14:09 +01:00
edef
bc46941e89
use libvalgrind instead of valgrind.h
...
no more C!
2016-01-04 15:34:41 +01:00
edef
cd4fe1ecc8
remove obsolete support for Rust stack limits
...
rustc removed these in 7a3fdfbf674a08b7f6fd32c9124e52924a2f9a1c, and
this removes a Linux-specific TLS slot from our code.
2016-01-04 03:46:07 +01:00
John Ericson
a1f286bdaf
don't drop uninitialised memory when pushing to stack
2015-08-26 20:42:33 +02:00
John Ericson
96a31d2443
remove stray import
2015-08-26 20:41:12 +02:00
John Ericson
878a6fefc3
simplify Valgrind wrapper
2015-08-26 00:51:19 +02:00
John Ericson
5411f10460
use Void to ensure closure diverges
2015-08-26 00:51:18 +02:00
edef
c83143511e
core::atomic -> core::sync::atomic
2015-08-26 00:20:23 +02:00
edef
e290a8bbaf
remove `extern crate core` and prelude imports
...
the latest Rust nightly makes this unnecessary
2015-08-26 00:19:53 +02:00
edef
189edae3cf
add #![feature(core_prelude)]
2015-07-20 20:54:41 -04:00
edef
6d1c5d0df1
it's fine to inline a simple FFI call
2015-04-27 17:19:13 +02:00
edef
2736479db0
fix license header
2015-04-23 01:24:58 +02:00
edef
3f0ec83bf3
remove valgrind_stack_change
...
This is a leftover from when we exposed these APIs to consumers, we
don't actually use this function.
2015-04-23 01:24:04 +02:00
edef
d0ee592ba1
use the libc crate from cargo
2015-04-23 01:14:01 +02:00
edef
418c53797e
x86 support
...
ref #1
2015-04-16 13:15:46 -04:00
edef
52325b07c0
comment fix: it's 8ns *faster*
2015-04-16 12:21:39 -04:00
edef
a1e4c2b745
add Syntastic ASM lint hints
2015-04-16 11:56:45 -04:00
edef
0bebfae21d
more docs!
2015-04-16 10:15:00 -04:00
edef
d627f0d725
big rename — we're libfringe now
2015-04-16 08:11:12 -04:00
edef
af7e9ea67c
add FreeBSD + DragonFlyBSD MAP_STACK workaround
...
http://lists.freebsd.org/pipermail/freebsd-bugs/2011-July/044840.html
according to libgreen, DragonFlyBSD suffers from this too
2015-04-16 07:59:59 -04:00
edef
68f70fb1c9
rename Context::destroy to Context::unwrap, in line with lang conventions
2015-04-16 07:49:13 -04:00
edef
01e57ce9f5
let os::Stack's docs shine through the facade
2015-04-16 07:47:23 -04:00
edef
2266da2f8d
rejig lib.rs a little
2015-04-16 07:45:14 -04:00
edef
fe490275fa
move os::Stack behind the facade, to OsStack
2015-04-16 07:44:07 -04:00
edef
ff25697444
remove StackSource
...
Nothing in this library took StackSources, and it's probably too
high-level a concept to include here. Maybe later.
2015-04-16 07:42:16 -04:00
edef
bdb6e0bd8b
let StackSource::get_stack take &mut self
2015-04-16 07:35:29 -04:00
edef
9bb0ce483d
derive Copy and Clone for os::StackSource
2015-04-16 07:33:27 -04:00
edef
a389576d0f
document os
2015-04-16 07:30:53 -04:00
edef
f3ee07416d
require Stack::Error to implement Debug + Display
2015-04-16 07:27:14 -04:00
edef
cbfb62e62f
only expose context and stack through the facade
...
It's fairly pointless to have submodules when there are only three
items.
2015-04-16 07:25:05 -04:00
edef
0dd6c8bc32
pass STACK_ALIGN through without exposing it
2015-04-16 07:24:15 -04:00
edef
7adb9e7381
implement Debug for all components of Context
2015-04-16 07:24:07 -04:00
edef
519d86ca4c
implement Send where applicable
2015-04-16 07:23:57 -04:00
edef
7271fe1724
there is no point in Registers being Copy + Clone
2015-04-16 07:23:56 -04:00
edef
222ab0eaa9
make Context::destroy inlineable
2015-04-16 06:43:09 -04:00
edef
6f750ab484
move all OS-related code into src/os
2015-04-16 06:42:31 -04:00
edef
f7ab28de4b
move all the common arch stuff into a module of its own
2015-04-16 06:34:03 -04:00
edef
b7624aa49a
uintptr_t is pointless when usize is the same anyway
2015-04-16 06:20:46 -04:00
edef
997a4a7765
move architecture specifics into arch directory
2015-04-16 06:17:03 -04:00
edef
f24e8e7911
add license headers to every file
2015-04-16 06:08:44 -04:00
edef
cbc10fd311
cache page_size
...
page_size is used in every nearly every pointer calculation in os.rs,
and the Stack methods are called fairly often. It's definitely not worth
spilling registers for to call out to a libc function.
With this change, page_size becomes effectively free. It is cached in an
atomic usize, with relaxed ordering, so no actual atomic operations are
involved.
Benchmark:
```
test bench_page_size ... bench: 5 ns/iter (+/- 1)
test bench_page_size_cached ... bench: 0 ns/iter (+/- 0)
```
2015-04-16 05:52:56 -04:00
edef
52c0c92cd8
move OS specifics into sys
2015-04-16 05:49:34 -04:00
edef
2c3a203f57
rearrange the os::{Stack, StackSource} code a little
2015-04-16 05:34:09 -04:00
edef
8dd3044da5
don't re-export os::unix internals
2015-04-16 05:34:09 -04:00
edef
cf33440503
include valgrind.h, so we don't depend on Valgrind at build time
2015-04-16 04:32:56 -04:00
edef
b8211689fa
return a Result from StackSource::get_stack with an associated Error
...
fix #7
2015-04-16 04:14:18 -04:00
edef
42db0ee5b1
loosen the lifetime bounds on Context
...
fix #6
ref #3
2015-04-16 04:01:02 -04:00
edef
195350863a
make Valgrind optional
2015-04-16 03:22:57 -04:00
edef
2760a0a7aa
move Valgrind handling into Context
...
fix #3
This takes all Valgrind functionality private again.
Valgrind stack registrations are now associated with a Context, not with
a Stack. This makes sense, since it's only actually a stack when a
Context is running on it. Perhaps Valgrind will even be able to detect
early stack frees now.
2015-04-16 02:59:58 -04:00
edef
a04117f955
use Display for displaying IoErrors
2015-04-16 02:16:08 -04:00
edef
7e0b126f42
separate all the libc interaction out per OS
...
We're now handling more of this ourselves, and leaving less to libstd.
Hopefully, we'll eventually break free of libstd, leaving a
highly-focused low-level library that retains all its conveniences in
freestanding environments.
2015-04-16 02:16:08 -04:00
edef
46b2a4007b
improve the assembly documentation
2015-04-16 00:22:50 -04:00
edef
d25f43d4d5
add license headers to the assembly files
2015-04-16 00:16:23 -04:00
edef
5c252bdef5
document Stack and StackSource
2015-04-15 23:38:07 -04:00
edef
5b6aa23731
pass os::Stack addresses to Valgrind in the right order
2015-04-15 22:48:42 -04:00