Bug #13941 » 0001-Release-gvl-while-doing-f-stat.patch
file.c | ||
---|---|---|
#include "internal.h"
|
||
#include "ruby/io.h"
|
||
#include "ruby/util.h"
|
||
#include "ruby/thread.h"
|
||
#include "dln.h"
|
||
#include "encindex.h"
|
||
... | ... | |
return str;
|
||
}
|
||
typedef struct no_gvl_fstat_data {
|
||
int fd;
|
||
struct stat * st;
|
||
int result;
|
||
} no_gvl_fstat_data;
|
||
static void * no_gvl_fstat(void * data)
|
||
{
|
||
((no_gvl_fstat_data *) data)->result = fstat(
|
||
((no_gvl_fstat_data *) data)->fd,
|
||
((no_gvl_fstat_data *) data)->st
|
||
);
|
||
return NULL;
|
||
}
|
||
typedef struct no_gvl_stat_data {
|
||
const char * path;
|
||
struct stat * st;
|
||
int result;
|
||
} no_gvl_stat_data;
|
||
static void * no_gvl_stat(void * data)
|
||
{
|
||
((no_gvl_stat_data *) data)->result = STAT(
|
||
((no_gvl_stat_data *) data)->path,
|
||
((no_gvl_stat_data *) data)->st
|
||
);
|
||
return NULL;
|
||
}
|
||
static int
|
||
rb_stat(VALUE file, struct stat *st)
|
||
{
|
||
VALUE tmp;
|
||
no_gvl_fstat_data fstat_data;
|
||
no_gvl_stat_data stat_data;
|
||
tmp = rb_check_convert_type_with_id(file, T_FILE, "IO", idTo_io);
|
||
if (!NIL_P(tmp)) {
|
||
rb_io_t *fptr;
|
||
GetOpenFile(tmp, fptr);
|
||
return fstat(fptr->fd, st);
|
||
fstat_data.fd = fptr->fd;
|
||
fstat_data.st = st;
|
||
rb_thread_call_without_gvl(
|
||
no_gvl_fstat,
|
||
(void *) &fstat_data,
|
||
RUBY_UBF_IO,
|
||
NULL
|
||
);
|
||
return fstat_data.result;
|
||
}
|
||
FilePathValue(file);
|
||
file = rb_str_encode_ospath(file);
|
||
return STAT(StringValueCStr(file), st);
|
||
stat_data.path = StringValueCStr(file);
|
||
stat_data.st = st;
|
||
rb_thread_call_without_gvl(
|
||
no_gvl_stat,
|
||
(void *) &stat_data,
|
||
RUBY_UBF_IO,
|
||
NULL
|
||
);
|
||
return stat_data.result;
|
||
}
|
||
#ifdef _WIN32
|
||
... | ... | |
rb_define_method(rb_cStat, "setgid?", rb_stat_sgid, 0);
|
||
rb_define_method(rb_cStat, "sticky?", rb_stat_sticky, 0);
|
||
}
|
||
/* vim: set ts=8 sw=4 noexpandtab: */
|