[ Advanced Control and Suspensions | The ECLiPSe Built-In Predicates | Reference Manual | Alphabetic Index ]

# wake

Execute all scheduled suspensions whose priorities are higher than the current one.

## Description

Suspensions in ECLiPSe go through several stages: They are created, attached to variables or symbolic triggers, later scheduled for execution, and finally executed.

When a suspension is scheduled for execution, it gets inserted into a global priority list where it is waiting for execution. This global priority list is then processed explicitly by the wake/0 predicate. This separation of scheduling and execution enables the proper handling of priorities: Low priority suspensions are not necessarily executed by the next wake/0, but possibly later when the current priority has become low enough.

The separation also allows to schedule a batch of suspension lists together before entering the priority-based execution scheme.

wake/0 should therefore be called in the following situations: 1. after new suspensions have been scheduled by one or several calls to schedule_suspensions/1,2 or notify_constrained/1.

2. whenever the current priority was lowered, since that may allow further scheduled goals to be executed.

Note that wake/0 is implicitly invoked after every sequence of meta_unify handlers and should thus not be called inside the handlers.

### Fail Conditions

Fails if a woken goal fails

### Resatisfiable

Resatisfiable if a woken goal is resatisfiable

## Examples

    [eclipse 4]: make_suspension(write(a), 1, S),
    	schedule_suspensions(1, attr([S])),
    	wake, write(b).
    ab
    S = 'SUSP-_280-dead'
    yes.
    [eclipse 5]: make_suspension(write(a), 1, S),
    	schedule_suspensions(1, attr([S])),
    	write(b), wake.
    ba
    S = 'SUSP-_280-dead'
    yes.

## See Also

make_suspension / 3, insert_suspension / 3, suspend / 3, suspend / 4, schedule_suspensions / 1, schedule_suspensions / 2, attach_suspensions / 2