Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Unity-Technologies/bdwgc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Chambers <joncham@gmail.com>2020-05-27 00:50:58 +0300
committerJonathan Chambers <joncham@gmail.com>2020-05-27 16:18:41 +0300
commit0159688c7c0d5cc0bf01bf09fa2b43d611da2016 (patch)
treefebfd2849a5061b9913e40c9c5c5f8c4959ed687
parent876a56777d9fb8ca559c8889c586cc88eb120d75 (diff)
Avoid exceeding the mark stack limit
-rw-r--r--include/gc_vector.h1
-rw-r--r--vector_mlc.c15
2 files changed, 15 insertions, 1 deletions
diff --git a/include/gc_vector.h b/include/gc_vector.h
index e0a6cb44..64b8594a 100644
--- a/include/gc_vector.h
+++ b/include/gc_vector.h
@@ -53,6 +53,7 @@ GC_API GC_ATTR_MALLOC void * GC_CALL GC_gcj_vector_malloc(size_t /* lb */,
GC_API struct GC_ms_entry *GC_CALL
GC_gcj_vector_mark_proc (struct GC_ms_entry *mark_stack_ptr,
+ struct GC_ms_entry* mark_stack_limit,
GC_descr element_desc,
GC_word*start,
GC_word*end,
diff --git a/vector_mlc.c b/vector_mlc.c
index ba5c28b5..e5ac1760 100644
--- a/vector_mlc.c
+++ b/vector_mlc.c
@@ -142,7 +142,7 @@ GC_API void GC_CALL GC_init_gcj_vector (int mp_index,
#define ELEMENT_CHUNK_SIZE 256
GC_API mse *GC_CALL
-GC_gcj_vector_mark_proc (mse *mark_stack_ptr, GC_descr element_desc, word *start, word *end, int words_per_element)
+GC_gcj_vector_mark_proc (mse *mark_stack_ptr, mse* mark_stack_limit, GC_descr element_desc, word *start, word *end, int words_per_element)
{
/* create new descriptor that is shifted two bits to account
* for lack of object header. Descriptors for value types include
@@ -162,6 +162,8 @@ GC_gcj_vector_mark_proc (mse *mark_stack_ptr, GC_descr element_desc, word *start
/* attempt to bulk process multiple elements with single descriptor */
size_t elements_per_desc = (CPP_WORDSZ - GC_DS_TAG_BITS) / words_per_element;
+ if (mark_stack_ptr >= mark_stack_limit)
+ return GC_signal_mark_stack_overflow (mark_stack_ptr);
/* setup bulk processing */
if (elements_per_desc > 1) {
@@ -188,12 +190,16 @@ GC_gcj_vector_mark_proc (mse *mark_stack_ptr, GC_descr element_desc, word *start
remainder_count = 0;
mark_stack_ptr++;
+ if (mark_stack_ptr >= mark_stack_limit)
+ mark_stack_ptr = GC_signal_mark_stack_overflow (mark_stack_ptr);
mark_stack_ptr->mse_descr.w = GC_MAKE_PROC (GC_gcj_vector_mp_index, 1 /* continue processing */);
mark_stack_ptr->mse_start = (ptr_t)end;
}
while (bulk_count > 0) {
mark_stack_ptr++;
+ if (mark_stack_ptr >= mark_stack_limit)
+ mark_stack_ptr = GC_signal_mark_stack_overflow (mark_stack_ptr);
mark_stack_ptr->mse_start = (ptr_t) (current);
mark_stack_ptr->mse_descr.w = bulk_desc;
@@ -206,6 +212,8 @@ GC_gcj_vector_mark_proc (mse *mark_stack_ptr, GC_descr element_desc, word *start
while (remainder_count > 0) {
mark_stack_ptr++;
+ if (mark_stack_ptr >= mark_stack_limit)
+ mark_stack_ptr = GC_signal_mark_stack_overflow (mark_stack_ptr);
mark_stack_ptr->mse_start = (ptr_t) (current);
mark_stack_ptr->mse_descr.w = element_desc_shifted;
@@ -224,6 +232,9 @@ GC_gcj_vector_mark_proc (mse *mark_stack_ptr, GC_descr element_desc, word *start
end = start + remainder_count * words_per_element;
mark_stack_ptr++;
+ if (mark_stack_ptr >= mark_stack_limit)
+ mark_stack_ptr = GC_signal_mark_stack_overflow (mark_stack_ptr);
+
mark_stack_ptr->mse_descr.w = GC_MAKE_PROC (GC_gcj_vector_mp_index, 1 /* continue processing */);
mark_stack_ptr->mse_start = (ptr_t)end;
}
@@ -231,6 +242,8 @@ GC_gcj_vector_mark_proc (mse *mark_stack_ptr, GC_descr element_desc, word *start
word *current = start;
while (remainder_count > 0) {
mark_stack_ptr++;
+ if (mark_stack_ptr >= mark_stack_limit)
+ mark_stack_ptr = GC_signal_mark_stack_overflow (mark_stack_ptr);
mark_stack_ptr->mse_start = (ptr_t) (current);
mark_stack_ptr->mse_descr.w = element_desc_shifted;