Module Async_unix__.Raw_scheduler
module Fd = Async_unix__.Raw_fdmodule Watching = Fd.Watchingmodule Signal = Core.Signalmodule Timerfd = Core.Linux_ext.Timerfdmodule Tsc = Time_stamp_countermodule File_descr_watcher : sig ... endinclude Async_unix__.Import.Async_kernel_scheduler
type 'a with_options= ?monitor:Async_kernel.Monitor.t -> ?priority:Async_kernel.Priority.t -> 'a
val current_execution_context : unit -> Async_kernel.Execution_context.tval within_context : Async_kernel.Execution_context.t -> (unit -> 'a) -> ('a, unit) Core_kernel.Result.twithin_context context frunsf ()right now with the specified execution context. Iffraises, then the exception is sent to the monitor ofcontext, andError ()is returned.
val within' : ((unit -> 'a Async_kernel.Deferred.t) -> 'a Async_kernel.Deferred.t) with_optionswithin' f ~monitor ~priorityrunsf ()right now, with the specified block group, monitor, and priority set as specified. They will be reset to their original values whenfreturns. Iffraises, then the result ofwithin'will never become determined, but the exception will end up in the specified monitor.
val within : ((unit -> unit) -> unit) with_optionswithinis likewithin', but doesn't require the thunk to return a deferred.
val within_v : ((unit -> 'a) -> 'a option) with_optionswithin_vis likewithin, but allows a value to be returned byf.
val with_local : 'a Core_kernel.Univ_map.Key.t -> 'a option -> f:(unit -> 'b) -> 'bwith_local key value ~f, when run in the current execution context,e, runsfright now in a new execution context,e', that is identical toeexcept thatfind_local key = value. As usual,e'will be in effect in asynchronous computations started byf. Whenwith_localreturns, the execution context is restored toe.
val find_local : 'a Core_kernel.Univ_map.Key.t -> 'a optionfind_local keyreturns the value associated tokeyin the current execution context.
val schedule' : ((unit -> 'a Async_kernel.Deferred.t) -> 'a Async_kernel.Deferred.t) with_optionsJust like
within', but instead of running the thunk right now, adds it to the Async queue to be run with other Async jobs.
val schedule : ((unit -> unit) -> unit) with_optionsJust like
schedule', but doesn't require the thunk to return a deferred.
val enqueue_job : Async_kernel.Execution_context.t -> ('a -> unit) -> 'a -> uniteneque_job execution_context.t f aenqueues into the scheduler's job queue a job that will runf ainexecution_context.
val thread_safe_enqueue_job : Async_kernel.Execution_context.t -> ('a -> unit) -> 'a -> unitthread_safe_enqueue_jobis likeenqueue_job, except it is for use from a thread that doesn't hold the Async lock.
val preserve_execution_context : ('a -> unit) -> ('a -> unit) Core_kernel.Staged.tpreserve_execution_context t fsaves the current execution context and returns a functiongsuch thatg arunsf ain the saved execution context.g abecomes determined whenf abecomes determined.
val preserve_execution_context' : ('a -> 'b Async_kernel.Deferred.t) -> ('a -> 'b Async_kernel.Deferred.t) Core_kernel.Staged.tval cycle_start : unit -> Core_kernel.Time.tcycle_start ()returns the result ofTime.now ()called at the beginning of cycle.
val cycle_start_ns : unit -> Async_kernel__.Import.Time_ns.tval cycle_times : unit -> Core_kernel.Time.Span.t Async_kernel__.Async_stream.tcycle_times ()returns a stream that is extended with an element at the start of each Async cycle, with the amount of time that the previous cycle took, as determined by calls toTime.nowat the beginning and end of the cycle.
val cycle_times_ns : unit -> Async_kernel__.Import.Time_ns.Span.t Async_kernel__.Async_stream.tval long_cycles : at_least:Async_kernel__.Import.Time_ns.Span.t -> Async_kernel__.Import.Time_ns.Span.t Async_kernel__.Async_stream.tlong_cycles ~at_leastreturns a stream of cycles whose duration is at leastat_least.long_cyclesis more efficient thancycle_timesbecause it only allocates a stream entry when there is a long cycle, rather than on every cycle.
val cycle_count : unit -> intcycle_count ()returns the total number of Async cycles that have happened.
val total_cycle_time : unit -> Async_kernel__.Import.Time_ns.Span.ttotal_cycle_time ()returns the total (wall) time spent executing jobs in Async cycles.
val event_precision : unit -> Core_kernel.Time.Span.tThe
alarm_precisionof the timing-wheel used to implement Async'sClock.
val event_precision_ns : unit -> Async_kernel__.Import.Time_ns.Span.tval force_current_cycle_to_end : unit -> unitforce_current_cycle_to_end ()causes no more normal priority jobs to run in the current cycle, and for the end-of-cycle jobs (i.e., writes) to run, and then for the cycle to end.
val set_max_num_jobs_per_priority_per_cycle : int -> unitset_max_num_jobs_per_priority_per_cycle intsets the maximum number of jobs that will be done at each priority within each Async cycle. The default is500.max_num_jobs_per_priority_per_cycleretrieves the current value.
val max_num_jobs_per_priority_per_cycle : unit -> intval set_record_backtraces : bool -> unitset_record_backtraces do_recordsets whether Async should keep in the execution context the history of stack backtraces (obtained viaBacktrace.get) that led to the current job. If an Async job has an unhandled exception, this backtrace history will be recorded in the exception. In particular the history will appear in an unhandled exception that reaches the main monitor. This can have a substantial performance impact, both in running time and space usage.
val yield : unit -> unit Async_kernel.Deferred.tyield ()returns a deferred that becomes determined after the current cycle completes. This can be useful to improve fairness byyielding within a computation to give other jobs a chance to run.
val yield_until_no_jobs_remain : unit -> unit Async_kernel.Deferred.tyield_until_no_jobs_remain ()returns a deferred that becomes determined the next time Async's job queue is empty. This is useful in tests when one needs to wait for the completion of all the jobs based on what's in the queue, when those jobs might create other jobs -- without depending on I/O or the passage of wall-clock time.
val yield_every : n:int -> (unit -> unit Async_kernel.Deferred.t) Core_kernel.Staged.tyield_every ~nreturns a function that will act asyieldeveryncalls and asreturn ()the rest of the time. This is useful for improving fairness in circumstances where you don't have good control of the batch size, but can insert a deferred into every iteration.yield_everyraises ifn <= 0.
val num_jobs_run : unit -> intnum_jobs_run ()returns the number of jobs that have been run since starting. The returned value includes the currently running job.
val num_pending_jobs : unit -> intnum_pending_jobsreturns the number of jobs that are queued to run by the scheduler.
module Expert = Async_kernel.Async_kernel_scheduler.Expertmodule Private = Async_kernel__.Schedulertype t={mutex : Nano_mutex.t;mutable is_running : bool;mutable have_called_go : bool;fds_whose_watching_has_changed : Fd.t Core.Stack.t;file_descr_watcher : File_descr_watcher.t;mutable time_spent_waiting_for_io : Tsc.Span.t;fd_by_descr : Async_unix__.Fd_by_descr.t;mutable timerfd : Core.Linux_ext.Timerfd.t option;mutable timerfd_set_at : Core.Time_ns.t;mutable scheduler_thread_id : int;interruptor : Async_unix__.Interruptor.t;signal_manager : Async_unix__.Raw_signal_manager.t;thread_pool : Thread_pool.t;mutable handle_thread_pool_stuck : Thread_pool.t -> stuck_for:Core.Time_ns.Span.t -> unit;busy_pollers : Async_unix__.Busy_pollers.t;mutable busy_poll_thread_is_running : bool;mutable next_tsc_calibration : Tsc.t;kernel_scheduler : Async_unix__.Import.Kernel_scheduler.t;mutable have_lock_do_cycle : (unit -> unit) option;mutable max_inter_cycle_timeout : Async_unix__.Import.Max_inter_cycle_timeout.t;mutable min_inter_cycle_timeout : Async_unix__.Import.Min_inter_cycle_timeout.t;initialized_at : Core.Backtrace.t;}
val initialized_at : t -> Core.Backtrace.tval min_inter_cycle_timeout : t -> Async_unix__.Import.Min_inter_cycle_timeout.tval set_min_inter_cycle_timeout : t -> Async_unix__.Import.Min_inter_cycle_timeout.t -> unitval max_inter_cycle_timeout : t -> Async_unix__.Import.Max_inter_cycle_timeout.tval set_max_inter_cycle_timeout : t -> Async_unix__.Import.Max_inter_cycle_timeout.t -> unitval have_lock_do_cycle : t -> (unit -> unit) optionval set_have_lock_do_cycle : t -> (unit -> unit) option -> unitval kernel_scheduler : t -> Async_unix__.Import.Kernel_scheduler.tval next_tsc_calibration : t -> Tsc.tval set_next_tsc_calibration : t -> Tsc.t -> unitval busy_poll_thread_is_running : t -> boolval set_busy_poll_thread_is_running : t -> bool -> unitval busy_pollers : t -> Async_unix__.Busy_pollers.tval handle_thread_pool_stuck : t -> Thread_pool.t -> stuck_for:Core.Time_ns.Span.t -> unitval set_handle_thread_pool_stuck : t -> (Thread_pool.t -> stuck_for:Core.Time_ns.Span.t -> unit) -> unitval thread_pool : t -> Thread_pool.tval signal_manager : t -> Async_unix__.Raw_signal_manager.tval interruptor : t -> Async_unix__.Interruptor.tval scheduler_thread_id : t -> intval set_scheduler_thread_id : t -> int -> unitval timerfd_set_at : t -> Core.Time_ns.tval set_timerfd_set_at : t -> Core.Time_ns.t -> unitval timerfd : t -> Core.Linux_ext.Timerfd.t optionval set_timerfd : t -> Core.Linux_ext.Timerfd.t option -> unitval fd_by_descr : t -> Async_unix__.Fd_by_descr.tval time_spent_waiting_for_io : t -> Tsc.Span.tval set_time_spent_waiting_for_io : t -> Tsc.Span.t -> unitval file_descr_watcher : t -> File_descr_watcher.tval fds_whose_watching_has_changed : t -> Fd.t Core.Stack.tval have_called_go : t -> boolval set_have_called_go : t -> bool -> unitval is_running : t -> boolval set_is_running : t -> bool -> unitval mutex : t -> Nano_mutex.t
module Fields : sig ... endval sexp_of_t : t -> Ppx_sexp_conv_lib.Sexp.tval max_num_threads : t -> intval max_num_open_file_descrs : t -> intval current_execution_context : t -> Async_kernel.Execution_context.tval with_execution_context : t -> Async_kernel.Execution_context.t -> f:(unit -> 'a) -> 'aval create_fd : ?avoid_nonblock_if_possible:bool -> t -> Fd.Kind.t -> Fd.File_descr.t -> Core.Info.t -> Fd.tval thread_pool_cpu_affinity : t -> Thread_pool.Cpu_affinity.tval lock : t -> unitval try_lock : t -> boolval unlock : t -> unitval with_lock : t -> (unit -> 'a) -> 'aval am_holding_lock : t -> bool
type the_one_and_only=|Not_ready_to_initialize|Ready_to_initialize of unit -> t|Initialized of t
val mutex_for_initializing_the_one_and_only_ref : Nano_mutex.tval the_one_and_only_ref : the_one_and_only Core.refval is_ready_to_initialize : unit -> boolval the_one_and_only_uncommon_case : should_lock:bool -> tval the_one_and_only : should_lock:bool -> tval current_thread_id : unit -> intval is_main_thread : unit -> boolval remove_fd : t -> Async_unix__.Raw_fd.t -> unitval maybe_start_closing_fd : t -> Fd.t -> unitval dec_num_active_syscalls_fd : t -> Fd.t -> unitval invariant : t -> unitval update_check_access : t -> bool -> unitval try_create_timerfd : unit -> Timerfd.t optionval default_handle_thread_pool_stuck : Thread_pool.t -> stuck_for:Core.Time_ns.Span.t -> Core_kernel__.Import.unitval detect_stuck_thread_pool : t -> unitval thread_safe_wakeup_scheduler : t -> unitval i_am_the_scheduler : t -> boolval set_fd_desired_watching : t -> Fd.t -> Async_unix__.Read_write.Key.t -> Fd.Watching.t -> unitval request_start_watching : t -> Fd.t -> Async_unix__.Read_write.Key.t -> Fd.Watching.t -> [> `Already_closed | `Already_watching | `Unsupported | `Watching ]val request_stop_watching : t -> Fd.t -> Async_unix__.Read_write.Key.t -> Fd.ready_to_result -> unitval post_check_got_timerfd : Async_unix__.Import.File_descr.t -> 'aval post_check_invalid_fd : Async_unix__.Import.File_descr.t -> 'aval post_check_handle_fd : t -> Async_unix__.Import.File_descr.t -> Async_unix__.Read_write.Key.t -> Fd.ready_to_result -> unitval create : ?thread_pool_cpu_affinity:Thread_pool.Cpu_affinity.t -> ?file_descr_watcher:Async_unix__.Config.File_descr_watcher.t -> ?max_num_open_file_descrs:Async_unix__.Config.Max_num_open_file_descrs.t -> ?max_num_threads:Async_unix__.Config.Max_num_threads.t -> unit -> tval init : unit -> unitval reset_in_forked_process : unit -> unitval thread_safe_reset : unit -> unitval make_async_unusable : unit -> unitval thread_safe_enqueue_external_job : t -> Async_kernel.Execution_context.t -> ('a -> unit) -> 'a -> unitval have_lock_do_cycle : t -> unitval log_sync_changed_fds_to_file_descr_watcher : t -> Async_unix__.Import.File_descr.t -> Core_kernel__.Import.bool Async_unix__.Read_write.t -> unitval sync_changed_fd_failed : t -> Fd.t -> Core_kernel__.Import.bool Async_unix__.Read_write.t -> Core_kernel__.Import.Exn.t -> 'aval sync_changed_fds_to_file_descr_watcher : t -> unitval maybe_calibrate_tsc : t -> unitval create_job : ?execution_context:Async_kernel.Execution_context.t -> t -> ('a -> unit) -> 'a -> Async_kernel__.Job.tval dump_core_on_job_delay : unit -> unitval init : t -> unitval check_file_descr_watcher : t -> timeout:'a Async_unix__.File_descr_watcher_intf.Timeout.t -> 'a -> unitval compute_timeout_and_check_file_descr_watcher : t -> unitval one_iter : t -> unitval be_the_scheduler : ?raise_unhandled_exn:bool -> t -> 'aval add_finalizer : t -> 'a Core_kernel.Heap_block.t -> ('a Core_kernel.Heap_block.t -> unit) -> unitval add_finalizer_exn : t -> 'a -> ('a -> unit) -> unitval set_task_id : unit -> unitval go : ?raise_unhandled_exn:bool -> unit -> Core__.Import.never_returnsval go_main : ?raise_unhandled_exn:bool -> ?file_descr_watcher:Async_unix__.Config.File_descr_watcher.t -> ?max_num_open_file_descrs:int -> ?max_num_threads:int -> main:(unit -> unit) -> unit -> Core__.Import.never_returnsval is_running : unit -> boolval report_long_cycle_times : ?cutoff:Core.Time.Span.t -> unit -> unitval set_check_invariants : bool -> unitval set_detect_invalid_access_from_thread : bool -> unitval set_max_inter_cycle_timeout : Core_kernel__.Span_float.t -> unitval start_busy_poller_thread_if_not_running : t -> unitval add_busy_poller : (unit -> [ `Continue_polling | `Stop_polling of 'a ]) -> 'a Async_unix__.Import.Deferred.t
type 'b folder={folder : a. 'b -> t -> (t, 'a) Core.Field.t -> 'b;}
val t : unit -> tval fold_fields : init:'a -> 'a folder -> 'aval handle_thread_pool_stuck : (stuck_for:Core.Time_ns.Span.t -> unit) -> unit