Feature #13951 ยป 0001-File-rename-releases-GVL.patch
benchmark/bm_file_rename.rb | ||
---|---|---|
# rename file
|
||
require 'tempfile'
|
||
max = 100_000
|
||
tmp = [ Tempfile.new('rename-a'), Tempfile.new('rename-b') ]
|
||
a, b = tmp.map { |x| x.path }
|
||
max.times do
|
||
File.rename(a, b)
|
||
File.rename(b, a)
|
||
end
|
||
tmp.each { |t| t.close! }
|
file.c | ||
---|---|---|
return apply2files(unlink_internal, argc, argv, 0);
|
||
}
|
||
struct rename_args {
|
||
const char *src;
|
||
const char *dst;
|
||
};
|
||
static void *
|
||
no_gvl_rename(void *ptr)
|
||
{
|
||
struct rename_args *ra = ptr;
|
||
return (void *)rename(ra->src, ra->dst);
|
||
}
|
||
/*
|
||
* call-seq:
|
||
* File.rename(old_name, new_name) -> 0
|
||
... | ... | |
static VALUE
|
||
rb_file_s_rename(VALUE klass, VALUE from, VALUE to)
|
||
{
|
||
const char *src, *dst;
|
||
struct rename_args ra;
|
||
VALUE f, t;
|
||
FilePathValue(from);
|
||
FilePathValue(to);
|
||
f = rb_str_encode_ospath(from);
|
||
t = rb_str_encode_ospath(to);
|
||
src = StringValueCStr(f);
|
||
dst = StringValueCStr(t);
|
||
ra.src = StringValueCStr(f);
|
||
ra.dst = StringValueCStr(t);
|
||
#if defined __CYGWIN__
|
||
errno = 0;
|
||
#endif
|
||
if (rename(src, dst) < 0) {
|
||
if ((int)rb_thread_call_without_gvl(no_gvl_rename, &ra,
|
||
RUBY_UBF_IO, 0) < 0) {
|
||
int e = errno;
|
||
#if defined DOSISH
|
||
switch (e) {
|
||
-
|