Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: rubinius/rubinius
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 949b25e2f04b^
Choose a base ref
...
head repository: rubinius/rubinius
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 6e90d9cdb272
Choose a head ref
  • 2 commits
  • 26 files changed
  • 1 contributor

Commits on Jun 3, 2016

  1. Copy the full SHA
    949b25e View commit details

Commits on Jun 4, 2016

  1. Reworked running finalizers.

    brixen committed Jun 4, 2016
    Copy the full SHA
    6e90d9c View commit details
4 changes: 0 additions & 4 deletions core/loader.rb
Original file line number Diff line number Diff line change
@@ -758,10 +758,6 @@ def epilogue

run_at_exits

@stage = "running object finalizers"
::GC.start
ObjectSpace.run_finalizers

flush_stdio

rescue Object => e
11 changes: 8 additions & 3 deletions core/object_space.rb
Original file line number Diff line number Diff line change
@@ -52,6 +52,14 @@ def self.each_object(what=nil, &block)
def self.define_finalizer(obj, prc=nil, &block)
prc ||= block

if obj.kind_of? ImmediateValue or obj.kind_of? Float
raise ArgumentError, "can't define finalizer for #{obj.class}"
end

if obj.frozen?
raise RuntimeError, "can't modify frozen #{obj.class}"
end

if obj.equal? prc
# This is allowed. This is the Rubinius specific API that calls
# __finalize__ when the object is finalized.
@@ -74,9 +82,6 @@ def self.undefine_finalizer(obj)
return obj
end

def self.run_finalizers
end

def self.garbage_collect
GC.start
end
2 changes: 0 additions & 2 deletions core/process.rb
Original file line number Diff line number Diff line change
@@ -83,8 +83,6 @@ def self.fork
end
end

ObjectSpace.run_finalizers

