ffi 1.10.0 → 1.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.gitmodules +2 -1
  4. data/.travis.yml +17 -18
  5. data/CHANGELOG.md +33 -0
  6. data/Gemfile +1 -1
  7. data/README.md +20 -17
  8. data/Rakefile +10 -83
  9. data/appveyor.yml +6 -1
  10. data/ext/ffi_c/Call.c +16 -33
  11. data/ext/ffi_c/Call.h +2 -5
  12. data/ext/ffi_c/Function.c +24 -108
  13. data/ext/ffi_c/Platform.c +0 -47
  14. data/ext/ffi_c/Thread.c +6 -222
  15. data/ext/ffi_c/Thread.h +2 -13
  16. data/ext/ffi_c/Type.c +0 -18
  17. data/ext/ffi_c/Type.h +0 -1
  18. data/ext/ffi_c/Variadic.c +9 -15
  19. data/ext/ffi_c/extconf.rb +34 -20
  20. data/ext/ffi_c/ffi.c +3 -8
  21. data/ext/ffi_c/libffi/configure.ac +5 -1
  22. data/ext/ffi_c/libffi/include/ffi_common.h +1 -1
  23. data/ext/ffi_c/libffi/src/aarch64/ffi.c +2 -2
  24. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  25. data/ext/ffi_c/libffi/src/metag/ffi.c +1 -1
  26. data/ext/ffi_c/libffi/src/moxie/ffi.c +1 -1
  27. data/ext/ffi_c/libffi/src/riscv/ffi.c +42 -6
  28. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +1 -0
  29. data/ext/ffi_c/libffi/src/riscv/sysv.S +86 -7
  30. data/ext/ffi_c/libffi/src/x86/ffi.c +2 -1
  31. data/ext/ffi_c/libffi/src/x86/ffiw64.c +1 -1
  32. data/ext/ffi_c/libffi/src/x86/sysv.S +88 -2
  33. data/ext/ffi_c/libffi/src/x86/unix64.S +41 -0
  34. data/ext/ffi_c/rbffi.h +0 -2
  35. data/ffi.gemspec +11 -4
  36. data/lib/ffi/data_converter.rb +67 -0
  37. data/lib/ffi/ffi.rb +1 -0
  38. data/lib/ffi/platform.rb +2 -0
  39. data/lib/ffi/pointer.rb +1 -1
  40. data/lib/ffi/struct.rb +3 -63
  41. data/lib/ffi/struct_by_reference.rb +72 -0
  42. data/lib/ffi/struct_layout.rb +96 -0
  43. data/lib/ffi/tools/const_generator.rb +5 -4
  44. data/lib/ffi/tools/generator.rb +47 -2
  45. data/lib/ffi/tools/generator_task.rb +13 -17
  46. data/lib/ffi/tools/struct_generator.rb +4 -4
  47. data/lib/ffi/types.rb +1 -1
  48. data/lib/ffi/version.rb +1 -1
  49. metadata +18 -13
  50. data/ext/ffi_c/DataConverter.c +0 -91
  51. data/ext/ffi_c/StructByReference.c +0 -190
  52. data/ext/ffi_c/StructByReference.h +0 -50
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 108ea9d730d92bf5994912324af1cd21b23256c575d0344a7884990d8307baa7
4
- data.tar.gz: be60f268828396e8b67d1329ac95b136f4f03a229d37f95f73d35dcd1fb8908c
3
+ metadata.gz: 041f37e7f1d2ed3857caabe7c68a68d3d8a9b403c5d03e8df59d0277a48f17e2
4
+ data.tar.gz: 4c9bcdce1d0ba85318109bb074a0e19c87f5c004440a491d5f532ac2ec20b82c
5
5
  SHA512:
