Граф коммитов

370 Коммитов

Автор SHA1 Сообщение Дата
Aaron Patterson aac4d9d6c7
Rename rb_gc_mark_no_pin -> rb_gc_mark_movable
Renaming this function.  "No pin" leaks some implementation details.  We
just want users to know that if they mark this object, the reference may
move and they'll need to update the reference accordingly.
2019-08-12 16:44:54 -04:00
Kazuhiro NISHIYAMA 0f10828fcf
Fix a typo [ci skip] 2019-08-13 01:03:14 +09:00
Kazuhiro NISHIYAMA 968c7b4398
Fix unused variable 2019-07-29 23:05:00 +09:00
Nobuyoshi Nakada efa380b006
Use PRIuSIZE instead of "%zu" 2019-07-25 05:54:38 +09:00
Samuel Williams 0a7093a8e9
Add documentation to `fiber_pool_allocate_memory`. 2019-07-19 20:18:42 +12:00
Samuel Williams 517f7f9b57
Fix 32-bit build and typo.
"Therefore, `fiber_pool_stack_free(&vacancy->stack)` can do the wrong
thing..." should be "... `fiber_pool_stack_free(stack)` ...".
2019-07-19 20:09:03 +12:00
Samuel Williams e004afd46d
Ensure that madvise does not clobber vacancy data.
After calling `fiber_pool_vacancy_reset`, `vacancy->stack` and `stack` are
no longer in sync. Therefore, `fiber_pool_stack_free(&vacancy->stack)` can
do the wrong thing and clobber the vacancy data.

Additionally, when testing using VM_CHECK_MODE > 0, use MADV_DONTNEED if
possible, to catch issues w.r.t. clobbered vacancy data earlier.
2019-07-19 19:42:09 +12:00
Samuel Williams cf93f98a60
Better usage of `rb_ec_clear_vm_stack` to maintain invariants. 2019-07-19 15:46:56 +12:00
Samuel Williams 6eef80d824
Improve ec assertions. 2019-07-19 15:46:56 +12:00
Koichi Sasada 4ec5b39ce8 initialize only Fiber's cfp.
fiber->cont.saved_ec.cfp should be initialized by NULL
because no vm_stack is allocated. However, cont_init()
captures current Fiber's cfp for continuation, so it should
only initialize fibers.
2019-07-19 08:53:19 +09:00
Samuel Williams 8ca32020b0
Revert "Ensure cfp is initialized to NULL."
This reverts commit d7fdf45a4a.
2019-07-19 11:32:40 +12:00
Samuel Williams d7fdf45a4a
Ensure cfp is initialized to NULL.
`cont_init` didn't initialize `cont->saved_ec.cfp`. Calling `cont_mark`
would result in an invalid `cfp` in `rb_execution_context_mark`. Because
fibers lazy-initialize the stack, fibers that are created but not resumed
could cause this problem to occur.
2019-07-19 11:10:01 +12:00
Samuel Williams 9dda0a03cc
Remove `rb_vm_push_frame` as it is no longer used. 2019-07-19 11:10:01 +12:00
Nobuyoshi Nakada a036a8a038
Adjust styles and indents 2019-07-19 06:35:15 +09:00
Koichi Sasada d40d8b3caf check saved_ec.cfp 2019-07-18 22:59:44 +09:00
Samuel Williams 9790b778a3
Ensure we don't have dangling cfp. 2019-07-19 00:33:03 +12:00
git 78bc6cd8df * remove trailing spaces. 2019-07-18 17:55:22 +09:00
Samuel Williams 38e3c65a33
Improve `fiber_pool_expand` allocation strategy.
If `mmap` fails to allocate memory, try half the size, and so on.

Limit FIBER_POOL_ALLOCATION_MAXIMUM_SIZE to 1024 stacks. In typical
configurations this limits the memory mapped region to ~128MB per
allocation.
2019-07-18 20:54:55 +12:00
Samuel Williams 311007bf40
Add experimental `RUBY_SHARED_FIBER_POOL_FREE_STACKS` to control madvise. 2019-07-18 20:54:55 +12:00
Samuel Williams 001f187ed6
Make fiber_pool more conservative on platforms with limited address space.
We use COROUTINE_LIMITED_ADDRESS_SPACE to select platforms where address
space is 32-bits or less. Fiber pool implementation enables more book
keeping, and reduces upper limits, in order to minimise address space
utilisation.
2019-07-18 20:54:55 +12:00
Samuel Williams 385ea910fc
Add `struct fiber_pool {int free_stacks;}` to control usage of madvise.
`madvise(free)` and similar operations are good because they avoid swap
usage by clearing the dirty bit on memory pages which are mapped but no
longer needed. However, there is some performance penalty if there is no
memory pressure. Therefore, we do it by default, but it can be avoided.
2019-07-18 20:54:55 +12:00
Samuel Williams 4d60a5820a
Add FIBER_POOL_ALLOCATION_FREE to control allocation/free strategy. 2019-07-18 20:54:55 +12:00
Samuel Williams 8ac9a7be0f
Limit expansion of fiber pool on 32-bit platforms.
On 32-bit platforms, expanding the fiber pool by a large amount may fail,
even if a smaller amount may succeed. We limit the maximum size of a single
allocation to maximise the number of fibers that can be allocated.

