Make file based Storage thread safe.
diff --git a/apiclient/ext/file.py b/apiclient/ext/file.py
index dba723e..a243fd2 100644
--- a/apiclient/ext/file.py
+++ b/apiclient/ext/file.py
@@ -8,6 +8,7 @@
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
import pickle
+import threading
from apiclient.oauth import Storage as BaseStorage
@@ -17,6 +18,7 @@
def __init__(self, filename):
self._filename = filename
+ self._lock = threading.Lock()
def get(self):
"""Retrieve Credential from file.
@@ -24,6 +26,7 @@
Returns:
apiclient.oauth.Credentials
"""
+ self._lock.acquire()
try:
f = open(self._filename, 'r')
credentials = pickle.loads(f.read())
@@ -31,6 +34,7 @@
credentials.set_store(self.put)
except:
credentials = None
+ self._lock.release()
return credentials
@@ -40,6 +44,8 @@
Args:
credentials: Credentials, the credentials to store.
"""
+ self._lock.acquire()
f = open(self._filename, 'w')
f.write(pickle.dumps(credentials))
f.close()
+ self._lock.release()
diff --git a/oauth2client/file.py b/oauth2client/file.py
index 12dee91..b72e3c5 100644
--- a/oauth2client/file.py
+++ b/oauth2client/file.py
@@ -9,6 +9,7 @@
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
import pickle
+import threading
from client import Storage as BaseStorage
@@ -18,6 +19,7 @@
def __init__(self, filename):
self._filename = filename
+ self._lock = threading.Lock()
def get(self):
"""Retrieve Credential from file.
@@ -25,6 +27,7 @@
Returns:
oauth2client.client.Credentials
"""
+ self._lock.acquire()
try:
f = open(self._filename, 'r')
credentials = pickle.loads(f.read())
@@ -32,6 +35,7 @@
credentials.set_store(self.put)
except:
credentials = None
+ self._lock.release()
return credentials
@@ -41,6 +45,8 @@
Args:
credentials: Credentials, the credentials to store.
"""
+ self._lock.acquire()
f = open(self._filename, 'w')
f.write(pickle.dumps(credentials))
f.close()
+ self._lock.release()