6
- metadata.gz: eed04778f789f4216f78466bc8fb3f30efa96f3da66720fe3fcce1f5eba01213387c20fe0eb1bcd73146931cefdc68133a3d6a1723b921e1ce00adb58e8e6440
7
- data.tar.gz: 8c8c96560189bce8d0a95513872028692b89d181ed8ba68752085cbcac2cf957bde9b00c6666946646849acea167b300c28727fd9669098cfb83514fbcf29474
6
+ metadata.gz: 4ae610d83039e9edc3ce4fe3708319cc4c1fc0d8d6dbddc96b4f4b51eec5875fb9052adfce7620664707a73696f3d17c4c1c956037ac252e1924a36fde57ad4c
7
+ data.tar.gz: 3a745c80a61c816826ded2c3e29eb13746e1686edcd14f98d06d012d31352b7eaf30e15d9517e662a80beb65f48e1af6e0bceddbf23346d3268ccf6d6ea820ea
data/.gitignore CHANGED
@@ -20,3 +20,6 @@ vendor
20
20
  Gemfile.lock
21
21
  types_log
22
22
  *.gem
23
+ embed-test.log
24
+ spec/ffi/embed-test/ext/Makefile
25
+ spec/ffi/embed-test/ext/embed_test.bundle
@@ -1,3 +1,4 @@
1
1
  [submodule "ext/ffi_c/libffi"]
2
2
  path = ext/ffi_c/libffi
3
- url = https://github.com/libffi/libffi.git
3
+ url = https://github.com/larskanis/libffi.git
4
+ branch = fix-stdcall
@@ -1,12 +1,11 @@
1
1
  dist: trusty
2
- sudo: false
3
2
  group: beta
4
3
  language: ruby
5
- before_install:
6
- - gem install bundler
4
+
7
5
  script:
8
6
  - bundle exec rake compile || bundle exec rake compile
9
7
  - bundle exec rake test
8
+ - ITER=10 bundle exec rake bench:all
10
9
  os:
11
10
  - linux
12
11
  - osx
@@ -16,28 +15,28 @@ rvm:
16
15
  - 2.5.3
17
16
  - 2.6.0
18
17
  - ruby-head
19
- - system
18
+
20
19
  env:
21
20
  - CC=gcc
22
21
  - CC=clang
23
22
  matrix:
24
23
  allow_failures:
25
- - rvm: system
26
24
  - os: osx
27
25
  rvm: ruby-head
28
- exclude: # ruby 2.4.2 needs build with xcode9 or later on osx
29
- - os: osx
30
- rvm: 2.4.2
31
26
  include:
32
- - os: osx
33
- osx_image: xcode9.1
34
- rvm: 2.4.2
35
- env:
36
- - CC=gcc
37
- - os: osx
38
- osx_image: xcode9.1
39
- rvm: 2.4.2
40
- env:
41
- - CC=clang
27
+ - name: powerpc
28
+ language: generic
29
+ before_install: |
30
+ docker run --rm --privileged multiarch/qemu-user-static:register --reset &&
31
+ docker build --rm -t ffi-powerpc -f spec/env/Dockerfile.powerpc .
32
+ script: |
33
+ docker run --rm -t -v `pwd`:/ffi ffi-powerpc
34
+ - name: armhf
35
+ language: generic
36
+ before_install: |
37
+ docker run --rm --privileged multiarch/qemu-user-static:register --reset &&
38
+ docker build --rm -t ffi-armhf -f spec/env/Dockerfile.armhf .
39
+ script: |
40
+ docker run --rm -t -v `pwd`:/ffi ffi-armhf
42
41
  after_failure:
43
42
  - "find build -name mkmf.log | xargs cat"
