diff --git a/collects/racket/future/private/visualizer-data.rkt b/collects/racket/future/private/visualizer-data.rkt index 39168ca3da..db0e056723 100644 --- a/collects/racket/future/private/visualizer-data.rkt +++ b/collects/racket/future/private/visualizer-data.rkt @@ -5,7 +5,8 @@ racket/future racket/set "constants.rkt" - "graph-drawing.rkt") + "graph-drawing.rkt" + (only-in '#%futures init-visualizer-tracking!)) (provide (contract-out [start-performance-tracking! (-> void?)]) (struct-out future-event) @@ -27,7 +28,8 @@ ;;start-performance-tracking! -> void (define (start-performance-tracking!) - (when (not recv) + (when (not recv) + (init-visualizer-tracking!) (set! recv (make-log-receiver (current-logger) 'debug)))) (define-struct future-event (future-id process-id what time prim-name user-data) diff --git a/src/racket/src/future.c b/src/racket/src/future.c index 49db9dfb01..6249dc12da 100644 --- a/src/racket/src/future.c +++ b/src/racket/src/future.c @@ -237,6 +237,11 @@ static Scheme_Object *would_be_future(int argc, Scheme_Object *argv[]) return scheme_future(argc, argv); } +static Scheme_Object *reset_future_logs_for_tracking(int argc, Scheme_Object *argv[]) +{ + return scheme_void; +} + # define FUTURE_PRIM_W_ARITY(name, func, a1, a2, env) GLOBAL_PRIM_W_ARITY(name, func, a1, a2, env) void scheme_init_futures(Scheme_Env *newenv) @@ -254,6 +259,7 @@ void scheme_init_futures(Scheme_Env *newenv) FUTURE_PRIM_W_ARITY("fsemaphore-count", scheme_fsemaphore_count, 1, 1, newenv); FUTURE_PRIM_W_ARITY("would-be-future", would_be_future, 1, 1, newenv); FUTURE_PRIM_W_ARITY("futures-enabled?", futures_enabled, 0, 0, newenv); + FUTURE_PRIM_W_ARITY("init-visualizer-tracking!", reset_future_logs_for_tracking, 0, 0, newenv); scheme_finish_primitive_module(newenv); scheme_protect_primitive_provide(newenv, NULL); @@ -422,6 +428,7 @@ static void pop_suspended_lw(Scheme_Future_State *fs, future_t *ft); static Scheme_Object *bad_multi_result_proc; static Scheme_Object *bad_multi_result(int argc, Scheme_Object **argv); +static Scheme_Object *reset_future_logs_for_tracking(int argc, Scheme_Object *argv[]); READ_ONLY static int cpucount; static void init_cpucount(void); @@ -547,6 +554,7 @@ void scheme_init_futures(Scheme_Env *newenv) GLOBAL_PRIM_W_ARITY("would-be-future", would_be_future, 1, 1, newenv); GLOBAL_PRIM_W_ARITY("futures-enabled?", futures_enabled, 0, 0, newenv); + GLOBAL_PRIM_W_ARITY("init-visualizer-tracking!", reset_future_logs_for_tracking, 0, 0, newenv); scheme_finish_primitive_module(newenv); scheme_protect_primitive_provide(newenv, NULL); @@ -944,6 +952,40 @@ void scheme_future_check_custodians() /* Future-event logging */ /**********************************************************************/ +static Scheme_Object *reset_future_logs_for_tracking(int argc, Scheme_Object **argv) +{ + Scheme_Future_State *fs; + Scheme_Future_Thread_State *fts; + Scheme_Future_Thread_State *rt_fts; + + fs = scheme_future_state; + rt_fts = scheme_future_thread_state; + if (fs) { + int i; + mzrt_mutex_lock(fs->future_mutex); + init_fevent(&fs->runtime_fevents); + + if (rt_fts) { + init_fevent(&rt_fts->fevents1); + init_fevent(&rt_fts->fevents2); + rt_fts->use_fevents1 = 1; + } + + for (i = 0; i < fs->thread_pool_size; i++) { + fts = fs->pool_threads[i]; + if (fts) { + init_fevent(&fts->fevents1); + init_fevent(&fts->fevents2); + fts->use_fevents1 = 1; + } + } + mzrt_mutex_unlock(fs->future_mutex); + + } + + return scheme_void; +} + static double get_future_timestamp() XFORM_SKIP_PROC { #if 1 return scheme_get_inexact_milliseconds(); diff --git a/src/racket/src/schminc.h b/src/racket/src/schminc.h index 8dd1d0d85c..3c67ce324e 100644 --- a/src/racket/src/schminc.h +++ b/src/racket/src/schminc.h @@ -17,7 +17,7 @@ #define EXPECTED_PRIM_COUNT 1064 #define EXPECTED_UNSAFE_COUNT 79 #define EXPECTED_FLFXNUM_COUNT 69 -#define EXPECTED_FUTURES_COUNT 13 +#define EXPECTED_FUTURES_COUNT 14 #ifdef MZSCHEME_SOMETHING_OMITTED # undef USE_COMPILED_STARTUP