[前][次][番号順一覧][スレッド一覧]

ruby-changes:65339

From: Aaron <ko1@a...>
Date: Thu, 25 Feb 2021 06:44:33 +0900 (JST)
Subject: [ruby-changes:65339] 08d5db4064 (master): Reverting PR #4221

https://git.ruby-lang.org/ruby.git/commit/?id=08d5db4064

From 08d5db4064a76649effef1bf2ab79f04cd848a6a Mon Sep 17 00:00:00 2001
From: Aaron Patterson <tenderlove@r...>
Date: Wed, 24 Feb 2021 13:42:27 -0800
Subject: Reverting PR #4221

It seems this breaks tests on Solaris, so I'm reverting it until we
figure out the right fix.

  http://rubyci.s3.amazonaws.com/solaris11-sunc/ruby-master/log/20210224T210007Z.fail.html.gz
---
 configure.ac                 |  3 ++-
 gc.c                         | 57 ++++++++++----------------------------------
 test/ruby/test_gc_compact.rb | 16 -------------
 3 files changed, 15 insertions(+), 61 deletions(-)

diff --git a/configure.ac b/configure.ac
index 911ebdf..41f2879 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1931,6 +1931,7 @@ AC_CHECK_FUNCS(lutimes) https://github.com/ruby/ruby/blob/trunk/configure.ac#L1931
 AC_CHECK_FUNCS(malloc_usable_size)
 AC_CHECK_FUNCS(malloc_size)
 AC_CHECK_FUNCS(mblen)
+AC_CHECK_FUNCS(memalign)
 AC_CHECK_FUNCS(memset_s)
 AC_CHECK_FUNCS(writev)
 AC_CHECK_FUNCS(memrchr)
@@ -1938,11 +1939,11 @@ AC_CHECK_FUNCS(memmem) https://github.com/ruby/ruby/blob/trunk/configure.ac#L1939
 AC_CHECK_FUNCS(mkfifo)
 AC_CHECK_FUNCS(mknod)
 AC_CHECK_FUNCS(mktime)
-AC_CHECK_FUNCS(mmap)
 AC_CHECK_FUNCS(openat)
 AC_CHECK_FUNCS(pipe2)
 AC_CHECK_FUNCS(poll)
 AC_CHECK_FUNCS(posix_fadvise)
+AC_CHECK_FUNCS(posix_memalign)
 AC_CHECK_FUNCS(ppoll)
 AC_CHECK_FUNCS(pread)
 AC_CHECK_FUNCS(pwrite)
diff --git a/gc.c b/gc.c
index 073d1bc..8aad4b9 100644
--- a/gc.c
+++ b/gc.c
@@ -1765,14 +1765,14 @@ heap_unlink_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *pag https://github.com/ruby/ruby/blob/trunk/gc.c#L1765
     heap->total_slots -= page->total_slots;
 }
 
-static void rb_aligned_free(void *ptr, size_t size);
+static void rb_aligned_free(void *ptr);
 
 static void
 heap_page_free(rb_objspace_t *objspace, struct heap_page *page)
 {
     heap_allocated_pages--;
     objspace->profile.total_freed_pages++;
-    rb_aligned_free(GET_PAGE_BODY(page->start), HEAP_PAGE_SIZE);
+    rb_aligned_free(GET_PAGE_BODY(page->start));
     free(page);
 }
 
@@ -1824,7 +1824,7 @@ heap_page_allocate(rb_objspace_t *objspace) https://github.com/ruby/ruby/blob/trunk/gc.c#L1824
     /* assign heap_page entry */
     page = calloc1(sizeof(struct heap_page));
     if (page == 0) {
-        rb_aligned_free(page_body, HEAP_PAGE_SIZE);
+        rb_aligned_free(page_body);
 	rb_memerror();
     }
 
@@ -9986,13 +9986,6 @@ gc_set_auto_compact(rb_execution_context_t *ec, VALUE _, VALUE v) https://github.com/ruby/ruby/blob/trunk/gc.c#L9986
         rb_raise(rb_eNotImpError, "Automatic compaction isn't available on this platform");
     }
 #endif
