From b3ee4226ef24ac65c6b23ad3077bbdf58a2c7ff8 Mon Sep 17 00:00:00 2001
From: Matt Wala <wala1@illinois.edu>
Date: Mon, 25 Sep 2017 11:22:30 -0500
Subject: [PATCH] Use WriteOncePersistentDict instead of PersistentDict.

---
 pyopencl/invoker.py | 10 +++++++---
 pyopencl/scan.py    |  9 ++++++---
 setup.py            |  2 +-
 3 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/pyopencl/invoker.py b/pyopencl/invoker.py
index a11c6732..34566c6d 100644
--- a/pyopencl/invoker.py
+++ b/pyopencl/invoker.py
@@ -29,7 +29,7 @@ import numpy as np
 
 from warnings import warn
 from pyopencl._cffi import ffi as _ffi
-from pytools.persistent_dict import PersistentDict
+from pytools.persistent_dict import WriteOncePersistentDict, ReadOnlyEntryError
 from pyopencl.tools import _NumpyTypesKeyBuilder
 
 _PYPY = '__pypy__' in sys.builtin_module_names
@@ -358,7 +358,8 @@ def _generate_enqueue_and_set_args_module(function_name,
     return gen.get_picklable_module(), enqueue_name
 
 
-invoker_cache = PersistentDict("pyopencl-invoker-cache-v1",
+invoker_cache = WriteOncePersistentDict(
+        "pyopencl-invoker-cache-v1",
         key_builder=_NumpyTypesKeyBuilder())
 
 
@@ -381,7 +382,10 @@ def generate_enqueue_and_set_args(function_name,
 
     if not from_cache:
         result = _generate_enqueue_and_set_args_module(*cache_key)
-        invoker_cache[cache_key] = result
+        try:
+            invoker_cache[cache_key] = result
+        except ReadOnlyEntryError:
+            pass
 
     pmod, enqueue_name = result
 
diff --git a/pyopencl/scan.py b/pyopencl/scan.py
index 169939ca..1fa25db1 100644
--- a/pyopencl/scan.py
+++ b/pyopencl/scan.py
@@ -40,7 +40,7 @@ from pyopencl.tools import (dtype_to_ctype, bitlog2,
 import pyopencl._mymako as mako
 from pyopencl._cluda import CLUDA_PREAMBLE
 
-from pytools.persistent_dict import PersistentDict
+from pytools.persistent_dict import WriteOncePersistentDict, ReadOnlyEntryError
 
 
 import logging
@@ -1132,7 +1132,7 @@ class _GenericScanKernelBase(object):
     # }}}
 
 
-generic_scan_kernel_cache = PersistentDict(
+generic_scan_kernel_cache = WriteOncePersistentDict(
         "pyopencl-generated-scan-kernel-cache-v1",
         key_builder=_NumpyTypesKeyBuilder())
 
@@ -1187,7 +1187,10 @@ class GenericScanKernel(_GenericScanKernelBase):
                       self.second_level_scan_gen_info,
                       self.final_update_gen_info)
 
-            generic_scan_kernel_cache[cache_key] = result
+            try:
+                generic_scan_kernel_cache[cache_key] = result
+            except ReadOnlyEntryError:
+                pass
 
         # Build the kernels.
         self.first_level_scan_info = self.first_level_scan_gen_info.build(
diff --git a/setup.py b/setup.py
index d487cc1c..5705e945 100644
--- a/setup.py
+++ b/setup.py
@@ -225,7 +225,7 @@ def main():
 
             install_requires=[
                 "numpy",
-                "pytools>=2017.2",
+                "pytools>=2017.5",
                 "pytest>=2",
                 "decorator>=3.2.0",
                 "cffi>=1.1.0",
-- 
GitLab