Original code by Pekka Enberg.
Signed-off-by: Vegard Nossum <[email protected]>
---
include/vm/gc.h | 1 +
vm/gc.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 60 insertions(+), 0 deletions(-)
diff --git a/include/vm/gc.h b/include/vm/gc.h
index b833219..05e324c 100644
--- a/include/vm/gc.h
+++ b/include/vm/gc.h
@@ -8,6 +8,7 @@ void gc_init(void);
void gc_attach_thread(void);
void gc_detach_thread(void);
+void gc_start(void);
void gc_safepoint(void);
#endif
diff --git a/vm/gc.c b/vm/gc.c
index 40f8f2f..c8fc44c 100644
--- a/vm/gc.c
+++ b/vm/gc.c
@@ -1,4 +1,5 @@
#include <assert.h>
+#include <stdbool.h>
#include <stdio.h>
#include <pthread.h>
@@ -11,7 +12,13 @@ void *gc_safepoint_page;
static pthread_mutex_t safepoint_mutex = PTHREAD_MUTEX_INITIALIZER;
/* Protected by safepoint_mutex */
+static pthread_cond_t everyone_in_cond = PTHREAD_COND_INITIALIZER;
+static pthread_cond_t everyone_out_cond = PTHREAD_COND_INITIALIZER;
static unsigned int nr_threads = 0;
+static unsigned int nr_in_safepoint = 0;
+
+static pthread_cond_t can_continue_cond = PTHREAD_COND_INITIALIZER;
+static bool can_continue;
void gc_init(void)
{
@@ -36,6 +43,58 @@ void gc_detach_thread(void)
pthread_mutex_unlock(&safepoint_mutex);
}
+static void hide_safepoint_guard_page(void)
+{
+ hide_guard_page(gc_safepoint_page);
+}
+
+static void unhide_safepoint_guard_page(void)
+{
+ unhide_guard_page(gc_safepoint_page);
+}
+
+void gc_start(void)
+{
+ pthread_mutex_lock(&safepoint_mutex);
+
+ assert(nr_in_safepoint == 0);
+
+ can_continue = false;
+ hide_safepoint_guard_page();
+
+ while (nr_in_safepoint != nr_threads)
+ pthread_cond_wait(&everyone_in_cond, &safepoint_mutex);
+
+ /* At this point, we know that everyone is in the safepoint. */
+ unhide_safepoint_guard_page();
+
+ /* TODO: Do main GC work here. */
+
+ /* Resume other threads */
+ can_continue = true;
+ pthread_cond_broadcast(&can_continue_cond);
+
+ while (nr_in_safepoint != 0)
+ pthread_cond_wait(&everyone_out_cond, &safepoint_mutex);
+
+ pthread_mutex_unlock(&safepoint_mutex);
+}
+
void gc_safepoint(void)
{
+ pthread_mutex_lock(&safepoint_mutex);
+
+ /* Only the GC thread will be waiting for this. */
+ if (++nr_in_safepoint == nr_threads)
+ pthread_cond_signal(&everyone_in_cond);
+
+ /* Block until GC has finished */
+ while (!can_continue)
+ pthread_cond_wait(&can_continue_cond, &safepoint_mutex);
+
+ /* Only the GC thread will be waiting for this. */
+ if (--nr_in_safepoint == 0)
+ pthread_cond_signal(&everyone_out_cond);
+
+ pthread_mutex_unlock(&safepoint_mutex);
}
--
1.6.0.6
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Jatovm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel