From 71cc6576f6066be339a9d9b0bf766620a7750681 Mon Sep 17 00:00:00 2001 From: Project Nayuki Date: Wed, 29 Nov 2017 20:35:41 +0000 Subject: [PATCH] Updated cache logic to be exception-safe. --- src/io/nayuki/fastqrcodegen/QrTemplate.java | 17 +++++++++++------ .../fastqrcodegen/ReedSolomonGenerator.java | 17 +++++++++++------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/io/nayuki/fastqrcodegen/QrTemplate.java b/src/io/nayuki/fastqrcodegen/QrTemplate.java index b60ce81..e218ed0 100644 --- a/src/io/nayuki/fastqrcodegen/QrTemplate.java +++ b/src/io/nayuki/fastqrcodegen/QrTemplate.java @@ -57,13 +57,18 @@ final class QrTemplate { } } - QrTemplate tpl = new QrTemplate(version); - synchronized(cache) { - cache[version] = new SoftReference<>(tpl); - isPending[version] = false; - cache.notifyAll(); + try { + QrTemplate tpl = new QrTemplate(version); + synchronized(cache) { + cache[version] = new SoftReference<>(tpl); + } + return tpl; + } finally { + synchronized(cache) { + isPending[version] = false; + cache.notifyAll(); + } } - return tpl; } diff --git a/src/io/nayuki/fastqrcodegen/ReedSolomonGenerator.java b/src/io/nayuki/fastqrcodegen/ReedSolomonGenerator.java index 2a35fce..3ad23f1 100644 --- a/src/io/nayuki/fastqrcodegen/ReedSolomonGenerator.java +++ b/src/io/nayuki/fastqrcodegen/ReedSolomonGenerator.java @@ -59,13 +59,18 @@ final class ReedSolomonGenerator { } } - ReedSolomonGenerator rs = new ReedSolomonGenerator(degree); - synchronized(cache) { - cache[degree] = new SoftReference<>(rs); - isPending[degree] = false; - cache.notifyAll(); + try { + ReedSolomonGenerator rs = new ReedSolomonGenerator(degree); + synchronized(cache) { + cache[degree] = new SoftReference<>(rs); + } + return rs; + } finally { + synchronized(cache) { + isPending[degree] = false; + cache.notifyAll(); + } } - return rs; }