Arjan Scherpenisse avatar Arjan Scherpenisse committed d29fb6a

Release depcache locks immediately after exception in z:memo().

Fixes issue 136

Comments (0)

Files changed (1)

src/support/z_depcache.erl

         {ok, Value} ->
             Value;
         undefined ->
-            Value = case F of
-                {M,F,A} -> erlang:apply(M,F,A);
-                {M,F} -> M:F();
-                F when is_function(F) -> F()
-            end,
-            case MaxAge of
-                0 -> memo_send_replies(Key, Value, Context);
-                _ -> set(Key, Value, MaxAge, Dep, Context)
-            end,
-            Value
+            try
+                Value = case F of
+                    {M,F,A} -> erlang:apply(M,F,A);
+                    {M,F} -> M:F();
+                    F when is_function(F) -> F()
+                end,
+                case MaxAge of
+                    0 -> memo_send_replies(Key, Value, Context);
+                    _ -> set(Key, Value, MaxAge, Dep, Context)
+                end,
+                Value
+            catch
+                _: R ->  memo_send_errors(Key, R, Context)
+            end
     end.
 
     %% @doc Calculate the key used for memo functions.
         [ catch gen_server:reply(Pid, {ok, Value}) || Pid <- Pids ],
         ok.
 
+    %% @doc Send an error to the processes waiting for the result.
+    memo_send_errors(Key, Reason, Context) ->
+        Pids = get_waiting_pids(Key, Context),
+        [ catch gen_server:reply(Pid, {error, Reason}) || Pid <- Pids ],
+        error.
+
 
 %% @spec set(Key, Data, Context) -> void()
 %% @doc Add the key to the depcache, hold it for 3600 seconds and no dependencies
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.