# Do not use Kernel.exit. This raises a SystemExit exception, which
# will run ensure blocks. This is not what MRI does and causes bugs
# in programs. See issue http://github.com/rubinius/rubinius/issues#issue/289 for
2 changes: 1 addition & 1 deletion machine/builtin/call_site.hpp
Original file line number Diff line number Diff line change
@@ -181,7 +181,7 @@ namespace rubinius {
cache->name(name);
cache->ip(ip);

state->memory()->needs_finalization(state, cache,
state->memory()->native_finalizer(state, cache,
(memory::FinalizerFunction)&CallSite::finalize);

state->vm()->metrics().machine.call_site_count++;
4 changes: 2 additions & 2 deletions machine/builtin/data.cpp
Original file line number Diff line number Diff line change
@@ -39,7 +39,7 @@ namespace rubinius {
data->internal(rdata);

if(mark || free) {
state->memory()->needs_finalization(state, data,
state->memory()->extension_finalizer(state, data,
(memory::FinalizerFunction)&Data::finalize);
}

@@ -73,7 +73,7 @@ namespace rubinius {
data->internal(rdata);

if(type->function.dmark || type->function.dfree) {
state->memory()->needs_finalization(state, data,
state->memory()->extension_finalizer(state, data,
(memory::FinalizerFunction)&Data::finalize);
}

5 changes: 2 additions & 3 deletions machine/builtin/dir.cpp
Original file line number Diff line number Diff line change
@@ -18,9 +18,8 @@ namespace rubinius {
Dir* d = Dir::allocate(state, G(dir));
d->os(0);

state->memory()->needs_finalization(state, d,
(memory::FinalizerFunction)&Dir::finalize,
memory::FinalizeObject::eUnmanaged);
state->memory()->native_finalizer(state, d,
(memory::FinalizerFunction)&Dir::finalize);

return d;
}
5 changes: 2 additions & 3 deletions machine/builtin/encoding.cpp
Original file line number Diff line number Diff line change
@@ -729,9 +729,8 @@ namespace rubinius {

c->converter(NULL);

state->memory()->needs_finalization(state, c,
(memory::FinalizerFunction)&Converter::finalize,
memory::FinalizeObject::eUnmanaged);
state->memory()->native_finalizer(state, c,
(memory::FinalizerFunction)&Converter::finalize);

return c;
}
7 changes: 3 additions & 4 deletions machine/builtin/ffi_pointer.cpp
Original file line number Diff line number Diff line change
@@ -115,14 +115,13 @@ namespace rubinius {

if(autorelease) {
if(!set_finalizer) {
state->memory()->needs_finalization(state, this,
(memory::FinalizerFunction)&Pointer::finalize,
memory::FinalizeObject::eUnmanaged);
state->memory()->native_finalizer(state, this,
(memory::FinalizerFunction)&Pointer::finalize);
set_finalizer = true;
}
} else {
if(set_finalizer) {
state->memory()->set_ruby_finalizer(this, cNil);
state->memory()->managed_finalizer(state, this, cNil);
set_finalizer = false;
}
}
10 changes: 4 additions & 6 deletions machine/builtin/fiber.cpp
Original file line number Diff line number Diff line change
@@ -38,9 +38,8 @@ namespace rubinius {
fib->data(state->vm()->new_fiber_data(true, fib->stack_size()->to_native()));
fib->data()->set_call_frame(state->vm()->call_frame());

state->memory()->needs_finalization(state, fib,
(memory::FinalizerFunction)&Fiber::finalize,
memory::FinalizeObject::eUnmanaged);
state->memory()->native_finalizer(state, fib,
(memory::FinalizerFunction)&Fiber::finalize);

state->vm()->current_fiber.set(fib);
state->vm()->root_fiber.set(fib);
@@ -119,9 +118,8 @@ namespace rubinius {

state->vm()->metrics().system.fibers_created++;

state->memory()->needs_finalization(state, fib,
(memory::FinalizerFunction)&Fiber::finalize,
memory::FinalizeObject::eUnmanaged);
state->memory()->native_finalizer(state, fib,
(memory::FinalizerFunction)&Fiber::finalize);

return fib;
#else
10 changes: 4 additions & 6 deletions machine/builtin/fsevent.cpp
Original file line number Diff line number Diff line change
@@ -34,9 +34,8 @@ namespace rubinius {
if(fsevent->kq() < 0) {
logger::error("%s: unable to create kqueue", strerror(errno));
} else {
state->memory()->needs_finalization(state, fsevent,
(memory::FinalizerFunction)&FSEvent::finalize,
memory::FinalizeObject::eUnmanaged);
state->memory()->native_finalizer(state, fsevent,
(memory::FinalizerFunction)&FSEvent::finalize);
}

return fsevent;
@@ -84,9 +83,8 @@ namespace rubinius {
if(fsevent->in() < 0) {
logger::error("%s: unable to create inotify", strerror(errno));
} else {
state->memory()->needs_finalization(state, fsevent,
(memory::FinalizerFunction)&FSEvent::finalize,
memory::FinalizeObject::eUnmanaged);
state->memory()->native_finalizer(state, fsevent,
(memory::FinalizerFunction)&FSEvent::finalize);
}

return fsevent;
4 changes: 2 additions & 2 deletions machine/builtin/io.cpp
Original file line number Diff line number Diff line change
@@ -75,7 +75,7 @@ namespace rubinius {

// Don't bother to add finalization for stdio
if(fd >= 3) {
state->memory()->needs_finalization(state, io,
state->memory()->extension_finalizer(state, io,
(memory::FinalizerFunction)&IO::finalize);
}

@@ -86,7 +86,7 @@ namespace rubinius {
IO* io = state->memory()->new_object<IO>(state, as<Class>(self));
io->ibuffer(state, IOBuffer::create(state));

state->memory()->needs_finalization(state, io,
state->memory()->extension_finalizer(state, io,
(memory::FinalizerFunction)&IO::finalize);

return io;
2 changes: 1 addition & 1 deletion machine/builtin/system.cpp
Original file line number Diff line number Diff line change
@@ -1510,7 +1510,7 @@ namespace rubinius {

Object* System::vm_set_finalizer(STATE, Object* obj, Object* fin) {
if(!obj->reference_p()) return cFalse;
state->memory()->set_ruby_finalizer(obj, fin);
state->memory()->managed_finalizer(state, obj, fin);
return cTrue;
}

5 changes: 2 additions & 3 deletions machine/builtin/thread.cpp
Original file line number Diff line number Diff line change
@@ -90,9 +90,8 @@ namespace rubinius {

thr->function(function);

state->memory()->needs_finalization(state, thr,
(memory::FinalizerFunction)&Thread::finalize,
memory::FinalizeObject::eUnmanaged);
state->memory()->native_finalizer(state, thr,
(memory::FinalizerFunction)&Thread::finalize);

state->vm()->metrics().system.threads_created++;

2 changes: 1 addition & 1 deletion machine/environment.cpp
Original file line number Diff line number Diff line change
@@ -551,7 +551,7 @@ namespace rubinius {

shared->thread_nexus()->lock(state->vm());

shared->finalizer_handler()->finish(state);
shared->finalizer()->finish(state);

NativeMethod::cleanup_thread(state);

2 changes: 1 addition & 1 deletion machine/machine_threads.cpp
Original file line number Diff line number Diff line change
@@ -15,8 +15,8 @@ namespace rubinius {

MachineThread::MachineThread(STATE, std::string name, StackSize stack_size)
: vm_(state->shared().thread_nexus()->new_vm(&state->shared(), name.c_str()))
, thread_running_(false)
, stack_size_(stack_size)
, thread_running_(false)
, thread_exit_(false)
{
state->shared().machine_threads()->register_thread(this);
5 changes: 3 additions & 2 deletions machine/machine_threads.hpp
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@

#include "util/thread.hpp"

#include <atomic>
#include <string>
#include <list>

@@ -16,12 +17,12 @@ namespace rubinius {

class MachineThread {
VM* vm_;
bool thread_running_;
uint32_t stack_size_;

protected:

bool thread_exit_;
std::atomic<bool> thread_running_;
std::atomic<bool> thread_exit_;

public:

24 changes: 0 additions & 24 deletions machine/memory.cpp
Original file line number Diff line number Diff line change
@@ -523,10 +523,6 @@ namespace rubinius {

if(!collect_young_flag_ && !collect_full_flag_) return;

if(memory::FinalizerThread* finalizer = state->shared().finalizer_handler()) {
finalizer->start_collection(state);
}

if(cDebugThreading) {
std::cerr << std::endl << "[" << state
<< " WORLD beginning GC.]" << std::endl;
@@ -584,10 +580,6 @@ namespace rubinius {
#ifdef RBX_GC_DEBUG
young_->verify(data);
#endif
if(memory::FinalizerThread* finalizer = state->shared().finalizer_handler()) {
finalizer->finish_collection(state);
}
*/

collect_young_flag_ = false;
@@ -666,10 +658,6 @@ namespace rubinius {
metrics.gc.immix_count++;
metrics.gc.large_count++;

if(memory::FinalizerThread* finalizer = state->shared().finalizer_handler()) {
finalizer->finish_collection(state);
}

collect_full_flag_ = false;
interrupt_flag_ = false;

@@ -846,18 +834,6 @@ namespace rubinius {
}
}

void Memory::needs_finalization(STATE, Object* obj, memory::FinalizerFunction func,
memory::FinalizeObject::FinalizeKind kind)
{
if(memory::FinalizerThread* finalizer = shared_.finalizer_handler()) {
finalizer->record(state, obj, func, kind);
}
}

void Memory::set_ruby_finalizer(Object* obj, Object* finalizer) {
shared_.finalizer_handler()->set_ruby_finalizer(obj, finalizer);
}

capi::Handle* Memory::add_capi_handle(STATE, Object* obj) {
if(!obj->reference_p()) {
rubinius::bug("Trying to add a handle for a non reference");
24 changes: 19 additions & 5 deletions machine/memory.hpp
Original file line number Diff line number Diff line change
@@ -223,8 +223,8 @@ namespace rubinius {
}
}

memory::FinalizerThread* finalizer_handler() const {
return shared_.finalizer_handler();
memory::FinalizerThread* finalizer() const {
return shared_.finalizer();
}

memory::InflatedHeaders* inflated_headers() const {
@@ -550,9 +550,23 @@ namespace rubinius {

void collect_maybe(STATE);

void needs_finalization(STATE, Object* obj, memory::FinalizerFunction func,
memory::FinalizeObject::FinalizeKind kind = memory::FinalizeObject::eManaged);
void set_ruby_finalizer(Object* obj, Object* finalizer);
void native_finalizer(STATE, Object* obj, memory::FinalizerFunction func) {
if(memory::FinalizerThread* f = this->finalizer()) {
f->native_finalizer(state, obj, func);
}
}

void extension_finalizer(STATE, Object* obj, memory::FinalizerFunction func) {
if(memory::FinalizerThread* f = this->finalizer()) {
f->extension_finalizer(state, obj, func);
}
}

void managed_finalizer(STATE, Object* obj, Object* finalizer) {
if(memory::FinalizerThread* f = this->finalizer()) {
f->managed_finalizer(state, obj, finalizer);
}
}

InflatedHeader* inflate_header(STATE, ObjectHeader* obj);
void inflate_for_id(STATE, ObjectHeader* obj, uint32_t id);
Loading