-
-    /* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
-     * the read barrier, so we must disable automatic compaction. */
-#if !defined(__MINGW32__) && !defined(_WIN32) && !defined(HAVE_MMAP)
-    rb_raise(rb_eNotImpError, "Automatic compaction isn't available on this platform");
-#endif
-
     ruby_enable_autocompact = RTEST(v);
     return v;
 }
@@ -10389,36 +10382,15 @@ rb_aligned_malloc(size_t alignment, size_t size) https://github.com/ruby/ruby/blob/trunk/gc.c#L10382
 #elif defined _WIN32
     void *_aligned_malloc(size_t, size_t);
     res = _aligned_malloc(size, alignment);
-#elif defined(HAVE_MMAP)
-    GC_ASSERT(alignment % sysconf(_SC_PAGE_SIZE) == 0);
-
-    char *ptr = mmap(NULL, alignment + size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
-    if (ptr == MAP_FAILED) {
-        return NULL;
-    }
-
-    char *aligned = ptr + alignment;
-    aligned -= ((VALUE)aligned & (alignment - 1));
-    GC_ASSERT(aligned > ptr);
-    GC_ASSERT(aligned <= ptr + alignment);
-
-    size_t start_out_of_range_size = aligned - ptr;
-    GC_ASSERT(start_out_of_range_size % sysconf(_SC_PAGE_SIZE) == 0);
-    if (start_out_of_range_size > 0) {
-        if (munmap(ptr, start_out_of_range_size)) {
-            rb_bug("rb_aligned_malloc: munmap faile for start");
-        }
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
     }
-
-    size_t end_out_of_range_size = alignment - start_out_of_range_size;
-    GC_ASSERT(end_out_of_range_size % sysconf(_SC_PAGE_SIZE) == 0);
-    if (end_out_of_range_size > 0) {
-        if (munmap(aligned + size, end_out_of_range_size)) {
-            rb_bug("rb_aligned_malloc: munmap failed for end");
-        }
+    else {
+        return NULL;
     }
-
-    res = (void *)aligned;
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
 #else
     char* aligned;
     res = malloc(alignment + size + sizeof(void*));
@@ -10435,17 +10407,14 @@ rb_aligned_malloc(size_t alignment, size_t size) https://github.com/ruby/ruby/blob/trunk/gc.c#L10407
 }
 
 static void
-rb_aligned_free(void *ptr, size_t size)
+rb_aligned_free(void *ptr)
 {
 #if defined __MINGW32__
     __mingw_aligned_free(ptr);
 #elif defined _WIN32
     _aligned_free(ptr);
-#elif defined HAVE_MMAP
-    GC_ASSERT(size % sysconf(_SC_PAGE_SIZE) == 0);
-    if (munmap(ptr, size)) {
-        rb_bug("rb_aligned_free: munmap failed");
-    }
+#elif defined(HAVE_MEMALIGN) || defined(HAVE_POSIX_MEMALIGN)
+    free(ptr);
 #else
     free(((void**)ptr)[-1]);
 #endif
diff --git a/test/ruby/test_gc_compact.rb b/test/ruby/test_gc_compact.rb
index c4277d1..4a8cff3 100644
--- a/test/ruby/test_gc_compact.rb
+++ b/test/ruby/test_gc_compact.rb
@@ -60,22 +60,6 @@ class TestGCCompact < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_gc_compact.rb#L60
       GC.auto_compact = before
     end
 
-    def test_bug_17652
-      assert_in_out_err([], "#{<<~"{#"}#{<<~'};'}", timeout: 60)
-      {#
-        GC.auto_compact = true
-  
-        times = 20_000_000
-        arr = Array.new(times)
-        times.times do |i|
-          arr[i] = "#{i}"
-        end
-        
-        arr = Array.new(1_000_000, 42)
-        GC.start
-      };
-    end
-
     private
 
     def supports_auto_compact?
-- 
cgit v1.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]