Additionally, we implement the book-keeping required to free allocations
when their usage falls to zero.
2019-07-18 20:54:54 +12:00
Samuel Williams 77f3319071
Enable `madvise` to release stack space back to OS. 2019-07-18 20:54:54 +12:00
Samuel Williams 7291fef55c
Improve build process and coroutine implementation selection. 2019-07-18 20:54:54 +12:00
Samuel Williams 91aae651bf
Stack copying implementation of coroutines. 2019-07-18 20:54:54 +12:00
Samuel Williams 14cf95cff3
Implement fiber pool for reduced fiber allocation overhead.
Replace previous stack cache with fiber pool cache. The fiber pool
allocates many stacks in a single memory region. Stack allocation
becomes O(log N) and fiber creation is amortized O(1). Around 10x
performance improvement was measured in micro-benchmarks.
2019-07-18 20:54:53 +12:00
Samuel Williams 1b82c877df
Make FIBER_USE_NATIVE the default and reformat code. 2019-07-18 20:54:53 +12:00
git 93c9405e0e * expand tabs. 2019-07-08 16:00:29 +09:00
Nobuyoshi Nakada 663d58ffde
Fix indent 2019-07-08 15:13:59 +09:00
Nobuyoshi Nakada a8c54932ba
Renamed fib to fiber 2019-07-08 15:07:43 +09:00
Jeremy Evans 7172ab0ec5 Use native coroutine implementation on OpenBSD-amd64
When using native fibers, do not load ucontext, as it isn't needed.
2019-06-26 16:23:11 -07:00
Samuel Williams 6c6bf9ffcb Add `ucontext` coroutine implementation for generic fallback. 2019-06-26 20:19:53 +12:00
git 5d4dfcd808 * remove trailing spaces. 2019-06-24 11:25:17 +09:00
Samuel Williams a071bed7a5 Print warning if not using native coroutine. 2019-06-24 14:24:49 +12:00
Samuel Williams f607e43352 Transition root fiber into state FIBER_TERMINATED.
During fork, it's possible that threads with root fibers are terminated,
but fiber state is not updated. `fiber_verify` will subsequently fail. We
forcefully enter the FIBER_TERMINATED state when terminating the root
fiber.
2019-06-20 22:36:30 +12:00
Samuel Williams e4cafa393f Ensure that vm_stack is cleared in `thread_cleanup_func_before_exec`.
If `vm_stack` is left dangling in a forked process, the gc attempts to scan
it, but it is invalid and will cause a segfault. Therefore, we clear it
before forking.

In order to simplify this, `rb_ec_clear_vm_stack` was introduced.
2019-06-20 16:44:50 +12:00
Samuel Williams c26c514494 Revert failed attempt at fixing invalid usage of vm_stack. 2019-06-20 15:30:29 +12:00
Samuel Williams dbc2b89bc0 Ensure `vm_stack` is cleared after fork. 2019-06-20 13:41:18 +12:00
Samuel Williams 626483721a Set `cfp` to null (along with vm_stack) in `rb_fiber_close`. 2019-06-20 11:56:06 +12:00
Nobuyoshi Nakada ab6d8d0b65
Adjust indent 2019-06-19 20:40:49 +09:00
Samuel Williams d17344cfc5 Remove IA64 support. 2019-06-19 23:30:04 +12:00
Samuel Williams cb5da39f20 Use shared implementation of `rb_ec_initialize_vm_stack`. 2019-06-19 20:39:10 +12:00
Samuel Williams b8e4bea780 Track how stack was allocated for `cont_free`. 2019-06-19 20:39:10 +12:00
Samuel Williams 38791145eb Better handling of root fiber. 2019-06-19 20:39:10 +12:00
git 23e3c1704b * expand tabs. 2019-06-12 01:16:45 +09:00
Aaron Patterson 6db2d6d852
Add compaction support for more types.
This commit adds compaction support for:

* Fibers
* Continuations
* Autoload Constants
2019-06-11 09:16:14 -07:00
James Clarke ecf660e438
ia64: Don't clear register_stack_start
r59829 stopped clearing stack_start and enabled the code for
!FIBER_USE_NATIVE, but we need to do the same for register_stack_start
on ia64, otherwise we end up with NULL in cont_save_machine_stack.

Closes: https://github.com/ruby/ruby/pull/2155
2019-04-27 12:35:41 +09:00
nobu 56557ec28a [DOC] fix markups [ci skip]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67337 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-22 11:04:59 +00:00
nobu 78d6e33702 Fix styles [ci skip]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66762 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-01-09 13:58:49 +00:00