Project

General

Profile

Actions

Feature #2126

closed

ruby_init_stack() - add ability to specify or query max_stack_size

Added by sunaku (Suraj Kurapati) over 14 years ago. Updated almost 13 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:25668]

Description

=begin
Hello,

== Background ==

I am embedding Ruby 1.9 inside a callback function of a C program (a Verilog
simulator, to be precise):

  1. The first time when the callback function is called, I will initialize Ruby
    and create a Fiber (to run some Ruby code).

  2. For all subsequent times when the callback function is called, I will resume
    the Fiber. The Fiber will then run some Ruby code and return control back to
    the callback function, using Fiber.yield().

  3. This process repeats until the callback function is no longer called by the C
    program.

== Problem ==

Each time when the callback function is called, the C program's current stack
pointer is different: sometimes it descends below Ruby's stack start
addresss!

For this reason, it is not safe to use the default RUBY_INIT_STACK macro (which
assumes that the C program's current stack pointer never descends below Ruby's
stack start addresss).

== Request for Solution ==

To solve the problem, I need one of the following features:

  1. Add a max_stack_size parameter to ruby_init_stack():

    void ruby_init_stack(VALUE* stack_start, size_t max_stack_size);

    And also add a function to return Ruby's preferred stack size:

    size_t ruby_preferred_stack_size();

    This way, I can provide a custom stack to Ruby:

    size_t stack_size = ruby_preferred_stack_size();
    VALUE* stack_end = malloc(sizeof(VALUE) * stack_size);
    VALUE* stack_start = stack_end + stack_size;

    ruby_init_stack(stack_start, stack_size);

  2. Make ruby_init_stack() return the maximum stack size it has chosen:

    size_t ruby_init_stack(VALUE* stack_start);

    This way, I can grow my custom stack to fit Ruby's needs:

    VALUE* stack_end = malloc(sizeof(VALUE));
    size_t stack_size = ruby_init_stack(stack_end);
    VALUE* new_stack_end = realloc(stack_end, stack_size);

  3. Add a RUBY_AUTO_STACK macro which makes Ruby allocate its own stack on the
    heap using malloc(). I would call this macro instead of RUBY_INIT_STACK.

Thanks for your consideration.
=end


Related issues 1 (1 open0 closed)

Has duplicate Ruby master - Feature #2294: [PATCH] ruby_bind_stack() to embed Ruby in coroutineAssignedko1 (Koichi Sasada)Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0