> -- Vlad писал(а):
> Все равно не понял. Нужное условие проверяется еще раз сразу после EXCWAIT.

Ваше ожидание завершается так сказать "по трём причинам": condition OR надоело_ждать OR не_хотим_ждать, а моё "по двум": надоело_ждать OR condition. Моей ждущей программе, после того как она уже начала ждать, значение переменной не_хотим_ждать уже безразлично.

> -- Vlad писал(а):
> блокировка не снимается до конца выполнения функции (или до конца действия блока EXCWAIT).

Вообще-то, в приведённой Вами записи EXCWAIT выглядела как процедура.

> -- Vlad писал(а):
> Я бы хотел в данном случае видеть декомпозицию на две отдельных функции, которые совершают законченные действия с объектом.

Наверное не на 2, а на 3.
## Код:
```
BEGIN{EXCLUSIVE}
  f1;
  AWAIT(enter);
  f2;
  AWAIT(exit);
  f3
END;
```


Мне приходит в голову что-то навроде следующего:
## Код:
```
feature H1 (args...);
begin
  f1(args...);
  H2(args...)
end;

feature H2 (args...); precondition enter;
begin
  f2(args...);
  H3(args...)
end;

feature H3 (args...); precondition exit;
begin
  f3(args...)
end;
```

Так хотите?