mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
15476c695d
Some external functions I wish to call may take a long time and unnecessarily block other threads. This may lead to performance regressions for fast functions as releasing/acquiring the GVL is not cheap, but can improve performance for long-running functions in multi-threaded applications. This also means we must reacquire the GVL when calling Ruby-defined callbacks for Fiddle::Closure, meaning we must detect whether the current thread has the GVL by exporting ruby_thread_has_gvl_p in internal.h * ext/fiddle/function.c (struct nogvl_ffi_call_args): new struct for GVL release (nogvl_ffi_call): new function (function_call): adjust for GVL release [ruby-core:71642] [Feature #11607] * ext/fiddle/closure.c (struct callback_args): new struct for GVL acquire (with_gvl_callback): adjusted original callback function (callback): wrapper for conditional GVL acquire * ext/fiddle/depend: add dependencies * ext/fiddle/extconf.rb: include top_srcdir for internal.h * internal.h (ruby_thread_has_gvl_p): expose for fiddle * vm_core.h (ruby_thread_has_gvl_p): moved to internal.h * test/fiddle/test_function.rb (test_nogvl_poll): new test git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52723 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
57 lines
1.3 KiB
Text
57 lines
1.3 KiB
Text
PWD =
|
|
|
|
CONFIGURE_LIBFFI = \
|
|
$(LIBFFI_CONFIGURE) --disable-shared \
|
|
--host=$(LIBFFI_ARCH) --enable-builddir=$(arch) \
|
|
CC="$(CC)" CFLAGS="$(LIBFFI_CFLAGS)" \
|
|
LD="$(LD)" LDFLAGS="$(LIBFFI_LDFLAGS)"
|
|
|
|
$(OBJS): $(HDRS) $(ruby_headers) \
|
|
$(hdrdir)/ruby/io.h \
|
|
$(hdrdir)/ruby/encoding.h \
|
|
$(hdrdir)/ruby/oniguruma.h \
|
|
$(hdrdir)/ruby/thread.h \
|
|
$(top_srcdir)/internal.h
|
|
|
|
$(STATIC_LIB) $(RUBYARCHDIR)/$(DLLIB) $(DLLIB): $(LIBFFI_A)
|
|
|
|
$(OBJS): $(FFI_H)
|
|
|
|
.PHONY: .FORCE hdr
|
|
|
|
.FORCE:
|
|
|
|
hdr: $(FFI_H)
|
|
|
|
configure-libffi build-libffi: .FORCE
|
|
configure-libffi \
|
|
$(LIBFFI_DIR)/include/ffi.h \
|
|
$(LIBFFI_DIR)/include/ffitarget.h \
|
|
$(LIBFFI_DIR)/fficonfig.h \
|
|
$(LIBFFI_DIR)/Makefile:
|
|
$(Q) $(MAKEDIRS) $(LIBFFI_DIR)
|
|
$(Q) $(CONFIGURE_LIBFFI)
|
|
|
|
build-libffi: $(LIBFFI_A)
|
|
build-libffi $(LIBFFI_A):
|
|
$(Q) $(SUBMAKE_LIBFFI)
|
|
|
|
clean-libffi:
|
|
$(Q) $(SUBMAKE_LIBFFI) clean
|
|
|
|
distclean-libffi:
|
|
$(Q) $(SUBMAKE_LIBFFI) distclean
|
|
$(Q) $(RM) $(LIBFFI_DIR)/local.exp
|
|
$(Q) $(RUBY) -rfileutils -e "FileUtils.rmdir(Dir.glob(ARGV[0]+'/**/{,.*/}'), :parents=>true)" $(LIBFFI_DIR)
|
|
|
|
realclean-libffi:
|
|
$(Q) $(RMALL) $(LIBFFI_DIR)
|
|
|
|
.PHONY: clean-libffi distclean-libffi realclean-libffi
|
|
.PHONY: clean-none distclean-none realclean-none
|
|
|
|
clean: clean-$(LIBFFI_CLEAN)
|
|
distclean: distclean-$(LIBFFI_CLEAN)
|
|
realclean: realclean-$(LIBFFI_CLEAN)
|
|
|
|
.PHONY: configure configure-libffi
|