ffi 1.12.1 → 1.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.appveyor.yml +3 -0
- data/.github/workflows/ci.yml +64 -0
- data/.travis.yml +19 -5
- data/CHANGELOG.md +47 -0
- data/Gemfile +4 -2
- data/Rakefile +24 -43
- data/ext/ffi_c/Buffer.c +2 -2
- data/ext/ffi_c/Call.c +1 -7
- data/ext/ffi_c/ClosurePool.c +11 -14
- data/ext/ffi_c/Function.c +8 -23
- data/ext/ffi_c/FunctionInfo.c +1 -2
- data/ext/ffi_c/LongDouble.c +5 -3
- data/ext/ffi_c/LongDouble.h +0 -4
- data/ext/ffi_c/MemoryPointer.c +1 -1
- data/ext/ffi_c/MethodHandle.c +18 -24
- data/ext/ffi_c/MethodHandle.h +3 -2
- data/ext/ffi_c/Platform.c +1 -0
- data/ext/ffi_c/Pointer.c +1 -1
- data/ext/ffi_c/Struct.c +47 -51
- data/ext/ffi_c/Struct.h +12 -6
- data/ext/ffi_c/StructLayout.c +20 -14
- data/ext/ffi_c/Thread.c +0 -3
- data/ext/ffi_c/Thread.h +0 -3
- data/ext/ffi_c/compat.h +4 -0
- data/ext/ffi_c/extconf.rb +16 -20
- data/ext/ffi_c/libffi/.travis.yml +4 -0
- data/ext/ffi_c/libffi/.travis/build.sh +4 -0
- data/ext/ffi_c/libffi/Makefile.am +2 -1
- data/ext/ffi_c/libffi/README.md +7 -1
- data/ext/ffi_c/libffi/configure.ac +25 -9
- data/ext/ffi_c/libffi/include/ffi.h.in +8 -0
- data/ext/ffi_c/libffi/libffi.map.in +8 -12
- data/ext/ffi_c/libffi/libtool-version +1 -1
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +6 -0
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +13 -2
- data/ext/ffi_c/libffi/src/closures.c +10 -4
- data/ext/ffi_c/libffi/src/pa/ffi.c +46 -91
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +1 -6
- data/ext/ffi_c/libffi/src/pa/hpux32.S +4 -2
- data/ext/ffi_c/libffi/src/pa/linux.S +4 -2
- data/ext/ffi_c/libffi/src/powerpc/sysv.S +5 -7
- data/ext/ffi_c/libffi/src/x86/ffi.c +7 -4
- data/ext/ffi_c/libffi/src/x86/ffi64.c +10 -8
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +15 -2
- data/ext/ffi_c/libffi/src/x86/ffiw64.c +10 -8
- data/ext/ffi_c/libffi/src/x86/sysv.S +13 -4
- data/ext/ffi_c/libffi/src/x86/unix64.S +58 -2
- data/ext/ffi_c/libffi/src/x86/win64.S +4 -1
- data/ffi.gemspec +1 -1
- data/lib/ffi.rb +10 -2
- data/lib/ffi/library.rb +5 -1
- data/lib/ffi/platform.rb +6 -2
- data/lib/ffi/platform/arm-linux/types.conf +32 -4
- data/lib/ffi/platform/i386-windows/types.conf +26 -79
- data/lib/ffi/platform/powerpc-linux/types.conf +32 -2
- data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
- data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
- data/lib/ffi/platform/x86_64-darwin/types.conf +4 -0
- data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +4 -22
- data/lib/ffi/platform/x86_64-linux/types.conf +21 -0
- data/lib/ffi/platform/x86_64-windows/types.conf +10 -78
- data/lib/ffi/pointer.rb +19 -12
- data/lib/ffi/struct.rb +9 -4
- data/lib/ffi/tools/types_generator.rb +2 -0
- data/lib/ffi/version.rb +1 -1
- data/samples/getlogin.rb +1 -1
- data/samples/getpid.rb +1 -1
- data/samples/gettimeofday.rb +8 -8
- data/samples/hello.rb +2 -1
- data/samples/inotify.rb +1 -1
- data/samples/pty.rb +1 -2
- data/samples/qsort.rb +0 -1
- metadata +6 -4
- data/samples/sample_helper.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c1ae7c590f7dd4d8d821c6faf31c66499a90c421ff25fe14ce4465cc058b83f
|
4
|
+
data.tar.gz: e4c16035d46e13e752e215fdc87511c214db31cec9084cca3c2141a9d83469c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4064371f99217b7b449c46915e4505b54a61785ec27a2b5cd51d798cc929ff58bef33ad9064ab93ca85ad2c5d5c07d515edb0ac5d673a468fb17abf18565627
|
7
|
+
data.tar.gz: a545c796f0b36fb7cac6ac06a73094274d077e0e0f54f55f67c129e6bff27b7679886a3adc87e9b3c173f975864dc78ac3d6277d8a8d1352f974b697ace0f8b4
|
data/.appveyor.yml
CHANGED
@@ -10,11 +10,14 @@ install:
|
|
10
10
|
- gem --version
|
11
11
|
- gem install bundler --quiet --no-document
|
12
12
|
- bundle install
|
13
|
+
# Update to libffi-3.3 since Appveyor version fails on LongDouble specs
|
14
|
+
- ridk exec pacman --sync --refresh --needed --noconfirm mingw-w64-x86_64-libffi mingw-w64-i686-libffi
|
13
15
|
build: off
|
14
16
|
build_script:
|
15
17
|
- bundle exec rake libffi compile -- %EXTCONFOPTS% || bundle exec rake compile -- %EXTCONFOPTS%
|
16
18
|
test_script:
|
17
19
|
- bundle exec rake test
|
20
|
+
- bundle exec rake types_conf && git --no-pager diff
|
18
21
|
environment:
|
19
22
|
matrix:
|
20
23
|
- RUBYVER: "head-x64"
|
@@ -0,0 +1,64 @@
|
|
1
|
+
name: CI
|
2
|
+
on: [push, pull_request]
|
3
|
+
jobs:
|
4
|
+
system-libffi:
|
5
|
+
# Run on latest MRI with explicit selection of system or builtin libffi
|
6
|
+
strategy:
|
7
|
+
fail-fast: false
|
8
|
+
matrix:
|
9
|
+
os: [ ubuntu, macos, windows ]
|
10
|
+
extconfopts: [ --disable-system-libffi, --enable-system-libffi ]
|
11
|
+
runs-on: ${{ matrix.os }}-latest
|
12
|
+
steps:
|
13
|
+
- uses: actions/checkout@v2
|
14
|
+
- uses: ruby/setup-ruby@v1
|
15
|
+
with:
|
16
|
+
ruby-version: 2.7
|
17
|
+
|
18
|
+
- run: brew install automake libffi pkg-config
|
19
|
+
if: matrix.os == 'macos'
|
20
|
+
- run: ridk exec pacman --sync --refresh --needed --noconfirm mingw-w64-x86_64-libffi
|
21
|
+
if: matrix.os == 'windows' && matrix.extconfopts == '--enable-system-libffi'
|
22
|
+
|
23
|
+
- run: bundle install
|
24
|
+
- run: bundle exec rake libffi
|
25
|
+
- run: bundle exec rake compile -- ${{ matrix.extconfopts }}
|
26
|
+
env:
|
27
|
+
# work around misconfiguration of libffi on MacOS with homebrew
|
28
|
+
PKG_CONFIG_PATH: ${{ env.PKG_CONFIG_PATH }}:/usr/local/opt/libffi/lib/pkgconfig
|
29
|
+
- run: bundle exec rake test
|
30
|
+
- run: bundle exec rake types_conf && git --no-pager diff
|
31
|
+
|
32
|
+
specs:
|
33
|
+
# Run all specs on all ruby implementations
|
34
|
+
# Use automatic libffi selection on MRI
|
35
|
+
strategy:
|
36
|
+
fail-fast: false
|
37
|
+
matrix:
|
38
|
+
os: [ ubuntu, macos, windows ]
|
39
|
+
ruby: [ 2.3, 2.4, 2.5, 2.6, 2.7, ruby-head, truffleruby-head ]
|
40
|
+
exclude:
|
41
|
+
- os: windows
|
42
|
+
ruby: truffleruby-head
|
43
|
+
- os: windows
|
44
|
+
ruby: 2.3 # compilation fails
|
45
|
+
runs-on: ${{ matrix.os }}-latest
|
46
|
+
steps:
|
47
|
+
- uses: actions/checkout@v2
|
48
|
+
- uses: ruby/setup-ruby@v1
|
49
|
+
with:
|
50
|
+
ruby-version: ${{ matrix.ruby }}
|
51
|
+
|
52
|
+
- run: brew install automake
|
53
|
+
if: matrix.os == 'macos'
|
54
|
+
|
55
|
+
- run: bundle install
|
56
|
+
- run: bundle exec rake libffi
|
57
|
+
- run: bundle exec rake compile
|
58
|
+
|
59
|
+
- run: bundle exec rake test
|
60
|
+
|
61
|
+
- run: bundle exec rake bench:all
|
62
|
+
if: matrix.ruby != 'truffleruby-head'
|
63
|
+
env:
|
64
|
+
ITER: 10
|
data/.travis.yml
CHANGED
@@ -1,20 +1,29 @@
|
|
1
1
|
dist: trusty
|
2
2
|
group: beta
|
3
3
|
language: ruby
|
4
|
+
git:
|
5
|
+
submodules: false
|
4
6
|
|
5
7
|
script:
|
6
|
-
- bundle exec rake
|
8
|
+
- bundle exec rake libffi
|
9
|
+
- bundle exec rake compile
|
7
10
|
- bundle exec rake test
|
8
|
-
-
|
11
|
+
- |
|
12
|
+
if [[ $(ruby -v) != *truffleruby* ]]; then
|
13
|
+
ITER=10 bundle exec rake bench:all
|
14
|
+
fi
|
15
|
+
- bundle exec rake types_conf && git --no-pager diff
|
9
16
|
os:
|
10
17
|
- linux
|
11
18
|
- osx
|
12
19
|
rvm:
|
13
20
|
- 2.3.8
|
14
|
-
- 2.4.
|
15
|
-
- 2.5.
|
16
|
-
- 2.6.
|
21
|
+
- 2.4.6
|
22
|
+
- 2.5.5
|
23
|
+
- 2.6.5
|
24
|
+
- 2.7.0
|
17
25
|
- ruby-head
|
26
|
+
- truffleruby-head
|
18
27
|
|
19
28
|
env:
|
20
29
|
- CC=gcc
|
@@ -25,6 +34,8 @@ matrix:
|
|
25
34
|
rvm: ruby-head
|
26
35
|
- os: osx
|
27
36
|
rvm: 2.3.8
|
37
|
+
- os: linux
|
38
|
+
rvm: ruby-head
|
28
39
|
include:
|
29
40
|
- name: powerpc
|
30
41
|
language: generic
|
@@ -40,5 +51,8 @@ matrix:
|
|
40
51
|
docker build --rm -t ffi-armhf -f spec/env/Dockerfile.armhf .
|
41
52
|
script: |
|
42
53
|
docker run --rm -t -v `pwd`:/ffi ffi-armhf
|
54
|
+
exclude:
|
55
|
+
- os: osx
|
56
|
+
rvm: truffleruby-head
|
43
57
|
after_failure:
|
44
58
|
- "find build -name mkmf.log | xargs cat"
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,50 @@
|
|
1
|
+
1.13.1 / 2020-06-09
|
2
|
+
-------------------
|
3
|
+
|
4
|
+
Changed:
|
5
|
+
* Revert use of `ucrtbase.dll` as default C library on Windows-MINGW.
|
6
|
+
`ucrtbase.dll` is still used on MSWIN target. #790
|
7
|
+
* Test for `ffi_prep_closure_loc()` to make sure we can use this function.
|
8
|
+
This fixes incorrect use of system libffi on MacOS Mojave (10.14). #787
|
9
|
+
* Update types.conf on x86_64-dragonflybsd
|
10
|
+
|
11
|
+
|
12
|
+
1.13.0 / 2020-06-01
|
13
|
+
-------------------
|
14
|
+
|
15
|
+
Added:
|
16
|
+
* Add TruffleRuby support. Almost all specs are running on TruffleRuby and succeed. #768
|
17
|
+
* Add ruby source files to the java gem. This allows to ship the Ruby library code per platform java gem and add it as a default gem to JRuby. #763
|
18
|
+
* Add FFI::Platform::LONG_DOUBLE_SIZE
|
19
|
+
* Add bounds checks for writing to an inline char[] . #756
|
20
|
+
* Add long double as callback return value. #771
|
21
|
+
* Update type definitions and add types from stdint.h and stddef.h on i386-windows, x86_64-windows, x86_64-darwin, x86_64-linux, arm-linux, powerpc-linux. #749
|
22
|
+
* Add new type definitions for powerpc-openbsd and sparcv9-openbsd. #775, #778
|
23
|
+
|
24
|
+
Changed:
|
25
|
+
* Raise required ruby version to >= 2.3.
|
26
|
+
* Lots of cleanups and improvements in library, specs and benchmarks.
|
27
|
+
* Fix a lot of compiler warnings at the C-extension
|
28
|
+
* Fix several install issues on MacOS:
|
29
|
+
* Look for libffi in SDK paths, since recent versions of macOS removed it from `/usr/include` . #757
|
30
|
+
* Fix error `ld: library not found for -lgcc_s.10.4`
|
31
|
+
* Don't built for i386 architecture as it is deprecated
|
32
|
+
* Several fixes for MSVC build on Windows. #779
|
33
|
+
* Use `ucrtbase.dll` as default C library on Windows instead of old `msvcrt.dll`. #779
|
34
|
+
* Update builtin libffi to fix a Powerpc issue with parameters of type long
|
35
|
+
* Allow unmodified sourcing of (the ruby code of) this gem in JRuby and TruffleRuby as a default gem. #747
|
36
|
+
* Improve check to detect if a module has a #find_type method suitable for FFI. This fixes compatibility with stdlib `mkmf` . #776
|
37
|
+
|
38
|
+
Removed:
|
39
|
+
* Reject callback with `:string` return type at definition, because it didn't work so far and is not save to use. #751, #782
|
40
|
+
|
41
|
+
|
42
|
+
1.12.2 / 2020-02-01
|
43
|
+
-------------------
|
44
|
+
|
45
|
+
* Fix possible segfault at FFI::Struct#[] and []= after GC.compact . #742
|
46
|
+
|
47
|
+
|
1
48
|
1.12.1 / 2020-01-14
|
2
49
|
-------------------
|
3
50
|
|
data/Gemfile
CHANGED
@@ -5,8 +5,10 @@ group :development do
|
|
5
5
|
gem 'rake-compiler', '~> 1.0.3'
|
6
6
|
gem 'rake-compiler-dock', '~> 1.0'
|
7
7
|
gem 'rspec', '~> 3.0'
|
8
|
-
|
9
|
-
|
8
|
+
# irb is a dependency of rubygems-tasks 0.2.5.
|
9
|
+
# irb versions > 1.1.1 depend on reline,
|
10
|
+
# which sometimes causes 'bundle install' to fail on Ruby <= 2.4: https://github.com/rubygems/rubygems/issues/3463
|
11
|
+
gem 'rubygems-tasks', '>= 0.2', '< 0.2.5', :require => 'rubygems/tasks'
|
10
12
|
end
|
11
13
|
|
12
14
|
group :doc do
|
data/Rakefile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rubygems/tasks'
|
2
2
|
require 'rbconfig'
|
3
3
|
require 'rake/clean'
|
4
|
-
|
4
|
+
require_relative "lib/ffi/version"
|
5
5
|
|
6
6
|
require 'date'
|
7
7
|
require 'fileutils'
|
@@ -9,10 +9,6 @@ require 'rbconfig'
|
|
9
9
|
require 'rspec/core/rake_task'
|
10
10
|
require 'rubygems/package_task'
|
11
11
|
|
12
|
-
def java?
|
13
|
-
/java/ === RUBY_PLATFORM
|
14
|
-
end
|
15
|
-
|
16
12
|
BUILD_DIR = "build"
|
17
13
|
BUILD_EXT_DIR = File.join(BUILD_DIR, "#{RbConfig::CONFIG['arch']}", 'ffi_c', RUBY_VERSION)
|
18
14
|
|
@@ -20,17 +16,8 @@ def gem_spec
|
|
20
16
|
@gem_spec ||= Gem::Specification.load('ffi.gemspec')
|
21
17
|
end
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
RSpec::Core::RakeTask.new(:spec) do |config|
|
26
|
-
config.rspec_opts = YAML.load_file 'spec/spec.opts'
|
27
|
-
end
|
28
|
-
else
|
29
|
-
RSpec::Core::RakeTask.new(:spec => :compile) do |config|
|
30
|
-
config.rspec_opts = YAML.load_file 'spec/spec.opts'
|
31
|
-
end
|
32
|
-
|
33
|
-
TEST_DEPS.unshift :compile
|
19
|
+
RSpec::Core::RakeTask.new(:spec => :compile) do |config|
|
20
|
+
config.rspec_opts = YAML.load_file 'spec/spec.opts'
|
34
21
|
end
|
35
22
|
|
36
23
|
desc "Build all packages"
|
@@ -58,37 +45,29 @@ task :test => [ :spec ]
|
|
58
45
|
|
59
46
|
namespace :bench do
|
60
47
|
ITER = ENV['ITER'] ? ENV['ITER'].to_i : 100000
|
61
|
-
|
62
|
-
bench_files = Dir["bench/bench_*.rb"].reject { |f| f == "bench/bench_helper.rb" }
|
48
|
+
bench_files = Dir["bench/bench_*.rb"].sort.reject { |f| f == "bench/bench_helper.rb" }
|
63
49
|
bench_files.each do |bench|
|
64
|
-
task File.basename(bench, ".rb")[6..-1] =>
|
65
|
-
sh %{#{Gem.ruby} #{
|
50
|
+
task File.basename(bench, ".rb")[6..-1] => :compile do
|
51
|
+
sh %{#{Gem.ruby} #{bench} #{ITER}}
|
66
52
|
end
|
67
53
|
end
|
68
|
-
task :all =>
|
54
|
+
task :all => :compile do
|
69
55
|
bench_files.each do |bench|
|
70
|
-
sh %{#{Gem.ruby} #{
|
56
|
+
sh %{#{Gem.ruby} #{bench}}
|
71
57
|
end
|
72
58
|
end
|
73
59
|
end
|
74
60
|
|
75
|
-
task 'spec:run' =>
|
76
|
-
task 'spec:specdoc' =>
|
61
|
+
task 'spec:run' => :compile
|
62
|
+
task 'spec:specdoc' => :compile
|
77
63
|
|
78
64
|
task :default => :spec
|
79
65
|
|
80
66
|
namespace 'java' do
|
81
67
|
|
82
|
-
java_gem_spec =
|
83
|
-
s.
|
84
|
-
s.
|
85
|
-
s.author = gem_spec.author
|
86
|
-
s.email = gem_spec.email
|
87
|
-
s.homepage = gem_spec.homepage
|
88
|
-
s.summary = gem_spec.summary
|
89
|
-
s.description = gem_spec.description
|
90
|
-
s.files = %w(LICENSE COPYING README.md CHANGELOG.md Rakefile)
|
91
|
-
s.license = gem_spec.license
|
68
|
+
java_gem_spec = gem_spec.dup.tap do |s|
|
69
|
+
s.files.reject! { |f| File.fnmatch?("ext/*", f) }
|
70
|
+
s.extensions = []
|
92
71
|
s.platform = 'java'
|
93
72
|
end
|
94
73
|
|
@@ -101,7 +80,7 @@ end
|
|
101
80
|
|
102
81
|
task 'gem:java' => 'java:gem'
|
103
82
|
|
104
|
-
|
83
|
+
if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
|
105
84
|
require 'rake/extensiontask'
|
106
85
|
Rake::ExtensionTask.new('ffi_c', gem_spec) do |ext|
|
107
86
|
ext.name = 'ffi_c' # indicate the name of the extension.
|
@@ -124,13 +103,17 @@ unless java?
|
|
124
103
|
sh "x86_64-w64-mingw32-strip -S build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so"
|
125
104
|
end
|
126
105
|
end
|
106
|
+
else
|
107
|
+
task :compile do
|
108
|
+
STDERR.puts "Nothing to compile on #{RUBY_ENGINE}"
|
109
|
+
end
|
127
110
|
end
|
128
111
|
|
129
112
|
desc "build a windows gem without all the ceremony"
|
130
113
|
task "gem:windows" do
|
131
114
|
require "rake_compiler_dock"
|
132
115
|
sh "bundle package"
|
133
|
-
RakeCompilerDock.sh "sudo apt-get update && sudo apt-get install -y libltdl-dev && bundle --local && rake cross native gem MAKE='nice make -j`nproc`'"
|
116
|
+
RakeCompilerDock.sh "sudo apt-get update && sudo apt-get install -y libltdl-dev && bundle --local && rake cross native gem MAKE='nice make -j`nproc`' RUBY_CC_VERSION=${RUBY_CC_VERSION/:2.2.2/}"
|
134
117
|
end
|
135
118
|
|
136
119
|
directory "ext/ffi_c/libffi"
|
@@ -158,16 +141,15 @@ end.each do |f|
|
|
158
141
|
end
|
159
142
|
end
|
160
143
|
|
161
|
-
|
162
|
-
require 'ffi/platform'
|
144
|
+
require_relative "lib/ffi/platform"
|
163
145
|
types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf'))
|
164
146
|
logfile = File.join(File.dirname(__FILE__), 'types_log')
|
165
147
|
|
166
|
-
|
148
|
+
task types_conf do |task|
|
167
149
|
require 'fileutils'
|
168
|
-
|
150
|
+
require_relative "lib/ffi/tools/types_generator"
|
169
151
|
options = {}
|
170
|
-
FileUtils.mkdir_p(File.dirname(task.name),
|
152
|
+
FileUtils.mkdir_p(File.dirname(task.name), mode: 0755 )
|
171
153
|
File.open(task.name, File::CREAT|File::TRUNC|File::RDWR, 0644) do |f|
|
172
154
|
f.puts FFI::TypesGenerator.generate(options)
|
173
155
|
end
|
@@ -177,8 +159,7 @@ file types_conf => File.join("lib", "ffi", "version.rb") do |task|
|
|
177
159
|
end
|
178
160
|
|
179
161
|
desc "Create or update type information for platform #{FFI::Platform::NAME}"
|
180
|
-
task :types_conf => types_conf
|
181
|
-
end
|
162
|
+
task :types_conf => types_conf
|
182
163
|
|
183
164
|
Gem::Tasks.new do |t|
|
184
165
|
t.scm.tag.format = '%s'
|
data/ext/ffi_c/Buffer.c
CHANGED
@@ -114,7 +114,7 @@ buffer_initialize(int argc, VALUE* argv, VALUE self)
|
|
114
114
|
}
|
115
115
|
|
116
116
|
/* ensure the memory is aligned on at least a 8 byte boundary */
|
117
|
-
p->memory.address = (void *) (((uintptr_t) p->data.storage + 0x7) & (uintptr_t) ~
|
117
|
+
p->memory.address = (void *) (((uintptr_t) p->data.storage + 0x7) & (uintptr_t) ~0x7ULL);
|
118
118
|
|
119
119
|
if (p->memory.size > 0 && (nargs < 3 || RTEST(rbClear))) {
|
120
120
|
memset(p->memory.address, 0, p->memory.size);
|
@@ -154,7 +154,7 @@ buffer_initialize_copy(VALUE self, VALUE other)
|
|
154
154
|
return Qnil;
|
155
155
|
}
|
156
156
|
|
157
|
-
dst->memory.address = (void *) (((uintptr_t) dst->data.storage + 0x7) & (uintptr_t) ~
|
157
|
+
dst->memory.address = (void *) (((uintptr_t) dst->data.storage + 0x7) & (uintptr_t) ~0x7ULL);
|
158
158
|
dst->memory.size = src->size;
|
159
159
|
dst->memory.typeSize = src->typeSize;
|
160
160
|
|
data/ext/ffi_c/Call.c
CHANGED
@@ -339,13 +339,7 @@ static void *
|
|
339
339
|
call_blocking_function(void* data)
|
340
340
|
{
|
341
341
|
rbffi_blocking_call_t* b = (rbffi_blocking_call_t *) data;
|
342
|
-
#ifndef HAVE_RUBY_THREAD_HAS_GVL_P
|
343
|
-
b->frame->has_gvl = false;
|
344
|
-
#endif
|
345
342
|
ffi_call(&b->cif, FFI_FN(b->function), b->retval, b->ffiValues);
|
346
|
-
#ifndef HAVE_RUBY_THREAD_HAS_GVL_P
|
347
|
-
b->frame->has_gvl = true;
|
348
|
-
#endif
|
349
343
|
|
350
344
|
return NULL;
|
351
345
|
}
|
@@ -353,7 +347,7 @@ call_blocking_function(void* data)
|
|
353
347
|
VALUE
|
354
348
|
rbffi_do_blocking_call(VALUE data)
|
355
349
|
{
|
356
|
-
rb_thread_call_without_gvl(call_blocking_function, (void*)data, (
|
350
|
+
rb_thread_call_without_gvl(call_blocking_function, (void*)data, (rb_unblock_function_t *) -1, NULL);
|
357
351
|
|
358
352
|
return Qnil;
|
359
353
|
}
|
data/ext/ffi_c/ClosurePool.c
CHANGED
@@ -70,9 +70,6 @@
|
|
70
70
|
#ifndef roundup
|
71
71
|
# define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
|
72
72
|
#endif
|
73
|
-
#ifdef _WIN32
|
74
|
-
typedef char* caddr_t;
|
75
|
-
#endif
|
76
73
|
|
77
74
|
typedef struct Memory {
|
78
75
|
void* code;
|
@@ -96,7 +93,7 @@ static bool freePage(void *);
|
|
96
93
|
static bool protectPage(void *);
|
97
94
|
|
98
95
|
ClosurePool*
|
99
|
-
rbffi_ClosurePool_New(int closureSize,
|
96
|
+
rbffi_ClosurePool_New(int closureSize,
|
100
97
|
bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize),
|
101
98
|
void* ctx)
|
102
99
|
{
|
@@ -107,7 +104,7 @@ rbffi_ClosurePool_New(int closureSize,
|
|
107
104
|
pool->ctx = ctx;
|
108
105
|
pool->prep = prep;
|
109
106
|
pool->refcnt = 1;
|
110
|
-
|
107
|
+
|
111
108
|
return pool;
|
112
109
|
}
|
113
110
|
|
@@ -115,7 +112,7 @@ void
|
|
115
112
|
cleanup_closure_pool(ClosurePool* pool)
|
116
113
|
{
|
117
114
|
Memory* memory;
|
118
|
-
|
115
|
+
|
119
116
|
for (memory = pool->blocks; memory != NULL; ) {
|
120
117
|
Memory* next = memory->next;
|
121
118
|
freePage(memory->code);
|
@@ -142,7 +139,7 @@ rbffi_Closure_Alloc(ClosurePool* pool)
|
|
142
139
|
{
|
143
140
|
Closure *list = NULL;
|
144
141
|
Memory* block = NULL;
|
145
|
-
|
142
|
+
void *code = NULL;
|
146
143
|
char errmsg[256];
|
147
144
|
int nclosures;
|
148
145
|
long trampolineSize;
|
@@ -152,7 +149,7 @@ rbffi_Closure_Alloc(ClosurePool* pool)
|
|
152
149
|
Closure* closure = pool->list;
|
153
150
|
pool->list = pool->list->next;
|
154
151
|
pool->refcnt++;
|
155
|
-
|
152
|
+
|
156
153
|
return closure;
|
157
154
|
}
|
158
155
|
|
@@ -161,17 +158,17 @@ rbffi_Closure_Alloc(ClosurePool* pool)
|
|
161
158
|
block = calloc(1, sizeof(*block));
|
162
159
|
list = calloc(nclosures, sizeof(*list));
|
163
160
|
code = allocatePage();
|
164
|
-
|
161
|
+
|
165
162
|
if (block == NULL || list == NULL || code == NULL) {
|
166
163
|
snprintf(errmsg, sizeof(errmsg), "failed to allocate a page. errno=%d (%s)", errno, strerror(errno));
|
167
164
|
goto error;
|
168
165
|
}
|
169
|
-
|
166
|
+
|
170
167
|
for (i = 0; i < nclosures; ++i) {
|
171
168
|
Closure* closure = &list[i];
|
172
169
|
closure->next = &list[i + 1];
|
173
170
|
closure->pool = pool;
|
174
|
-
closure->code = (code + (i * trampolineSize));
|
171
|
+
closure->code = ((char *)code + (i * trampolineSize));
|
175
172
|
|
176
173
|
if (!(*pool->prep)(pool->ctx, closure->code, closure, errmsg, sizeof(errmsg))) {
|
177
174
|
goto error;
|
@@ -202,7 +199,7 @@ error:
|
|
202
199
|
if (code != NULL) {
|
203
200
|
freePage(code);
|
204
201
|
}
|
205
|
-
|
202
|
+
|
206
203
|
|
207
204
|
rb_raise(rb_eRuntimeError, "%s", errmsg);
|
208
205
|
return NULL;
|
@@ -249,8 +246,8 @@ allocatePage(void)
|
|
249
246
|
#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__))
|
250
247
|
return VirtualAlloc(NULL, pageSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
|
251
248
|
#else
|
252
|
-
|
253
|
-
return (page != (
|
249
|
+
void *page = mmap(NULL, pageSize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
|
250
|
+
return (page != (void *) -1) ? page : NULL;
|
254
251
|
#endif
|
255
252
|
}
|
256
253
|
|