save errno in write barrier signal handler
In case a write barrier happens between the set and use of `errno`, make sure the barrier doesn't cause the `errno` value to change in the process of making other system calls.
This commit is contained in:
parent
9422d66601
commit
6e2978fe5c
|
@ -9,6 +9,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
#include "platforms.h"
|
#include "platforms.h"
|
||||||
#include "../src/schpriv.h"
|
#include "../src/schpriv.h"
|
||||||
#include "gc2.h"
|
#include "gc2.h"
|
||||||
|
@ -1004,6 +1005,7 @@ static void set_has_back_pointers(NewGC *gc, mpage *page)
|
||||||
|
|
||||||
static int designate_modified_gc(NewGC *gc, void *p)
|
static int designate_modified_gc(NewGC *gc, void *p)
|
||||||
{
|
{
|
||||||
|
int saved_errno = errno; /* in case signal happens between set and use of errno */
|
||||||
mpage *page = pagemap_find_page(gc->page_maps, p);
|
mpage *page = pagemap_find_page(gc->page_maps, p);
|
||||||
|
|
||||||
if (gc->no_further_modifications) {
|
if (gc->no_further_modifications) {
|
||||||
|
@ -1019,6 +1021,7 @@ static int designate_modified_gc(NewGC *gc, void *p)
|
||||||
|| (gc->doing_memory_accounting && gc->finished_incremental))) {
|
|| (gc->doing_memory_accounting && gc->finished_incremental))) {
|
||||||
check_incremental_unprotect(gc, page);
|
check_incremental_unprotect(gc, page);
|
||||||
gc->unprotected_page = 1; /* for using fuel */
|
gc->unprotected_page = 1; /* for using fuel */
|
||||||
|
errno = saved_errno;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
GCPRINT(GCOUTF, "Seg fault (internal error during gc) at %p\n", p);
|
GCPRINT(GCOUTF, "Seg fault (internal error during gc) at %p\n", p);
|
||||||
|
@ -1031,6 +1034,7 @@ static int designate_modified_gc(NewGC *gc, void *p)
|
||||||
if (!page->back_pointers)
|
if (!page->back_pointers)
|
||||||
set_has_back_pointers(gc, page);
|
set_has_back_pointers(gc, page);
|
||||||
gc->modified_unprotects++;
|
gc->modified_unprotects++;
|
||||||
|
errno = saved_errno;
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
if (gc->primoridal_gc)
|
if (gc->primoridal_gc)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user