mirror of
https://github.com/NixOS/nix.git
synced 2025-11-11 21:16:02 +01:00
Introduce a "failed" value type
In the multithreaded evaluator, it's possible for multiple threads to wait on the same thunk. If evaluation of the thunk results in an exception, the waiting threads shouldn't try to re-force the thunk. Instead, they should rethrow the same exception, without duplicating any work. Therefore, there is now a new value type `tFailed` that stores an std::exception_ptr. If evaluation of a thunk/app results in an exception, `forceValue()` overwrites the value with a `tFailed`. If `forceValue()` encounters a `tFailed`, it rethrows the exception. So you normally never need to check for failed values (since forcing them causes a rethrow).
This commit is contained in:
parent
8c789db05b
commit
b13143280c
10 changed files with 85 additions and 13 deletions
|
|
@ -75,6 +75,9 @@ void printAmbiguous(
|
|||
str << "«potential infinite recursion»";
|
||||
}
|
||||
break;
|
||||
case nFailed:
|
||||
str << "«failed»";
|
||||
break;
|
||||
case nFunction:
|
||||
if (v.isLambda()) {
|
||||
str << "<LAMBDA>";
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue