aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--NEWS4
-rw-r--r--configure.in46
-rw-r--r--dln.c6
-rw-r--r--ext/socket/rubysocket.h2
-rw-r--r--file.c4
-rw-r--r--include/ruby/defines.h2
-rw-r--r--io.c4
-rw-r--r--signal.c12
-rw-r--r--thread_pthread.c12
10 files changed, 72 insertions, 31 deletions
diff --git a/ChangeLog b/ChangeLog
index fb50e406b8..6fc59b970a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+Mon Nov 23 12:54:39 2015 Hamish Morrison <hamishm53@gmail.com>
+
+ * configure.in: remove obsolete workarounds for Haiku.
+
+ * dln.c, file.c, io.c: remove obsolete Haiku workarounds.
+
+ * thread_pthread.c: add stack bounds detection for Haiku.
+
+ * signal.c: get stack pointer from signal context on Haiku.
+ [ruby-core:67923] [Bug #10811] [Fix GH-1109]
+
Mon Nov 23 11:44:11 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
* gems/bundled_gems: bump version to minitest-5.8.3
diff --git a/NEWS b/NEWS
index c12ecdee7e..b2f6c44d2a 100644
--- a/NEWS
+++ b/NEWS
@@ -239,5 +239,9 @@ with all sufficient information, see the ChangeLog file.
=== Build system updates
=== Implementation changes
+
* OS/2 is no longer supported
+
* Borland-C is no longer supported
+
+* Haiku now stable and best effort
diff --git a/configure.in b/configure.in
index d871904f59..15520b26e7 100644
--- a/configure.in
+++ b/configure.in
@@ -871,7 +871,7 @@ if test "$GCC" = yes; then
# -fstack-protector
AS_CASE(["$target_os"],
- [mingw*|nacl|haiku], [
+ [mingw*|nacl], [
stack_protector=no
])
if test -z "${stack_protector+set}"; then
@@ -896,11 +896,6 @@ if test "$GCC" = yes; then
[cygwin*|darwin*|netbsd*|nacl], [
# need lgamma_r(), finite()
],
- [haiku], [
- # Haiku R1/alpha3 uses gcc-4.4.4 which can not handle anonymous union
- # with ANSI standard flags. Anonumous union is required to compile
- # socket extension where <net/if.h> uses anonymous union.
- ],
[
# ANSI (no XCFLAGS because this is C only)
for ansi_options in -std=iso9899:1999 "-ansi -std=iso9899:199409"; do
@@ -1137,14 +1132,15 @@ main()
fi
fi
],
-[beos*|haiku*], [
+[beos*], [
ac_cv_func_link=no
ac_cv_func_sched_yield=no
ac_cv_func_pthread_attr_setinheritsched=no
- AS_CASE(["$target_os"],
- [beos*], [ ac_cv_header_net_socket_h=yes],
- [haiku*], [ ac_cv_func_shutdown=no])
- LIBS="$LIBS" # m lib is include in root under BeOS/Haiku
+ ac_cv_header_net_socket_h=yes
+ LIBS="$LIBS" # m lib is include in root under BeOS
+ ],
+[haiku*], [
+ LIBS="$LIBS"
],
[cygwin*], [ ac_cv_header_langinfo_h=yes
AC_CHECK_FUNCS(cygwin_conv_path)
@@ -2901,10 +2897,24 @@ if test x"$enable_pthread" = xyes; then
AC_DEFINE_UNQUOTED(SET_THREAD_NAME(name), pthread_set_name_np(pthread_self(), name))
fi
fi
-if test x"$ac_cv_header_ucontext_h" = xyes; then
+
+if test x"$ac_cv_header_ucontext_h" = xno; then
+ AC_CACHE_CHECK([if signal.h defines ucontext_t], [rb_cv_ucontext_in_signal_h],
+ [AC_TRY_COMPILE([@%:@include <signal.h>],
+ [size_t size = sizeof(ucontext_t);],
+ [rb_cv_ucontext_in_signal_h=yes], [rb_cv_ucontext_in_signal_h=no])])
+ if test x"$rb_cv_ucontext_in_signal_h" = xyes; then
+ AC_DEFINE_UNQUOTED(UCONTEXT_IN_SIGNAL_H, 1)
+ fi
+fi
+if test x"$ac_cv_header_ucontext_h" = xyes -o x"$rb_cv_ucontext_in_signal_h" = xyes; then
AC_CACHE_CHECK([if mcontext_t is a pointer], [rb_cv_mcontext_t_ptr],
- [AC_TRY_COMPILE([@%:@include <ucontext.h>
- mcontext_t test(mcontext_t mc) {return mc+1;}
+ [AC_TRY_COMPILE([
+ @%:@include <signal.h>
+ @%:@ifdef HAVE_UCONTEXT_H
+ @%:@include <ucontext.h>
+ @%:@endif
+ mcontext_t test(mcontext_t mc) {return mc+1;}
],
[test(0);],
[rb_cv_mcontext_t_ptr=yes], [rb_cv_mcontext_t_ptr=no])])
@@ -3055,7 +3065,7 @@ if test "$with_dln_a_out" != yes; then
# mkmf.rb's have_header() to fail if the desired resource happens to be
# installed in the /usr/local tree.
RUBY_APPEND_OPTION(CCDLFLAGS, -fno-common)],
- [bsdi*|beos*|haiku*|cygwin*|mingw*|aix*|interix*], [ ],
+ [bsdi*|beos*|cygwin*|mingw*|aix*|interix*], [ ],
[
RUBY_APPEND_OPTION(CCDLFLAGS, -fPIC)])
else
@@ -3616,7 +3626,7 @@ AS_CASE("$enable_shared", [yes], [
[sunos4*], [
LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).so'
],
- [linux* | gnu* | k*bsd*-gnu | atheos* | kopensolaris*-gnu], [
+ [linux* | gnu* | k*bsd*-gnu | atheos* | kopensolaris*-gnu | haiku*], [
LIBRUBY_DLDFLAGS='-Wl,-soname,lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR)'" $LDFLAGS_OPTDIR"
LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).so'
if test "$load_relative" = yes; then
@@ -3708,10 +3718,6 @@ AS_CASE("$enable_shared", [yes], [
AS_HELP_STRING([--disable-pie], [disable PIE feature]),
[pie=$enableval], [pie=])
AS_CASE(["$target_os"],
- [haiku], [
- # gcc supports PIE, but doesn't work correctly in Haiku
- pie=no
- ],
[nacl], [
# -pie implies -shared for NaCl.
pie=no
diff --git a/dln.c b/dln.c
index 5372c038a5..df6419ca4b 100644
--- a/dln.c
+++ b/dln.c
@@ -85,7 +85,7 @@ char *getenv();
# endif
#endif
-#if defined(__BEOS__) || defined(__HAIKU__)
+#if defined(__BEOS__)
# include <image.h>
#endif
@@ -1442,7 +1442,7 @@ dln_load(const char *file)
}
#endif
-#if defined(__BEOS__) || defined(__HAIKU__)
+#if defined(__BEOS__)
# define DLN_DEFINED
{
status_t err_stat; /* BeOS error status code */
@@ -1488,7 +1488,7 @@ dln_load(const char *file)
(*init_fct)();
return (void*)img_id;
}
-#endif /* __BEOS__ || __HAIKU__ */
+#endif /* __BEOS__ */
#ifndef DLN_DEFINED
dln_notimplement();
diff --git a/ext/socket/rubysocket.h b/ext/socket/rubysocket.h
index 2135ea4a0b..607b861ac1 100644
--- a/ext/socket/rubysocket.h
+++ b/ext/socket/rubysocket.h
@@ -27,7 +27,7 @@
# undef HAVE_TYPE_STRUCT_SOCKADDR_DL
# endif
#else
-# if defined(__BEOS__) && !defined(__HAIKU__) && !defined(BONE)
+# if defined(__BEOS__) && !defined(BONE)
# include <net/socket.h>
# else
# include <sys/socket.h>
diff --git a/file.c b/file.c
index f45cfe6cdf..000c132f58 100644
--- a/file.c
+++ b/file.c
@@ -120,7 +120,7 @@ int flock(int, int);
#define STAT(p, s) stat((p), (s))
#endif
-#if defined(__BEOS__) || defined(__HAIKU__) /* should not change ID if -1 */
+#if defined(__BEOS__) /* should not change ID if -1 */
static int
be_chown(const char *path, uid_t owner, gid_t group)
{
@@ -145,7 +145,7 @@ be_fchown(int fd, uid_t owner, gid_t group)
return fchown(fd, owner, group);
}
#define fchown be_fchown
-#endif /* __BEOS__ || __HAIKU__ */
+#endif /* __BEOS__ */
VALUE rb_cFile;
VALUE rb_mFileTest;
diff --git a/include/ruby/defines.h b/include/ruby/defines.h
index 0f6a68c15d..e82259d7aa 100644
--- a/include/ruby/defines.h
+++ b/include/ruby/defines.h
@@ -168,7 +168,7 @@ void xfree(void*);
#include "ruby/win32.h"
#endif
-#if defined(__BEOS__) && !defined(__HAIKU__) && !defined(BONE)
+#if defined(__BEOS__) && !defined(BONE)
#include <net/socket.h> /* intern.h needs fd_set definition */
#endif
diff --git a/io.c b/io.c
index 0606b8ee91..86cb786e54 100644
--- a/io.c
+++ b/io.c
@@ -35,7 +35,7 @@
# include <sys/socket.h>
#endif
-#if defined(__BOW__) || defined(__CYGWIN__) || defined(_WIN32) || defined(__BEOS__) || defined(__HAIKU__)
+#if defined(__BOW__) || defined(__CYGWIN__) || defined(_WIN32) || defined(__BEOS__)
# define NO_SAFE_RENAME
#endif
@@ -100,7 +100,7 @@
# include <sys/wait.h> /* for WNOHANG on BSD */
#endif
-#if defined(__BEOS__) || defined(__HAIKU__)
+#if defined(__BEOS__)
# ifndef NOFILE
# define NOFILE (OPEN_MAX)
# endif
diff --git a/signal.c b/signal.c
index d413bac38c..703a7785c4 100644
--- a/signal.c
+++ b/signal.c
@@ -69,7 +69,7 @@ ruby_atomic_compare_and_swap(rb_atomic_t *ptr, rb_atomic_t cmp,
}
#endif
-#if defined(__BEOS__) || defined(__HAIKU__)
+#if defined(__BEOS__)
#undef SIGBUS
#endif
@@ -759,7 +759,9 @@ static const char *received_signal;
#if defined(USE_SIGALTSTACK) || defined(_WIN32)
NORETURN(void ruby_thread_stack_overflow(rb_thread_t *th));
-# if !(defined(HAVE_UCONTEXT_H) && (defined __i386__ || defined __x86_64__ || defined __amd64__))
+# if defined __HAIKU__
+# define USE_UCONTEXT_REG 1
+# elif !(defined(HAVE_UCONTEXT_H) && (defined __i386__ || defined __x86_64__ || defined __amd64__))
# elif defined __linux__
# define USE_UCONTEXT_REG 1
# elif defined __APPLE__
@@ -790,6 +792,12 @@ check_stack_overflow(const uintptr_t addr, const ucontext_t *ctx)
# else
const __register_t sp = mctx->mc_esp;
# endif
+# elif defined __HAIKU__
+# if defined(__amd64__)
+ const unsigned long sp = mctx->rsp;
+# else
+ const unsigned long sp = mctx->esp;
+# endif
# endif
enum {pagesize = 4096};
const uintptr_t sp_page = (uintptr_t)sp / pagesize;
diff --git a/thread_pthread.c b/thread_pthread.c
index b361e8bc0a..39271c86d6 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -33,6 +33,9 @@
#if defined(HAVE_SYS_TIME_H)
#include <sys/time.h>
#endif
+#if defined(__HAIKU__)
+#include <kernel/OS.h>
+#endif
static void native_mutex_lock(rb_nativethread_lock_t *lock);
static void native_mutex_unlock(rb_nativethread_lock_t *lock);
@@ -497,6 +500,8 @@ size_t pthread_get_stacksize_np(pthread_t);
#define STACKADDR_AVAILABLE 1
#elif defined HAVE_PTHREAD_GETTHRDS_NP
#define STACKADDR_AVAILABLE 1
+#elif defined __HAIKU__
+#define STACKADDR_AVAILABLE 1
#elif defined __ia64 && defined _HPUX_SOURCE
#include <sys/dyntune.h>
@@ -615,6 +620,13 @@ get_stack(void **addr, size_t *size)
*addr = thinfo.__pi_stackaddr;
*size = thinfo.__pi_stacksize;
STACK_DIR_UPPER((void)0, (void)(*addr = (char *)*addr + *size));
+#elif defined __HAIKU__
+ thread_info info;
+ STACK_GROW_DIR_DETECTION;
+ CHECK_ERR(get_thread_info(find_thread(NULL), &info));
+ *addr = info.stack_base;
+ *size = (uintptr_t)info.stack_end - (uintptr_t)info.stack_base;
+ STACK_DIR_UPPER((void)0, (void)(*addr = (char *)*addr + *size));
#else
#error STACKADDR_AVAILABLE is defined but not implemented.
#endif