1.0.25.53: fix gencgc_handle_wp_violation on multicpu systems
[sbcl.git] / src / runtime / gencgc.c
index 5e5620f..3353425 100644 (file)
@@ -4728,14 +4728,8 @@ general_alloc_internal(long nbytes, int page_type_flag, struct alloc_region *reg
 #ifdef LISP_FEATURE_PPC
                 /* PPC calls alloc() from a trap, look up the most
                  * recent one and frob that. */
-                {
-                    int context_index =
-                        fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,
-                                                 thread));
-                    os_context_t *context =
-                        thread->interrupt_contexts[context_index - 1];
-                    maybe_save_gc_mask_and_block_deferrables(context);
-                }
+                maybe_save_gc_mask_and_block_deferrables
+                    (get_interrupt_context_for_thread(thread));
 #else
                 maybe_save_gc_mask_and_block_deferrables(NULL);
 #endif
@@ -4830,6 +4824,9 @@ gencgc_handle_wp_violation(void* fault_addr)
         return 0;
 
     } else {
+        int ret;
+        ret = thread_mutex_lock(&free_pages_lock);
+        gc_assert(ret == 0);
         if (page_table[page_index].write_protected) {
             /* Unprotect the page. */
             os_protect(page_address(page_index), PAGE_BYTES, OS_VM_PROT_ALL);
@@ -4847,6 +4844,8 @@ gencgc_handle_wp_violation(void* fault_addr)
                      page_index, boxed_region.first_page,
                      boxed_region.last_page);
         }
+        ret = thread_mutex_unlock(&free_pages_lock);
+        gc_assert(ret == 0);
         /* Don't worry, we can handle it. */
         return 1;
     }