Module AsyncTaskQueue.MakeQueue
Client-side functor. MakeQueue T creates a task queue for task T
Parameters
Signature
val create : int -> CoqworkmgrApi.priority -> queuecreate n priwill initialize the queue withnworkers having prioritypri. Ifnis 0, the queue won't spawn any process, working in a lazy local manner.not imposed by the this API
val destroy : queue -> unitdestroy qDeallocatesq, cancelling all pending tasks.
val n_workers : queue -> intn_workers qreturns the number of workers ofq
val enqueue_task : queue -> T.task -> cancel_switch:cancel_switch -> unitenqueue_task q t ~cancel_switchschedulestfor execution inq.cancel_switchcan be flipped to true to cancel the task.
val join : queue -> unitjoin qblocks until the task queue is empty
val cancel_all : queue -> unitcancel_all qCancels all tasks
val cancel_worker : queue -> WorkerPool.worker_id -> unitcancel_worker q widcancels a particular workerwid
val set_order : queue -> (T.task -> T.task -> int) -> unitset_order q cmpreordersqusing orderingcmp
val broadcast : queue -> unitbroadcast qThis is nasty. Workers can be picky, e.g. pick tasks only when they are "on screen". Of course the screen is scrolled, and that changes the potential choice of workers to pick up a task or not.
This function wakes up the workers (the managers) that give a look (again) to the tasks in the queue.
The STM calls it when the perspective (as in PIDE) changes.
A problem here is that why task_match has access to the competence data in order to decide if the task is palatable to the worker or not... such data is local to the worker (manager). The perspective is global, so it does not quite fit this picture. This API to make all managers reconsider the tasks in the queue is the best I could came up with.
This API is crucial to Coqoon (or any other UI that invokes Stm.finish eagerly but wants the workers to "focus" on the visible part of the document).
val snapshot : queue -> T.task listsnapshot qTakes a snapshot (non destructive but waits until all workers are enqueued)
val clear : queue -> unitclear qClearsq, only if the worker prool is empty
val with_n_workers : int -> CoqworkmgrApi.priority -> (queue -> 'a) -> 'awith_n_workers n pri fcreates a queue, runs the function, destroys the queue. The user should call join