mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* fix for build on solaris 10.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32113 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ef38cb7a05
commit
685444569c
7 changed files with 45 additions and 32 deletions
|
|
@ -1,3 +1,7 @@
|
||||||
|
Thu Jun 16 09:12:38 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* fix for build on solaris 10.
|
||||||
|
|
||||||
Thu Jun 16 09:08:39 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Thu Jun 16 09:08:39 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* test/io/console/test_io_console.rb (TestIO_Console#test_sync):
|
* test/io/console/test_io_console.rb (TestIO_Console#test_sync):
|
||||||
|
|
|
||||||
5
cont.c
5
cont.c
|
|
@ -537,13 +537,14 @@ fiber_machine_stack_alloc(size_t size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
void *page;
|
||||||
STACK_GROW_DIR_DETECTION;
|
STACK_GROW_DIR_DETECTION;
|
||||||
ptr = (VALUE*)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
|
ptr = (VALUE*)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
|
||||||
if (ptr == (VALUE*)(SIGNED_VALUE)-1) {
|
if (ptr == (VALUE*)(SIGNED_VALUE)-1) {
|
||||||
rb_raise(rb_eFiberError, "can't alloc machine stack to fiber");
|
rb_raise(rb_eFiberError, "can't alloc machine stack to fiber");
|
||||||
}
|
}
|
||||||
if (mprotect(ptr + STACK_DIR_UPPER((size - RB_PAGE_SIZE) / sizeof(VALUE), 0),
|
page = ptr + STACK_DIR_UPPER((size - RB_PAGE_SIZE) / sizeof(VALUE), 0);
|
||||||
RB_PAGE_SIZE, PROT_READ | PROT_WRITE) < 0) {
|
if (mprotect(page, RB_PAGE_SIZE, PROT_READ | PROT_WRITE) < 0) {
|
||||||
rb_raise(rb_eFiberError, "mprotect failed");
|
rb_raise(rb_eFiberError, "mprotect failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,7 @@ NORETURN(void _longjmp(jmp_buf, int));
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_SELECT_LARGE_FDSET
|
#ifdef HAVE_SELECT_LARGE_FDSET
|
||||||
#define select(n, r, w, e, t) select_large_fdset((n), (r), (w), (e), (t))
|
#define select(n, r, w, e, t) select_large_fdset((n), (r), (w), (e), (t))
|
||||||
|
extern int select_large_fdset(int, fd_set *, fd_set *, fd_set *, struct timeval *);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SYS_PARAM_H
|
#ifdef HAVE_SYS_PARAM_H
|
||||||
|
|
|
||||||
3
file.c
3
file.c
|
|
@ -5007,7 +5007,8 @@ path_check_0(VALUE path, int execpath)
|
||||||
&& !(p && execpath && (st.st_mode & S_ISVTX))
|
&& !(p && execpath && (st.st_mode & S_ISVTX))
|
||||||
#endif
|
#endif
|
||||||
&& !access(p0, W_OK)) {
|
&& !access(p0, W_OK)) {
|
||||||
rb_warn("Insecure world writable dir %s in %sPATH, mode 0%o",
|
rb_warn("Insecure world writable dir %s in %sPATH, mode 0%"
|
||||||
|
PRI_MODET_PREFIX"o",
|
||||||
p0, (execpath ? "" : "LOAD_"), st.st_mode);
|
p0, (execpath ? "" : "LOAD_"), st.st_mode);
|
||||||
if (p) *p = '/';
|
if (p) *p = '/';
|
||||||
RB_GC_GUARD(path);
|
RB_GC_GUARD(path);
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,9 @@ RUBY_EXTERN const unsigned char rb_nan[];
|
||||||
#ifndef isinf
|
#ifndef isinf
|
||||||
# ifndef HAVE_ISINF
|
# ifndef HAVE_ISINF
|
||||||
# if defined(HAVE_FINITE) && defined(HAVE_ISNAN)
|
# if defined(HAVE_FINITE) && defined(HAVE_ISNAN)
|
||||||
|
# ifdef HAVE_IEEEFP_H
|
||||||
|
# include <ieeefp.h>
|
||||||
|
# endif
|
||||||
# define isinf(x) (!finite(x) && !isnan(x))
|
# define isinf(x) (!finite(x) && !isnan(x))
|
||||||
# else
|
# else
|
||||||
RUBY_EXTERN int isinf(double);
|
RUBY_EXTERN int isinf(double);
|
||||||
|
|
|
||||||
58
thread.c
58
thread.c
|
|
@ -330,10 +330,10 @@ typedef struct rb_mutex_struct
|
||||||
struct rb_thread_struct volatile *th;
|
struct rb_thread_struct volatile *th;
|
||||||
int cond_waiting;
|
int cond_waiting;
|
||||||
struct rb_mutex_struct *next_mutex;
|
struct rb_mutex_struct *next_mutex;
|
||||||
} mutex_t;
|
} rb_mutex_t;
|
||||||
|
|
||||||
static void rb_mutex_unlock_all(mutex_t *mutex, rb_thread_t *th);
|
static void rb_mutex_unlock_all(rb_mutex_t *mutex, rb_thread_t *th);
|
||||||
static void rb_mutex_abandon_all(mutex_t *mutexes);
|
static void rb_mutex_abandon_all(rb_mutex_t *mutexes);
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_thread_terminate_all(void)
|
rb_thread_terminate_all(void)
|
||||||
|
|
@ -3322,9 +3322,9 @@ thgroup_add(VALUE group, VALUE thread)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define GetMutexPtr(obj, tobj) \
|
#define GetMutexPtr(obj, tobj) \
|
||||||
TypedData_Get_Struct((obj), mutex_t, &mutex_data_type, (tobj))
|
TypedData_Get_Struct((obj), rb_mutex_t, &mutex_data_type, (tobj))
|
||||||
|
|
||||||
static const char *mutex_unlock(mutex_t *mutex, rb_thread_t volatile *th);
|
static const char *rb_mutex_unlock_th(rb_mutex_t *mutex, rb_thread_t volatile *th);
|
||||||
|
|
||||||
#define mutex_mark NULL
|
#define mutex_mark NULL
|
||||||
|
|
||||||
|
|
@ -3332,10 +3332,10 @@ static void
|
||||||
mutex_free(void *ptr)
|
mutex_free(void *ptr)
|
||||||
{
|
{
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
mutex_t *mutex = ptr;
|
rb_mutex_t *mutex = ptr;
|
||||||
if (mutex->th) {
|
if (mutex->th) {
|
||||||
/* rb_warn("free locked mutex"); */
|
/* rb_warn("free locked mutex"); */
|
||||||
const char *err = mutex_unlock(mutex, mutex->th);
|
const char *err = rb_mutex_unlock_th(mutex, mutex->th);
|
||||||
if (err) rb_bug("%s", err);
|
if (err) rb_bug("%s", err);
|
||||||
}
|
}
|
||||||
native_mutex_destroy(&mutex->lock);
|
native_mutex_destroy(&mutex->lock);
|
||||||
|
|
@ -3347,7 +3347,7 @@ mutex_free(void *ptr)
|
||||||
static size_t
|
static size_t
|
||||||
mutex_memsize(const void *ptr)
|
mutex_memsize(const void *ptr)
|
||||||
{
|
{
|
||||||
return ptr ? sizeof(mutex_t) : 0;
|
return ptr ? sizeof(rb_mutex_t) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const rb_data_type_t mutex_data_type = {
|
static const rb_data_type_t mutex_data_type = {
|
||||||
|
|
@ -3370,9 +3370,9 @@ static VALUE
|
||||||
mutex_alloc(VALUE klass)
|
mutex_alloc(VALUE klass)
|
||||||
{
|
{
|
||||||
VALUE volatile obj;
|
VALUE volatile obj;
|
||||||
mutex_t *mutex;
|
rb_mutex_t *mutex;
|
||||||
|
|
||||||
obj = TypedData_Make_Struct(klass, mutex_t, &mutex_data_type, mutex);
|
obj = TypedData_Make_Struct(klass, rb_mutex_t, &mutex_data_type, mutex);
|
||||||
native_mutex_initialize(&mutex->lock);
|
native_mutex_initialize(&mutex->lock);
|
||||||
native_cond_initialize(&mutex->cond, RB_CONDATTR_CLOCK_MONOTONIC);
|
native_cond_initialize(&mutex->cond, RB_CONDATTR_CLOCK_MONOTONIC);
|
||||||
return obj;
|
return obj;
|
||||||
|
|
@ -3405,7 +3405,7 @@ rb_mutex_new(void)
|
||||||
VALUE
|
VALUE
|
||||||
rb_mutex_locked_p(VALUE self)
|
rb_mutex_locked_p(VALUE self)
|
||||||
{
|
{
|
||||||
mutex_t *mutex;
|
rb_mutex_t *mutex;
|
||||||
GetMutexPtr(self, mutex);
|
GetMutexPtr(self, mutex);
|
||||||
return mutex->th ? Qtrue : Qfalse;
|
return mutex->th ? Qtrue : Qfalse;
|
||||||
}
|
}
|
||||||
|
|
@ -3413,7 +3413,7 @@ rb_mutex_locked_p(VALUE self)
|
||||||
static void
|
static void
|
||||||
mutex_locked(rb_thread_t *th, VALUE self)
|
mutex_locked(rb_thread_t *th, VALUE self)
|
||||||
{
|
{
|
||||||
mutex_t *mutex;
|
rb_mutex_t *mutex;
|
||||||
GetMutexPtr(self, mutex);
|
GetMutexPtr(self, mutex);
|
||||||
|
|
||||||
if (th->keeping_mutexes) {
|
if (th->keeping_mutexes) {
|
||||||
|
|
@ -3432,7 +3432,7 @@ mutex_locked(rb_thread_t *th, VALUE self)
|
||||||
VALUE
|
VALUE
|
||||||
rb_mutex_trylock(VALUE self)
|
rb_mutex_trylock(VALUE self)
|
||||||
{
|
{
|
||||||
mutex_t *mutex;
|
rb_mutex_t *mutex;
|
||||||
VALUE locked = Qfalse;
|
VALUE locked = Qfalse;
|
||||||
GetMutexPtr(self, mutex);
|
GetMutexPtr(self, mutex);
|
||||||
|
|
||||||
|
|
@ -3449,7 +3449,7 @@ rb_mutex_trylock(VALUE self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
lock_func(rb_thread_t *th, mutex_t *mutex, int timeout_ms)
|
lock_func(rb_thread_t *th, rb_mutex_t *mutex, int timeout_ms)
|
||||||
{
|
{
|
||||||
int interrupted = 0;
|
int interrupted = 0;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
@ -3491,7 +3491,7 @@ lock_func(rb_thread_t *th, mutex_t *mutex, int timeout_ms)
|
||||||
static void
|
static void
|
||||||
lock_interrupt(void *ptr)
|
lock_interrupt(void *ptr)
|
||||||
{
|
{
|
||||||
mutex_t *mutex = (mutex_t *)ptr;
|
rb_mutex_t *mutex = (rb_mutex_t *)ptr;
|
||||||
native_mutex_lock(&mutex->lock);
|
native_mutex_lock(&mutex->lock);
|
||||||
if (mutex->cond_waiting > 0)
|
if (mutex->cond_waiting > 0)
|
||||||
native_cond_broadcast(&mutex->cond);
|
native_cond_broadcast(&mutex->cond);
|
||||||
|
|
@ -3510,7 +3510,7 @@ rb_mutex_lock(VALUE self)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (rb_mutex_trylock(self) == Qfalse) {
|
if (rb_mutex_trylock(self) == Qfalse) {
|
||||||
mutex_t *mutex;
|
rb_mutex_t *mutex;
|
||||||
rb_thread_t *th = GET_THREAD();
|
rb_thread_t *th = GET_THREAD();
|
||||||
GetMutexPtr(self, mutex);
|
GetMutexPtr(self, mutex);
|
||||||
|
|
||||||
|
|
@ -3565,10 +3565,10 @@ rb_mutex_lock(VALUE self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
mutex_unlock(mutex_t *mutex, rb_thread_t volatile *th)
|
rb_mutex_unlock_th(rb_mutex_t *mutex, rb_thread_t volatile *th)
|
||||||
{
|
{
|
||||||
const char *err = NULL;
|
const char *err = NULL;
|
||||||
mutex_t *th_mutex;
|
rb_mutex_t *th_mutex;
|
||||||
|
|
||||||
native_mutex_lock(&mutex->lock);
|
native_mutex_lock(&mutex->lock);
|
||||||
|
|
||||||
|
|
@ -3593,7 +3593,7 @@ mutex_unlock(mutex_t *mutex, rb_thread_t volatile *th)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
while (1) {
|
while (1) {
|
||||||
mutex_t *tmp_mutex;
|
rb_mutex_t *tmp_mutex;
|
||||||
tmp_mutex = th_mutex->next_mutex;
|
tmp_mutex = th_mutex->next_mutex;
|
||||||
if (tmp_mutex == mutex) {
|
if (tmp_mutex == mutex) {
|
||||||
th_mutex->next_mutex = tmp_mutex->next_mutex;
|
th_mutex->next_mutex = tmp_mutex->next_mutex;
|
||||||
|
|
@ -3619,35 +3619,35 @@ VALUE
|
||||||
rb_mutex_unlock(VALUE self)
|
rb_mutex_unlock(VALUE self)
|
||||||
{
|
{
|
||||||
const char *err;
|
const char *err;
|
||||||
mutex_t *mutex;
|
rb_mutex_t *mutex;
|
||||||
GetMutexPtr(self, mutex);
|
GetMutexPtr(self, mutex);
|
||||||
|
|
||||||
err = mutex_unlock(mutex, GET_THREAD());
|
err = rb_mutex_unlock_th(mutex, GET_THREAD());
|
||||||
if (err) rb_raise(rb_eThreadError, "%s", err);
|
if (err) rb_raise(rb_eThreadError, "%s", err);
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_mutex_unlock_all(mutex_t *mutexes, rb_thread_t *th)
|
rb_mutex_unlock_all(rb_mutex_t *mutexes, rb_thread_t *th)
|
||||||
{
|
{
|
||||||
const char *err;
|
const char *err;
|
||||||
mutex_t *mutex;
|
rb_mutex_t *mutex;
|
||||||
|
|
||||||
while (mutexes) {
|
while (mutexes) {
|
||||||
mutex = mutexes;
|
mutex = mutexes;
|
||||||
/* rb_warn("mutex #<%p> remains to be locked by terminated thread",
|
/* rb_warn("mutex #<%p> remains to be locked by terminated thread",
|
||||||
mutexes); */
|
mutexes); */
|
||||||
mutexes = mutex->next_mutex;
|
mutexes = mutex->next_mutex;
|
||||||
err = mutex_unlock(mutex, th);
|
err = rb_mutex_unlock_th(mutex, th);
|
||||||
if (err) rb_bug("invalid keeping_mutexes: %s", err);
|
if (err) rb_bug("invalid keeping_mutexes: %s", err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_mutex_abandon_all(mutex_t *mutexes)
|
rb_mutex_abandon_all(rb_mutex_t *mutexes)
|
||||||
{
|
{
|
||||||
mutex_t *mutex;
|
rb_mutex_t *mutex;
|
||||||
|
|
||||||
while (mutexes) {
|
while (mutexes) {
|
||||||
mutex = mutexes;
|
mutex = mutexes;
|
||||||
|
|
@ -3759,7 +3759,7 @@ VALUE
|
||||||
rb_barrier_wait(VALUE self)
|
rb_barrier_wait(VALUE self)
|
||||||
{
|
{
|
||||||
VALUE mutex = GetBarrierPtr(self);
|
VALUE mutex = GetBarrierPtr(self);
|
||||||
mutex_t *m;
|
rb_mutex_t *m;
|
||||||
|
|
||||||
if (!mutex) return Qfalse;
|
if (!mutex) return Qfalse;
|
||||||
GetMutexPtr(mutex, m);
|
GetMutexPtr(mutex, m);
|
||||||
|
|
@ -4721,7 +4721,7 @@ check_deadlock_i(st_data_t key, st_data_t val, int *found)
|
||||||
*found = 1;
|
*found = 1;
|
||||||
}
|
}
|
||||||
else if (th->locking_mutex) {
|
else if (th->locking_mutex) {
|
||||||
mutex_t *mutex;
|
rb_mutex_t *mutex;
|
||||||
GetMutexPtr(th->locking_mutex, mutex);
|
GetMutexPtr(th->locking_mutex, mutex);
|
||||||
|
|
||||||
native_mutex_lock(&mutex->lock);
|
native_mutex_lock(&mutex->lock);
|
||||||
|
|
@ -4744,7 +4744,7 @@ debug_i(st_data_t key, st_data_t val, int *found)
|
||||||
|
|
||||||
printf("th:%p %d %d", th, th->status, th->interrupt_flag);
|
printf("th:%p %d %d", th, th->status, th->interrupt_flag);
|
||||||
if (th->locking_mutex) {
|
if (th->locking_mutex) {
|
||||||
mutex_t *mutex;
|
rb_mutex_t *mutex;
|
||||||
GetMutexPtr(th->locking_mutex, mutex);
|
GetMutexPtr(th->locking_mutex, mutex);
|
||||||
|
|
||||||
native_mutex_lock(&mutex->lock);
|
native_mutex_lock(&mutex->lock);
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,9 @@
|
||||||
#ifdef HAVE_SYS_RESOURCE_H
|
#ifdef HAVE_SYS_RESOURCE_H
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_THR_STKSEGMENT
|
||||||
|
#include <thread.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
static void native_mutex_lock(pthread_mutex_t *lock);
|
static void native_mutex_lock(pthread_mutex_t *lock);
|
||||||
static void native_mutex_unlock(pthread_mutex_t *lock);
|
static void native_mutex_unlock(pthread_mutex_t *lock);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue