Use extconf to build external GC modules
Co-Authored-By: Peter Zhu <peter@peterzhu.ca>
This commit is contained in:
parent
92585898fb
commit
d61933e503
Notes:
git
2024-11-25 13:05:41 +00:00
4
.github/workflows/ubuntu.yml
vendored
4
.github/workflows/ubuntu.yml
vendored
@ -97,14 +97,14 @@ jobs:
|
|||||||
- run: $SETARCH make prepare-gems
|
- run: $SETARCH make prepare-gems
|
||||||
if: ${{ matrix.test_task == 'test-bundled-gems' }}
|
if: ${{ matrix.test_task == 'test-bundled-gems' }}
|
||||||
|
|
||||||
|
- run: $SETARCH make
|
||||||
|
|
||||||
- name: Build shared GC
|
- name: Build shared GC
|
||||||
run: |
|
run: |
|
||||||
echo "RUBY_GC_LIBRARY=default" >> $GITHUB_ENV
|
echo "RUBY_GC_LIBRARY=default" >> $GITHUB_ENV
|
||||||
make shared-gc SHARED_GC=default
|
make shared-gc SHARED_GC=default
|
||||||
if: ${{ matrix.shared_gc }}
|
if: ${{ matrix.shared_gc }}
|
||||||
|
|
||||||
- run: $SETARCH make
|
|
||||||
|
|
||||||
- run: |
|
- run: |
|
||||||
$SETARCH make golf
|
$SETARCH make golf
|
||||||
case "${{ matrix.configure }}" in
|
case "${{ matrix.configure }}" in
|
||||||
|
17
common.mk
17
common.mk
@ -721,7 +721,7 @@ install-prereq: $(CLEAR_INSTALLED_LIST) yes-fake sudo-precheck PHONY
|
|||||||
clear-installed-list: PHONY
|
clear-installed-list: PHONY
|
||||||
@> $(INSTALLED_LIST) set MAKE="$(MAKE)"
|
@> $(INSTALLED_LIST) set MAKE="$(MAKE)"
|
||||||
|
|
||||||
clean: clean-ext clean-enc clean-golf clean-docs clean-extout clean-local clean-platform clean-spec
|
clean: clean-ext clean-enc clean-golf clean-docs clean-extout clean-gc clean-local clean-platform clean-spec
|
||||||
clean-local:: clean-runnable
|
clean-local:: clean-runnable
|
||||||
$(Q)$(RM) $(ALLOBJS) $(LIBRUBY_A) $(LIBRUBY_SO) $(LIBRUBY) $(LIBRUBY_ALIASES)
|
$(Q)$(RM) $(ALLOBJS) $(LIBRUBY_A) $(LIBRUBY_SO) $(LIBRUBY) $(LIBRUBY_ALIASES)
|
||||||
$(Q)$(RM) $(PROGRAM) $(WPROGRAM) miniruby$(EXEEXT) dmyext.$(OBJEXT) dmyenc.$(OBJEXT) $(ARCHFILE) .*.time
|
$(Q)$(RM) $(PROGRAM) $(WPROGRAM) miniruby$(EXEEXT) dmyext.$(OBJEXT) dmyenc.$(OBJEXT) $(ARCHFILE) .*.time
|
||||||
@ -751,11 +751,13 @@ clean-capi: PHONY
|
|||||||
clean-platform: PHONY
|
clean-platform: PHONY
|
||||||
clean-extout: PHONY
|
clean-extout: PHONY
|
||||||
-$(Q)$(RMDIR) $(EXTOUT)/$(arch) $(RUBYCOMMONDIR) $(EXTOUT) 2> $(NULL) || $(NULLCMD)
|
-$(Q)$(RMDIR) $(EXTOUT)/$(arch) $(RUBYCOMMONDIR) $(EXTOUT) 2> $(NULL) || $(NULLCMD)
|
||||||
|
clean-gc: PHONY
|
||||||
|
$(Q) $(RMALL) .gc
|
||||||
clean-docs: clean-rdoc clean-html clean-capi
|
clean-docs: clean-rdoc clean-html clean-capi
|
||||||
clean-spec: PHONY
|
clean-spec: PHONY
|
||||||
clean-rubyspec: clean-spec
|
clean-rubyspec: clean-spec
|
||||||
|
|
||||||
distclean: distclean-ext distclean-enc distclean-golf distclean-docs distclean-extout distclean-local distclean-platform distclean-spec
|
distclean: distclean-ext distclean-enc distclean-golf distclean-docs distclean-extout distclean-gc distclean-local distclean-platform distclean-spec
|
||||||
distclean-local:: clean-local
|
distclean-local:: clean-local
|
||||||
$(Q)$(RM) $(MKFILES) yasmdata.rb *.inc $(PRELUDES) *.rbinc *.rbbin
|
$(Q)$(RM) $(MKFILES) yasmdata.rb *.inc $(PRELUDES) *.rbinc *.rbbin
|
||||||
$(Q)$(RM) config.cache config.status config.status.lineno
|
$(Q)$(RM) config.cache config.status config.status.lineno
|
||||||
@ -768,6 +770,7 @@ distclean-html: clean-html
|
|||||||
distclean-capi: clean-capi
|
distclean-capi: clean-capi
|
||||||
distclean-docs: clean-docs
|
distclean-docs: clean-docs
|
||||||
distclean-extout: clean-extout
|
distclean-extout: clean-extout
|
||||||
|
distclean-gc: clean-gc
|
||||||
distclean-platform: clean-platform
|
distclean-platform: clean-platform
|
||||||
distclean-spec: clean-spec
|
distclean-spec: clean-spec
|
||||||
distclean-rubyspec: distclean-spec
|
distclean-rubyspec: distclean-spec
|
||||||
@ -1948,9 +1951,11 @@ shared-gc: probes.h
|
|||||||
echo "You must specify SHARED_GC with the GC to build"; \
|
echo "You must specify SHARED_GC with the GC to build"; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
fi
|
fi
|
||||||
$(ECHO) generating $(shared_gc_dir)librubygc.$(SHARED_GC).$(SOEXT)
|
$(Q) $(MAKEDIRS) $(shared_gc_dir) .gc/$(arch)/$(SHARED_GC)
|
||||||
$(Q) $(MAKEDIRS) $(shared_gc_dir)
|
$(Q) $(RUNRUBY) -C .gc/$(arch)/$(SHARED_GC) $(CURDIR)/$(srcdir)/gc/$(SHARED_GC)/$(EXTCONF)
|
||||||
$(Q) $(LDSHARED) -I$(srcdir)/include -I$(srcdir) -I$(arch_hdrdir) $(XDLDFLAGS) $(CFLAGS) $(CPPFLAGS) -DBUILDING_SHARED_GC -fPIC -o $(shared_gc_dir)librubygc.$(SHARED_GC).$(SOEXT) $(srcdir)/gc/$(SHARED_GC).c
|
$(Q) $(CHDIR) .gc/$(arch)/$(SHARED_GC) && \
|
||||||
|
$(MAKE) extout=../../../$(EXTOUT) BUILTRUBY=../../../miniruby$(EXEEXT) && \
|
||||||
|
$(CP) librubygc.$(SHARED_GC).$(DLEXT) $(shared_gc_dir)
|
||||||
|
|
||||||
help: PHONY
|
help: PHONY
|
||||||
$(MESSAGE_BEGIN) \
|
$(MESSAGE_BEGIN) \
|
||||||
@ -7272,7 +7277,7 @@ gc.$(OBJEXT): $(CCAN_DIR)/str/str.h
|
|||||||
gc.$(OBJEXT): $(hdrdir)/ruby.h
|
gc.$(OBJEXT): $(hdrdir)/ruby.h
|
||||||
gc.$(OBJEXT): $(hdrdir)/ruby/ruby.h
|
gc.$(OBJEXT): $(hdrdir)/ruby/ruby.h
|
||||||
gc.$(OBJEXT): $(hdrdir)/ruby/version.h
|
gc.$(OBJEXT): $(hdrdir)/ruby/version.h
|
||||||
gc.$(OBJEXT): $(top_srcdir)/gc/default.c
|
gc.$(OBJEXT): $(top_srcdir)/gc/default/default.c
|
||||||
gc.$(OBJEXT): $(top_srcdir)/gc/gc.h
|
gc.$(OBJEXT): $(top_srcdir)/gc/gc.h
|
||||||
gc.$(OBJEXT): $(top_srcdir)/gc/gc_impl.h
|
gc.$(OBJEXT): $(top_srcdir)/gc/gc_impl.h
|
||||||
gc.$(OBJEXT): $(top_srcdir)/internal/array.h
|
gc.$(OBJEXT): $(top_srcdir)/internal/array.h
|
||||||
|
57
gc.c
57
gc.c
@ -566,7 +566,7 @@ rb_gc_guarded_ptr_val(volatile VALUE *ptr, VALUE val)
|
|||||||
|
|
||||||
static const char *obj_type_name(VALUE obj);
|
static const char *obj_type_name(VALUE obj);
|
||||||
#define RB_AMALGAMATED_DEFAULT_GC
|
#define RB_AMALGAMATED_DEFAULT_GC
|
||||||
#include "gc/default.c"
|
#include "gc/default/default.c"
|
||||||
static int external_gc_loaded = FALSE;
|
static int external_gc_loaded = FALSE;
|
||||||
|
|
||||||
|
|
||||||
@ -580,7 +580,7 @@ typedef struct gc_function_map {
|
|||||||
void *(*objspace_alloc)(void);
|
void *(*objspace_alloc)(void);
|
||||||
void (*objspace_init)(void *objspace_ptr);
|
void (*objspace_init)(void *objspace_ptr);
|
||||||
void (*objspace_free)(void *objspace_ptr);
|
void (*objspace_free)(void *objspace_ptr);
|
||||||
void *(*ractor_cache_alloc)(void *objspace_ptr);
|
void *(*ractor_cache_alloc)(void *objspace_ptr, void *ractor);
|
||||||
void (*ractor_cache_free)(void *objspace_ptr, void *cache);
|
void (*ractor_cache_free)(void *objspace_ptr, void *cache);
|
||||||
void (*set_params)(void *objspace_ptr);
|
void (*set_params)(void *objspace_ptr);
|
||||||
void (*init)(void);
|
void (*init)(void);
|
||||||
@ -635,6 +635,9 @@ typedef struct gc_function_map {
|
|||||||
// Object ID
|
// Object ID
|
||||||
VALUE (*object_id)(void *objspace_ptr, VALUE obj);
|
VALUE (*object_id)(void *objspace_ptr, VALUE obj);
|
||||||
VALUE (*object_id_to_ref)(void *objspace_ptr, VALUE object_id);
|
VALUE (*object_id_to_ref)(void *objspace_ptr, VALUE object_id);
|
||||||
|
// Forking
|
||||||
|
void (*before_fork)(void *objspace_ptr);
|
||||||
|
void (*after_fork)(void *objspace_ptr, rb_pid_t pid);
|
||||||
// Statistics
|
// Statistics
|
||||||
void (*set_measure_total_time)(void *objspace_ptr, VALUE flag);
|
void (*set_measure_total_time)(void *objspace_ptr, VALUE flag);
|
||||||
bool (*get_measure_total_time)(void *objspace_ptr);
|
bool (*get_measure_total_time)(void *objspace_ptr);
|
||||||
@ -683,7 +686,7 @@ ruby_external_gc_init(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t gc_so_path_size = strlen(SHARED_GC_DIR "librubygc." SOEXT) + strlen(gc_so_file) + 1;
|
size_t gc_so_path_size = strlen(SHARED_GC_DIR "librubygc." DLEXT) + strlen(gc_so_file) + 1;
|
||||||
gc_so_path = alloca(gc_so_path_size);
|
gc_so_path = alloca(gc_so_path_size);
|
||||||
{
|
{
|
||||||
size_t gc_so_path_idx = 0;
|
size_t gc_so_path_idx = 0;
|
||||||
@ -693,7 +696,7 @@ ruby_external_gc_init(void)
|
|||||||
GC_SO_PATH_APPEND(SHARED_GC_DIR);
|
GC_SO_PATH_APPEND(SHARED_GC_DIR);
|
||||||
GC_SO_PATH_APPEND("librubygc.");
|
GC_SO_PATH_APPEND("librubygc.");
|
||||||
GC_SO_PATH_APPEND(gc_so_file);
|
GC_SO_PATH_APPEND(gc_so_file);
|
||||||
GC_SO_PATH_APPEND(SOEXT);
|
GC_SO_PATH_APPEND(DLEXT);
|
||||||
GC_ASSERT(gc_so_path_idx == gc_so_path_size - 1);
|
GC_ASSERT(gc_so_path_idx == gc_so_path_size - 1);
|
||||||
#undef GC_SO_PATH_APPEND
|
#undef GC_SO_PATH_APPEND
|
||||||
}
|
}
|
||||||
@ -781,6 +784,9 @@ ruby_external_gc_init(void)
|
|||||||
// Object ID
|
// Object ID
|
||||||
load_external_gc_func(object_id);
|
load_external_gc_func(object_id);
|
||||||
load_external_gc_func(object_id_to_ref);
|
load_external_gc_func(object_id_to_ref);
|
||||||
|
// Forking
|
||||||
|
load_external_gc_func(before_fork);
|
||||||
|
load_external_gc_func(after_fork);
|
||||||
// Statistics
|
// Statistics
|
||||||
load_external_gc_func(set_measure_total_time);
|
load_external_gc_func(set_measure_total_time);
|
||||||
load_external_gc_func(get_measure_total_time);
|
load_external_gc_func(get_measure_total_time);
|
||||||
@ -862,6 +868,9 @@ ruby_external_gc_init(void)
|
|||||||
// Object ID
|
// Object ID
|
||||||
# define rb_gc_impl_object_id rb_gc_functions.object_id
|
# define rb_gc_impl_object_id rb_gc_functions.object_id
|
||||||
# define rb_gc_impl_object_id_to_ref rb_gc_functions.object_id_to_ref
|
# define rb_gc_impl_object_id_to_ref rb_gc_functions.object_id_to_ref
|
||||||
|
// Forking
|
||||||
|
# define rb_gc_impl_before_fork rb_gc_functions.before_fork
|
||||||
|
# define rb_gc_impl_after_fork rb_gc_functions.after_fork
|
||||||
// Statistics
|
// Statistics
|
||||||
# define rb_gc_impl_set_measure_total_time rb_gc_functions.set_measure_total_time
|
# define rb_gc_impl_set_measure_total_time rb_gc_functions.set_measure_total_time
|
||||||
# define rb_gc_impl_get_measure_total_time rb_gc_functions.get_measure_total_time
|
# define rb_gc_impl_get_measure_total_time rb_gc_functions.get_measure_total_time
|
||||||
@ -915,7 +924,7 @@ newobj_of(rb_ractor_t *cr, VALUE klass, VALUE flags, VALUE v1, VALUE v2, VALUE v
|
|||||||
{
|
{
|
||||||
VALUE obj = rb_gc_impl_new_obj(rb_gc_get_objspace(), cr->newobj_cache, klass, flags, v1, v2, v3, wb_protected, size);
|
VALUE obj = rb_gc_impl_new_obj(rb_gc_get_objspace(), cr->newobj_cache, klass, flags, v1, v2, v3, wb_protected, size);
|
||||||
|
|
||||||
if (UNLIKELY(ruby_vm_event_flags & RUBY_INTERNAL_EVENT_NEWOBJ)) {
|
if (UNLIKELY(rb_gc_event_hook_required_p(RUBY_INTERNAL_EVENT_NEWOBJ))) {
|
||||||
unsigned int lev;
|
unsigned int lev;
|
||||||
RB_VM_LOCK_ENTER_CR_LEV(cr, &lev);
|
RB_VM_LOCK_ENTER_CR_LEV(cr, &lev);
|
||||||
{
|
{
|
||||||
@ -1104,6 +1113,44 @@ rb_data_free(void *objspace, VALUE obj)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rb_gc_obj_free_vm_weak_references(VALUE obj)
|
||||||
|
{
|
||||||
|
if (FL_TEST(obj, FL_EXIVAR)) {
|
||||||
|
rb_free_generic_ivar((VALUE)obj);
|
||||||
|
FL_UNSET(obj, FL_EXIVAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (BUILTIN_TYPE(obj)) {
|
||||||
|
case T_STRING:
|
||||||
|
if (FL_TEST(obj, RSTRING_FSTR)) {
|
||||||
|
st_data_t fstr = (st_data_t)obj;
|
||||||
|
st_delete(rb_vm_fstring_table(), &fstr, NULL);
|
||||||
|
RB_DEBUG_COUNTER_INC(obj_str_fstr);
|
||||||
|
|
||||||
|
FL_UNSET(obj, RSTRING_FSTR);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case T_SYMBOL:
|
||||||
|
rb_gc_free_dsymbol(obj);
|
||||||
|
break;
|
||||||
|
case T_IMEMO:
|
||||||
|
switch (imemo_type(obj)) {
|
||||||
|
case imemo_callinfo:
|
||||||
|
rb_vm_ci_free((const struct rb_callinfo *)obj);
|
||||||
|
break;
|
||||||
|
case imemo_ment:
|
||||||
|
rb_free_method_entry_vm_weak_references((const rb_method_entry_t *)obj);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
rb_gc_obj_free(void *objspace, VALUE obj)
|
rb_gc_obj_free(void *objspace, VALUE obj)
|
||||||
{
|
{
|
||||||
|
9438
gc/default/default.c
Normal file
9438
gc/default/default.c
Normal file
File diff suppressed because it is too large
Load Diff
5
gc/default/extconf.rb
Normal file
5
gc/default/extconf.rb
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require_relative "../extconf_base"
|
||||||
|
|
||||||
|
create_gc_makefile("default")
|
13
gc/extconf_base.rb
Normal file
13
gc/extconf_base.rb
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "mkmf"
|
||||||
|
|
||||||
|
srcdir = File.join(__dir__, "..")
|
||||||
|
$CFLAGS << " -I#{srcdir}"
|
||||||
|
|
||||||
|
$CFLAGS << " -DBUILDING_SHARED_GC"
|
||||||
|
$CFLAGS << " -fPIC"
|
||||||
|
|
||||||
|
def create_gc_makefile(name)
|
||||||
|
create_makefile("librubygc.#{name}")
|
||||||
|
end
|
1
gc/gc.h
1
gc/gc.h
@ -29,6 +29,7 @@ size_t rb_size_mul_or_raise(size_t x, size_t y, VALUE exc);
|
|||||||
void rb_gc_run_obj_finalizer(VALUE objid, long count, VALUE (*callback)(long i, void *data), void *data);
|
void rb_gc_run_obj_finalizer(VALUE objid, long count, VALUE (*callback)(long i, void *data), void *data);
|
||||||
void rb_gc_set_pending_interrupt(void);
|
void rb_gc_set_pending_interrupt(void);
|
||||||
void rb_gc_unset_pending_interrupt(void);
|
void rb_gc_unset_pending_interrupt(void);
|
||||||
|
void rb_gc_obj_free_vm_weak_references(VALUE obj);
|
||||||
bool rb_gc_obj_free(void *objspace, VALUE obj);
|
bool rb_gc_obj_free(void *objspace, VALUE obj);
|
||||||
void rb_gc_mark_roots(void *objspace, const char **categoryp);
|
void rb_gc_mark_roots(void *objspace, const char **categoryp);
|
||||||
void rb_gc_ractor_newobj_cache_foreach(void (*func)(void *cache, void *data), void *data);
|
void rb_gc_ractor_newobj_cache_foreach(void (*func)(void *cache, void *data), void *data);
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
GC_IMPL_FN void *rb_gc_impl_objspace_alloc(void);
|
GC_IMPL_FN void *rb_gc_impl_objspace_alloc(void);
|
||||||
GC_IMPL_FN void rb_gc_impl_objspace_init(void *objspace_ptr);
|
GC_IMPL_FN void rb_gc_impl_objspace_init(void *objspace_ptr);
|
||||||
GC_IMPL_FN void rb_gc_impl_objspace_free(void *objspace_ptr);
|
GC_IMPL_FN void rb_gc_impl_objspace_free(void *objspace_ptr);
|
||||||
GC_IMPL_FN void *rb_gc_impl_ractor_cache_alloc(void *objspace_ptr);
|
GC_IMPL_FN void *rb_gc_impl_ractor_cache_alloc(void *objspace_ptr, void *ractor);
|
||||||
GC_IMPL_FN void rb_gc_impl_ractor_cache_free(void *objspace_ptr, void *cache);
|
GC_IMPL_FN void rb_gc_impl_ractor_cache_free(void *objspace_ptr, void *cache);
|
||||||
GC_IMPL_FN void rb_gc_impl_set_params(void *objspace_ptr);
|
GC_IMPL_FN void rb_gc_impl_set_params(void *objspace_ptr);
|
||||||
GC_IMPL_FN void rb_gc_impl_init(void);
|
GC_IMPL_FN void rb_gc_impl_init(void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user