@@ -1,3 +1,36 @@
1
+ 1.11.1 / 2019-05-20
2
+ -------------------
3
+
4
+ Changed:
5
+ * Raise required ruby version to >=2.0. #699, #700
6
+ * Fix a possible linker error on ruby < 2.3 on Linux.
7
+
8
+
9
+ 1.11.0 / 2019-05-17
10
+ -------------------
11
+
12
+ Added:
13
+ * Add ability to disable or force use of system libffi. #669
14
+ Use like `gem inst ffi -- --enable-system-libffi` .
15
+ * Add ability to call FFI callbacks from outside of FFI call frame. #584
16
+ * Add proper documentation to FFI::Generator and ::Task
17
+ * Add gemspec metadata. #696, #698
18
+
19
+ Changed:
20
+ * Fix stdcall on Win32. #649, #669
21
+ * Fix load paths for FFI::Generator::Task
22
+ * Fix FFI::Pointer#read_string(0) to return a binary String. #692
23
+ * Fix benchmark suite so that it runs on ruby-2.x
24
+ * Move FFI::Platform::CPU from C to Ruby. #663
25
+ * Move FFI::StructByReference to Ruby. #681
26
+ * Move FFI::DataConverter to Ruby (#661)
27
+ * Various cleanups and improvements of specs and benchmarks
28
+
29
+ Removed:
30
+ * Remove ruby-1.8 and 1.9 compatibility code. #683
31
+ * Remove unused spec files. #684
32
+
33
+
1
34
  1.10.0 / 2019-01-06
2
35
  -------------------
3
36
 
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  group :development do
4
- gem 'rake', '~> 10.1'
4
+ gem 'rake', '~> 12.1'
5
5
  gem 'rake-compiler', '~> 1.0.3'
6
6
  gem 'rake-compiler-dock', '~> 0.7.0'
7
7
  gem 'rspec', '~> 3.0'
data/README.md CHANGED
@@ -1,19 +1,19 @@
1
- # ruby-ffi https://wiki.github.com/ffi/ffi [![Build Status](https://travis-ci.org/ffi/ffi.png?branch=master)](https://travis-ci.org/ffi/ffi) [![Build status Windows](https://ci.appveyor.com/api/projects/status/r8wxn1sd4s794gg1/branch/master?svg=true)](https://ci.appveyor.com/project/larskanis/ffi-aofqa/branch/master)
1
+ # Ruby-FFI https://github.com/ffi/ffi/wiki [![Build Status](https://travis-ci.org/ffi/ffi.svg?branch=master)](https://travis-ci.org/ffi/ffi) [![Build status Windows](https://ci.appveyor.com/api/projects/status/r8wxn1sd4s794gg1/branch/master?svg=true)](https://ci.appveyor.com/project/larskanis/ffi-aofqa/branch/master)
2
2
 
3
3
  ## Description
4
4
 
5
- Ruby-FFI is a ruby extension for programmatically loading dynamic
5
+ Ruby-FFI is a gem for programmatically loading dynamically-linked native
6
6
  libraries, binding functions within them, and calling those functions
7
7
  from Ruby code. Moreover, a Ruby-FFI extension works without changes
8
- on Ruby and JRuby. [Discover why you should write your next extension
9
- using Ruby-FFI](https://wiki.github.com/ffi/ffi/why-use-ffi).
8
+ on CRuby (MRI), JRuby, Rubinius and TruffleRuby. [Discover why you should write your next extension
9
+ using Ruby-FFI](https://github.com/ffi/ffi/wiki/why-use-ffi).
10
10
 
11
- ## Features/problems
11
+ ## Features
12
12
 
13
13
  * Intuitive DSL
14
14
  * Supports all C native types
15
15
  * C structs (also nested), enums and global variables
16
- * Callbacks from C to ruby
16
+ * Callbacks from C to Ruby
17
17
  * Automatic garbage collection of native memory
18
18
 
19
19
  ## Synopsis
@@ -30,20 +30,23 @@ end
30
30
  MyLib.puts 'Hello, World using libc!'
31
31
  ```
32
32
 
33
- For less minimalistic and more sane examples you may look at:
33
+ For less minimalistic and more examples you may look at:
34
34
 
35
- * the samples/ folder
36
- * the examples on the [wiki](https://wiki.github.com/ffi/ffi)
37
- * the projects using FFI listed on this page (https://wiki.github.com/ffi/ffi/projects-using-ffi)
35
+ * the `samples/` folder
36
+ * the examples on the [wiki](https://github.com/ffi/ffi/wiki)
37
+ * the projects using FFI listed on the wiki: https://github.com/ffi/ffi/wiki/projects-using-ffi
38
38
 
39
39
  ## Requirements
40
40
 
41
- You need a sane building environment in order to compile the extension.
42
- At a minimum, you will need:
43
- * A C compiler (e.g. Xcode on OSX, gcc on everything else)
44
- * libffi development library - this is commonly in the libffi-dev or libffi-devel
41
+ When installing the gem on CRuby (MRI) or Rubinius, you will need:
42
+ * A C compiler (e.g., Xcode on macOS, `gcc` or `clang` on everything else)
43
+ * The `libffi` library and development headers - this is commonly in the `libffi-dev` or `libffi-devel` packages
45
44
 
46
- On Linux systems running with [PaX](https://en.wikipedia.org/wiki/PaX) (Gentoo, Alpine, etc.) FFI may trigger `mprotect` errors. You may need to disable [mprotect](https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Restrict_mprotect.28.29) for ruby (`paxctl -m [/path/to/ruby]`) for the time being until a solution is found.
45
+ On Linux systems running with [PaX](https://en.wikipedia.org/wiki/PaX) (Gentoo, Alpine, etc.), FFI may trigger `mprotect` errors. You may need to disable [mprotect](https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Restrict_mprotect.28.29) for ruby (`paxctl -m [/path/to/ruby]`) for the time being until a solution is found.
46
+
47
+ On FreeBSD systems pkgconf must be installed for the gem to be able to compile using clang. Install either via packages `pkg install pkgconf` or from ports via `devel/pkgconf`.
48
+
49
+ On JRuby and TruffleRuby, there are no requirements to install the FFI gem, and `require 'ffi'` works even without installing the gem (i.e., the gem is preinstalled on these implementations).
47
50
 
48
51
  ## Installation
49
52
 
@@ -61,8 +64,7 @@ or from the git repository on github:
61
64
  ## License
62
65
 
63
66
  The ffi library is covered by the BSD license, also see the LICENSE file.
64
- The specs are shared with Rubyspec and are licensed by the same license
65
- as Rubyspec, see the LICENSE.SPECS file.
67
+ The specs are covered by the same license as [ruby/spec](https://github.com/ruby/spec), the MIT license.
66
68
 
67
69
  ## Credits
68
70
 
@@ -74,6 +76,7 @@ The following people have submitted code, bug reports, or otherwise contributed
74
76
  * Andreas Niederl <rico32@gmx.net>
75
77
  * Andrew Cholakian <andrew@andrewvc.com>
76
78
  * Antonio Terceiro <terceiro@softwarelivre.org>
79
+ * Benoit Daloze <eregontp@gmail.com>
77
80
  * Brian Candler <B.Candler@pobox.com>
78
81
  * Brian D. Burns <burns180@gmail.com>
79
82
  * Bryan Kearney <bkearney@redhat.com>
data/Rakefile CHANGED
@@ -3,82 +3,16 @@ require 'rbconfig'
3
3
  require 'rake/clean'
4
4
  require File.expand_path("./lib/ffi/version")
5
5
 
6
- USE_RAKE_COMPILER = (RUBY_PLATFORM =~ /java/) ? false : true
7
- if USE_RAKE_COMPILER
8
- require 'rake/extensiontask'
9
- end
10
-
11
6
  require 'date'
12
7
  require 'fileutils'
13
8
  require 'rbconfig'
14
9
  require 'rspec/core/rake_task'
15
10
  require 'rubygems/package_task'
16
11
 
17
- LIBEXT = case RbConfig::CONFIG['host_os'].downcase
18
- when /darwin/
19
- "dylib"
20
- when /mswin|mingw/
21
- "dll"
22
- else
23
- RbConfig::CONFIG['DLEXT']
24
- end
25
-
26
- CPU = case RbConfig::CONFIG['host_cpu'].downcase
27
- when /i[3456]86/
28
- # Darwin always reports i686, even when running in 64bit mode
29
- if RbConfig::CONFIG['host_os'] =~ /darwin/ && 0xfee1deadbeef.is_a?(Fixnum)
30
- "x86_64"
31
- else
32
- "i386"
33
- end
34
-
35
- when /amd64|x86_64/
36
- "x86_64"
37
-
38
- when /ppc64|powerpc64/
39
- "powerpc64"
40
-
41
- when /ppc|powerpc/
42
- "powerpc"
43
-
44
- when /^arm/
45
- "arm"
46
-
47
- else
48
- RbConfig::CONFIG['host_cpu']
49
- end
50
-
51
- OS = case RbConfig::CONFIG['host_os'].downcase
52
- when /linux/
53
- "linux"
54
- when /darwin/
55
- "darwin"
56
- when /freebsd/
57
- "freebsd"
58
- when /openbsd/
59
- "openbsd"
60
- when /sunos|solaris/
61
- "solaris"
62
- when /mswin|mingw/
63
- "win32"
64
- else
65
- RbConfig::CONFIG['host_os'].downcase
66
- end
67
-
68
- def which(name)
69
- exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
70
- ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
71
- exts.each do |ext|
72
- app = File.join(path, name+ext)
73
- return app if File.executable? app
74
- end
75
- end
76
- nil
12
+ def java?
13
+ /java/ === RUBY_PLATFORM
77
14
  end
78
15
 
79
- GMAKE = which('gmake').nil? ? 'make' : 'gmake'
80
-
81
- LIBTEST = "build/libtest.#{LIBEXT}"
82
16
  BUILD_DIR = "build"
83
17
  BUILD_EXT_DIR = File.join(BUILD_DIR, "#{RbConfig::CONFIG['arch']}", 'ffi_c', RUBY_VERSION)
84
18
 
@@ -86,7 +20,7 @@ def gem_spec
86
20
  @gem_spec ||= Gem::Specification.load('ffi.gemspec')
87
21
  end
88
22
 
89
- TEST_DEPS = [ LIBTEST ]
23
+ TEST_DEPS = []
90
24
  if RUBY_PLATFORM == "java"
91
25
  RSpec::Core::RakeTask.new(:spec) do |config|
92
26
  config.rspec_opts = YAML.load_file 'spec/spec.opts'
@@ -110,30 +44,22 @@ CLEAN.include 'build'
110
44
  CLEAN.include 'conftest.dSYM'
111
45
  CLEAN.include 'spec/ffi/fixtures/libtest.{dylib,so,dll}'
112
46
  CLEAN.include 'spec/ffi/fixtures/*.o'
47
+ CLEAN.include 'spec/ffi/embed-test/ext/*.{o,def}'
48
+ CLEAN.include 'spec/ffi/embed-test/ext/Makefile'
113
49
  CLEAN.include "pkg/ffi-*-{mingw32,java}"
114
50
  CLEAN.include 'lib/1.*'
115
51
  CLEAN.include 'lib/2.*'
116
- CLEAN.include 'bin'
117
52
 
118
53
  task :distclean => :clobber
119
54
 
120
- desc "Build the native test lib"
121
- file "build/libtest.#{LIBEXT}" => FileList['libtest/**/*.[ch]'] do
122
- sh %{#{GMAKE} -f libtest/GNUmakefile CPU=#{CPU} OS=#{OS} }
123
- end
124
-
125
-
126
- desc "Build test helper lib"
127
- task :libtest => "build/libtest.#{LIBEXT}"
128
-
129
55
  desc "Test the extension"
130
56
  task :test => [ :spec ]
131
57
 
132
58
 
133
59
  namespace :bench do
134
60
  ITER = ENV['ITER'] ? ENV['ITER'].to_i : 100000
135
- bench_libs = "-Ilib -I#{BUILD_DIR}" unless RUBY_PLATFORM == "java"
136
- bench_files = Dir["bench/bench_*.rb"].reject { |f| f == "bench_helper.rb" }
61
+ bench_libs = "-Ilib" unless RUBY_PLATFORM == "java"
62
+ bench_files = Dir["bench/bench_*.rb"].reject { |f| f == "bench/bench_helper.rb" }
137
63
  bench_files.each do |bench|
138
64
  task File.basename(bench, ".rb")[6..-1] => TEST_DEPS do
139
65
  sh %{#{Gem.ruby} #{bench_libs} #{bench} #{ITER}}
@@ -175,8 +101,8 @@ end
175
101
 
176
102
  task 'gem:java' => 'java:gem'
177
103
 
178
-
179
- if USE_RAKE_COMPILER
104
+ unless java?
105
+ require 'rake/extensiontask'
180
106
  Rake::ExtensionTask.new('ffi_c', gem_spec) do |ext|
181
107
  ext.name = 'ffi_c' # indicate the name of the extension.
182
108
  # ext.lib_dir = BUILD_DIR # put binaries into this folder.
@@ -212,6 +138,7 @@ file "ext/ffi_c/libffi/autogen.sh" => "ext/ffi_c/libffi" do
212
138
  warn "Downloading libffi ..."
213
139
  sh "git submodule update --init --recursive"
214
140
  end
141
+ task :libffi => "ext/ffi_c/libffi/autogen.sh"
215
142
 
216
143
  LIBFFI_GIT_FILES = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0")
217
144
 
@@ -12,11 +12,16 @@ install:
12
12
  - bundle install
13
13
  build: off
14
14
  build_script:
15
- - bundle exec rake compile || bundle exec rake compile
15
+ - bundle exec rake libffi compile -- %EXTCONFOPTS% || bundle exec rake compile -- %EXTCONFOPTS%
16
16
  test_script:
17
17
  - bundle exec rake test
18
18
  environment:
19
19
  matrix:
20
20
  - RUBYVER: "head-x64"
21
+ EXTCONFOPTS: "--disable-system-libffi"
21
22
  - RUBYVER: 24
23
+ EXTCONFOPTS: "--disable-system-libffi"
22
24
  - RUBYVER: 25-x64
25
+ EXTCONFOPTS: "--enable-system-libffi"
26
+ - RUBYVER: 25
27
+ EXTCONFOPTS: "--enable-system-libffi"
@@ -43,10 +43,8 @@
43
43
  #endif
44
44
  #include <errno.h>
45
45
  #include <ruby.h>
46
- #if defined(HAVE_RUBY_THREAD_H)
47
46
  #include <ruby/thread.h>
48
- #endif
49
- #if defined(HAVE_NATIVETHREAD) && (defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) && !defined(_WIN32)
47
+ #if defined(HAVE_NATIVETHREAD) && !defined(_WIN32)
50
48
  # include <signal.h>
51
49
  # include <pthread.h>
52
50
  #endif
@@ -116,7 +114,7 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
116
114
  Type* paramType = paramTypes[i];
117
115
  int type;
118
116
 
119
-
117
+
120
118
  if (unlikely(paramType->nativeType == NATIVE_MAPPED)) {
121
119
  VALUE values[] = { argv[argidx], Qnil };
122
120
  argv[argidx] = rb_funcall2(((MappedType *) paramType)->rbConverter, id_to_native, 2, values);
@@ -297,8 +295,8 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
297
295
 
298
296
  case NATIVE_STRING:
299
297
  if (type == T_NIL) {
300
- param->ptr = NULL;
301
-
298
+ param->ptr = NULL;
299
+
302
300
  } else {
303
301
  if (rb_safe_level() >= 1 && OBJ_TAINTED(argv[argidx])) {
304
302
  rb_raise(rb_eSecurityError, "Unsafe string parameter");
@@ -345,9 +343,13 @@ static void *
345
343
  call_blocking_function(void* data)
346
344
  {
347
345
  rbffi_blocking_call_t* b = (rbffi_blocking_call_t *) data;
346
+ #ifndef HAVE_RUBY_THREAD_HAS_GVL_P
348
347
  b->frame->has_gvl = false;
348
+ #endif
349
349
  ffi_call(&b->cif, FFI_FN(b->function), b->retval, b->ffiValues);
350
+ #ifndef HAVE_RUBY_THREAD_HAS_GVL_P
350
351
  b->frame->has_gvl = true;
352
+ #endif
351
353
 
352
354
  return NULL;
353
355
  }
@@ -355,7 +357,7 @@ call_blocking_function(void* data)
355
357
  VALUE
356
358
  rbffi_do_blocking_call(void *data)
357
359
  {
358
- rbffi_thread_blocking_region(call_blocking_function, data, (void *) -1, NULL);
360
+ rb_thread_call_without_gvl(call_blocking_function, data, (void *) -1, NULL);
359
361
 
360
362
  return Qnil;
361
363
  }
@@ -376,28 +378,17 @@ rbffi_CallFunction(int argc, VALUE* argv, void* function, FunctionType* fnInfo)
376
378
  FFIStorage* params;
377
379
  VALUE rbReturnValue;
378
380
  rbffi_frame_t frame = { 0 };
379
-
381
+
380
382
  retval = alloca(MAX(fnInfo->ffi_cif.rtype->size, FFI_SIZEOF_ARG));
381
-
383
+
382
384
  if (unlikely(fnInfo->blocking)) {
383
385
  rbffi_blocking_call_t* bc;
384
386
 
385
- /*
386
- * due to the way thread switching works on older ruby variants, we
387
- * cannot allocate anything passed to the blocking function on the stack
388
- */
389
- #if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
387
+ /* allocate information passed to the blocking function on the stack */
390
388
  ffiValues = ALLOCA_N(void *, fnInfo->parameterCount);
391
389
  params = ALLOCA_N(FFIStorage, fnInfo->parameterCount);
392
390
  bc = ALLOCA_N(rbffi_blocking_call_t, 1);
393
391
  bc->retval = retval;
394
- #else
395
- ffiValues = ALLOC_N(void *, fnInfo->parameterCount);
396
- params = ALLOC_N(FFIStorage, fnInfo->parameterCount);
397
- bc = ALLOC_N(rbffi_blocking_call_t, 1);
398
- bc->retval = xmalloc(MAX(fnInfo->ffi_cif.rtype->size, FFI_SIZEOF_ARG));
399
- bc->stkretval = retval;
400
- #endif
401
392
  bc->cif = fnInfo->ffi_cif;
402
393
  bc->function = function;
403
394
  bc->ffiValues = ffiValues;
@@ -408,18 +399,10 @@ rbffi_CallFunction(int argc, VALUE* argv, void* function, FunctionType* fnInfo)
408
399
  fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues,
409
400
  fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums);
410
401
 
411
- rbffi_frame_push(&frame);
402
+ rbffi_frame_push(&frame);
412
403
  rb_rescue2(rbffi_do_blocking_call, (VALUE) bc, rbffi_save_frame_exception, (VALUE) &frame, rb_eException, (VALUE) 0);
413
404
  rbffi_frame_pop(&frame);
414
405
 
415
- #if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL))
416
- memcpy(bc->stkretval, bc->retval, MAX(bc->cif.rtype->size, FFI_SIZEOF_ARG));
417
- xfree(bc->params);
418
- xfree(bc->ffiValues);
419
- xfree(bc->retval);
420
- xfree(bc);
421
- #endif
422
-
423
406
  } else {
424
407
 
425
408
  ffiValues = ALLOCA_N(void *, fnInfo->parameterCount);
@@ -436,7 +419,7 @@ rbffi_CallFunction(int argc, VALUE* argv, void* function, FunctionType* fnInfo)
436
419
 
437
420
  if (unlikely(!fnInfo->ignoreErrno)) {
438
421
  rbffi_save_errno();
439
- }
422
+ }
440
423
 
441
424
  if (RTEST(frame.exc) && frame.exc != Qnil) {
442
425
  rb_exc_raise(frame.exc);
@@ -444,7 +427,7 @@ rbffi_CallFunction(int argc, VALUE* argv, void* function, FunctionType* fnInfo)
444
427
 
445
428
  RB_GC_GUARD(rbReturnValue) = rbffi_NativeValue_ToRuby(fnInfo->returnType, fnInfo->rbReturnType, retval);
446
429
  RB_GC_GUARD(fnInfo->rbReturnType);
447
-
430
+
448
431
  return rbReturnValue;
449
432
  }
450
433
 
@@ -461,7 +444,7 @@ getPointer(VALUE value, int type)
461
444
  return memory != NULL ? memory->address : NULL;
462
445
 
463
446
  } else if (type == T_STRING) {
464
-
447
+
465
448
  return StringValuePtr(value);
466
449
 
467
450
  } else if (type == T_NIL) {