mwrap 2.2.0.1.g867b → 2.3.0
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/MANIFEST +3 -0
- data/README +1 -1
- data/VERSION-GEN +36 -0
- data/bin/mwrap +19 -0
- data/ext/mwrap/extconf.rb +4 -4
- data/ext/mwrap/mwrap.c +53 -40
- data/lib/mwrap/.gitignore +1 -0
- data/lib/mwrap/version.rb +1 -0
- data/mwrap.gemspec +6 -3
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b967676ac9ff95d0771147fc464a06ce6a88c9a7e07c3eef97b0cf0a273ff822
|
4
|
+
data.tar.gz: f99e5f3a27adecf190e11a921a58f46c9514e28a88d83602c2421dbd8cecc90b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f3a089d3bf14258b0382d13f8d4428ffd0291d6e9af8fa33331696e5b55e5a279f0dafc30fb1018e73a199d9d3b8cbe826dd814dfd80941ae059581fa6f330c
|
7
|
+
data.tar.gz: 54a2bc06918d050e161ff0c9457ca67ebc3573a5795495d5ab57637d0bb37830e442f3073cede28d672938baaba7e7057b9d0fa8f40c64b85864add6e81e53d0
|
data/MANIFEST
CHANGED
data/README
CHANGED
@@ -23,7 +23,7 @@ It does not require recompiling or rebuilding Ruby, but only
|
|
23
23
|
supports Ruby trunk (2.6.0dev+) on a few platforms:
|
24
24
|
|
25
25
|
* GNU/Linux
|
26
|
-
* FreeBSD (tested 11.1)
|
26
|
+
* FreeBSD (tested 11.1 on Ruby 2.6, currently broken with Ruby 3.x)
|
27
27
|
|
28
28
|
It may work on NetBSD, OpenBSD and DragonFly BSD.
|
29
29
|
|
data/VERSION-GEN
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
VF=lib/mwrap/version.rb
|
3
|
+
DEF_VER=v2.3.0
|
4
|
+
VN=$(git describe HEAD 2>/dev/null)
|
5
|
+
if test $? -eq 0
|
6
|
+
then
|
7
|
+
case "$VN" in
|
8
|
+
v[0-9]*)
|
9
|
+
set -e
|
10
|
+
git update-index -q --refresh
|
11
|
+
set +e
|
12
|
+
git diff-index --quiet HEAD -- || VN="$VN-dirty"
|
13
|
+
set -e
|
14
|
+
VN=$(echo $VN | tr '-' '.')
|
15
|
+
;;
|
16
|
+
esac
|
17
|
+
fi
|
18
|
+
set -e
|
19
|
+
|
20
|
+
case $VN in
|
21
|
+
'') VN="$DEF_VER" ;;
|
22
|
+
esac
|
23
|
+
|
24
|
+
VN=$(expr "$VN" : v*'\(.*\)')
|
25
|
+
VC=unset
|
26
|
+
if test -r $VF
|
27
|
+
then
|
28
|
+
VC="$(cat $VF)"
|
29
|
+
fi
|
30
|
+
|
31
|
+
new="module Mwrap; VERSION = '$VN'.freeze; end"
|
32
|
+
if test x"$new" != x"$VC"
|
33
|
+
then
|
34
|
+
echo "$new" >$VF
|
35
|
+
fi
|
36
|
+
echo $VN
|
data/bin/mwrap
CHANGED
@@ -2,6 +2,25 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
# Copyright (C) mwrap hackers <mwrap-public@80x24.org>
|
4
4
|
# License: GPL-2.0+ <https://www.gnu.org/licenses/gpl-2.0.txt>
|
5
|
+
help = <<EOM
|
6
|
+
usage: mwrap COMMAND [ARGS]
|
7
|
+
see https://80x24.org/mwrap/README.html for more info
|
8
|
+
EOM
|
9
|
+
ARGV.empty? and abort help
|
10
|
+
ARGV.each do |x|
|
11
|
+
case x
|
12
|
+
when '--version', '-v'
|
13
|
+
require 'mwrap/version'
|
14
|
+
puts "mwrap #{Mwrap::VERSION} - #{RUBY_DESCRIPTION}"
|
15
|
+
exit 0
|
16
|
+
when '--help', '-h'
|
17
|
+
puts help
|
18
|
+
exit 0
|
19
|
+
else # don't intercept --version/--help intended for commands we wrap
|
20
|
+
break
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
5
24
|
require 'mwrap'
|
6
25
|
mwrap_so = $".grep(%r{/mwrap\.so\z})[0] or abort "mwrap.so not loaded"
|
7
26
|
cur = ENV['LD_PRELOAD']
|
data/ext/mwrap/extconf.rb
CHANGED
@@ -11,15 +11,15 @@ have_library 'dl'
|
|
11
11
|
have_library 'c'
|
12
12
|
have_library 'execinfo' # FreeBSD
|
13
13
|
|
14
|
-
if try_link(<<
|
14
|
+
if try_link(<<EOC)
|
15
15
|
int main(void) { return __builtin_add_overflow_p(0,0,(int)1); }
|
16
|
-
|
16
|
+
EOC
|
17
17
|
$defs << '-DHAVE_BUILTIN_ADD_OVERFLOW_P'
|
18
18
|
end
|
19
19
|
|
20
|
-
if try_link(<<
|
20
|
+
if try_link(<<EOC)
|
21
21
|
int main(int a) { return __builtin_add_overflow(0,0,&a); }
|
22
|
-
|
22
|
+
EOC
|
23
23
|
$defs << '-DHAVE_BUILTIN_ADD_OVERFLOW_P'
|
24
24
|
else
|
25
25
|
abort 'missing __builtin_add_overflow'
|
data/ext/mwrap/mwrap.c
CHANGED
@@ -99,9 +99,43 @@ union padded_mutex {
|
|
99
99
|
/* a round-robin pool of mutexes */
|
100
100
|
#define MUTEX_NR (1 << 6)
|
101
101
|
#define MUTEX_MASK (MUTEX_NR - 1)
|
102
|
+
#ifdef __FreeBSD__
|
103
|
+
# define STATIC_MTX_INIT_OK (0)
|
104
|
+
#else /* only tested on Linux + glibc */
|
105
|
+
# define STATIC_MTX_INIT_OK (1)
|
106
|
+
#endif
|
102
107
|
static size_t mutex_i;
|
103
108
|
static union padded_mutex mutexes[MUTEX_NR] = {
|
109
|
+
#if STATIC_MTX_INIT_OK
|
104
110
|
[0 ... (MUTEX_NR-1)].mtx = PTHREAD_MUTEX_INITIALIZER
|
111
|
+
#endif
|
112
|
+
};
|
113
|
+
|
114
|
+
#define ACC_INIT(name) { .nr=0, .min=INT64_MAX, .max=-1, .m2=0, .mean=0 }
|
115
|
+
struct acc {
|
116
|
+
uint64_t nr;
|
117
|
+
int64_t min;
|
118
|
+
int64_t max;
|
119
|
+
double m2;
|
120
|
+
double mean;
|
121
|
+
};
|
122
|
+
|
123
|
+
/* for tracking 16K-aligned heap page bodies (protected by GVL) */
|
124
|
+
struct {
|
125
|
+
pthread_mutex_t lock;
|
126
|
+
struct cds_list_head bodies;
|
127
|
+
struct cds_list_head freed;
|
128
|
+
|
129
|
+
struct acc alive;
|
130
|
+
struct acc reborn;
|
131
|
+
} hpb_stats = {
|
132
|
+
#if STATIC_MTX_INIT_OK
|
133
|
+
.lock = PTHREAD_MUTEX_INITIALIZER,
|
134
|
+
#endif
|
135
|
+
.bodies = CDS_LIST_HEAD_INIT(hpb_stats.bodies),
|
136
|
+
.freed = CDS_LIST_HEAD_INIT(hpb_stats.freed),
|
137
|
+
.alive = ACC_INIT(hpb_stats.alive),
|
138
|
+
.reborn = ACC_INIT(hpb_stats.reborn)
|
105
139
|
};
|
106
140
|
|
107
141
|
static pthread_mutex_t *mutex_assign(void)
|
@@ -120,12 +154,11 @@ __attribute__((constructor)) static void resolve_malloc(void)
|
|
120
154
|
int err;
|
121
155
|
++locating;
|
122
156
|
|
123
|
-
#ifdef __FreeBSD__
|
124
157
|
/*
|
125
158
|
* PTHREAD_MUTEX_INITIALIZER on FreeBSD means lazy initialization,
|
126
159
|
* which happens at pthread_mutex_lock, and that calls calloc
|
127
160
|
*/
|
128
|
-
{
|
161
|
+
if (!STATIC_MTX_INIT_OK) {
|
129
162
|
size_t i;
|
130
163
|
|
131
164
|
for (i = 0; i < MUTEX_NR; i++) {
|
@@ -135,22 +168,28 @@ __attribute__((constructor)) static void resolve_malloc(void)
|
|
135
168
|
_exit(1);
|
136
169
|
}
|
137
170
|
}
|
171
|
+
err = pthread_mutex_init(&hpb_stats.lock, 0);
|
172
|
+
if (err) {
|
173
|
+
fprintf(stderr, "error: %s\n", strerror(err));
|
174
|
+
_exit(1);
|
175
|
+
}
|
138
176
|
/* initialize mutexes used by urcu-bp */
|
139
177
|
rcu_read_lock();
|
140
178
|
rcu_read_unlock();
|
179
|
+
#ifndef __FreeBSD__
|
180
|
+
} else {
|
181
|
+
if (!real_malloc) {
|
182
|
+
resolving_malloc = 1;
|
183
|
+
real_malloc = dlsym(RTLD_NEXT, "malloc");
|
184
|
+
}
|
185
|
+
real_free = dlsym(RTLD_NEXT, "free");
|
186
|
+
if (!real_malloc || !real_free) {
|
187
|
+
fprintf(stderr, "missing malloc/aligned_alloc/free\n"
|
188
|
+
"\t%p %p\n", real_malloc, real_free);
|
189
|
+
_exit(1);
|
190
|
+
}
|
191
|
+
#endif /* !__FreeBSD__ */
|
141
192
|
}
|
142
|
-
#else /* !FreeBSD (tested on GNU/Linux) */
|
143
|
-
if (!real_malloc) {
|
144
|
-
resolving_malloc = 1;
|
145
|
-
real_malloc = dlsym(RTLD_NEXT, "malloc");
|
146
|
-
}
|
147
|
-
real_free = dlsym(RTLD_NEXT, "free");
|
148
|
-
if (!real_malloc || !real_free) {
|
149
|
-
fprintf(stderr, "missing malloc/aligned_alloc/free\n"
|
150
|
-
"\t%p %p\n", real_malloc, real_free);
|
151
|
-
_exit(1);
|
152
|
-
}
|
153
|
-
#endif /* !FreeBSD */
|
154
193
|
CMM_STORE_SHARED(totals, lfht_new());
|
155
194
|
if (!CMM_LOAD_SHARED(totals))
|
156
195
|
fprintf(stderr, "failed to allocate totals table\n");
|
@@ -237,32 +276,6 @@ static int has_ec_p(void)
|
|
237
276
|
ruby_current_vm_ptr && ruby_current_ec;
|
238
277
|
}
|
239
278
|
|
240
|
-
struct acc {
|
241
|
-
uint64_t nr;
|
242
|
-
int64_t min;
|
243
|
-
int64_t max;
|
244
|
-
double m2;
|
245
|
-
double mean;
|
246
|
-
};
|
247
|
-
|
248
|
-
#define ACC_INIT(name) { .nr=0, .min=INT64_MAX, .max=-1, .m2=0, .mean=0 }
|
249
|
-
|
250
|
-
/* for tracking 16K-aligned heap page bodies (protected by GVL) */
|
251
|
-
struct {
|
252
|
-
pthread_mutex_t lock;
|
253
|
-
struct cds_list_head bodies;
|
254
|
-
struct cds_list_head freed;
|
255
|
-
|
256
|
-
struct acc alive;
|
257
|
-
struct acc reborn;
|
258
|
-
} hpb_stats = {
|
259
|
-
.lock = PTHREAD_MUTEX_INITIALIZER,
|
260
|
-
.bodies = CDS_LIST_HEAD_INIT(hpb_stats.bodies),
|
261
|
-
.freed = CDS_LIST_HEAD_INIT(hpb_stats.freed),
|
262
|
-
.alive = ACC_INIT(hpb_stats.alive),
|
263
|
-
.reborn = ACC_INIT(hpb_stats.reborn)
|
264
|
-
};
|
265
|
-
|
266
279
|
/* allocated via real_malloc/real_free */
|
267
280
|
struct src_loc {
|
268
281
|
pthread_mutex_t *mtx;
|
@@ -0,0 +1 @@
|
|
1
|
+
version.rb
|
@@ -0,0 +1 @@
|
|
1
|
+
module Mwrap; VERSION = '2.3.0'.freeze; end
|
data/mwrap.gemspec
CHANGED
@@ -1,18 +1,21 @@
|
|
1
1
|
git_manifest = `git ls-files 2>/dev/null`.split("\n")
|
2
|
+
git_ok = $?.success?
|
3
|
+
git_manifest << 'lib/mwrap/version.rb'.freeze # generated by ./VERSION-GEN
|
2
4
|
manifest = File.exist?('MANIFEST') ?
|
3
5
|
File.readlines('MANIFEST').map!(&:chomp).delete_if(&:empty?) : git_manifest
|
4
|
-
if
|
6
|
+
if git_ok && manifest != git_manifest
|
5
7
|
tmp = "MANIFEST.#$$.tmp"
|
6
8
|
File.open(tmp, 'w') { |fp| fp.puts(git_manifest.join("\n")) }
|
7
9
|
File.rename(tmp, 'MANIFEST')
|
8
10
|
system('git add MANIFEST')
|
9
11
|
end
|
10
12
|
|
11
|
-
|
13
|
+
version = `./VERSION-GEN`.chomp
|
14
|
+
$?.success? or abort './VERSION-GEN failed'
|
12
15
|
|
13
16
|
Gem::Specification.new do |s|
|
14
17
|
s.name = 'mwrap'
|
15
|
-
s.version =
|
18
|
+
s.version = version
|
16
19
|
s.homepage = 'https://80x24.org/mwrap/'
|
17
20
|
s.authors = ["mwrap hackers"]
|
18
21
|
s.summary = 'LD_PRELOAD malloc wrapper for Ruby'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mwrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mwrap hackers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-unit
|
@@ -55,10 +55,13 @@ files:
|
|
55
55
|
- MANIFEST
|
56
56
|
- README
|
57
57
|
- Rakefile
|
58
|
+
- VERSION-GEN
|
58
59
|
- bin/mwrap
|
59
60
|
- ext/mwrap/extconf.rb
|
60
61
|
- ext/mwrap/jhash.h
|
61
62
|
- ext/mwrap/mwrap.c
|
63
|
+
- lib/mwrap/.gitignore
|
64
|
+
- lib/mwrap/version.rb
|
62
65
|
- lib/mwrap_rack.rb
|
63
66
|
- mwrap.gemspec
|
64
67
|
- test/test_mwrap.rb
|
@@ -77,9 +80,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
77
80
|
version: '0'
|
78
81
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
82
|
requirements:
|
80
|
-
- - "
|
83
|
+
- - ">="
|
81
84
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
85
|
+
version: '0'
|
83
86
|
requirements: []
|
84
87
|
rubygems_version: 3.0.2
|
85
88
|
signing_key:
|