[FIX] hw_scanner, hw_escpos: prevent driver threads from deadlocking when woken by...
authorFrédéric van der Essen <fva@openerp.com>
Thu, 6 Feb 2014 14:05:24 +0000 (15:05 +0100)
committerFrédéric van der Essen <fva@openerp.com>
Thu, 6 Feb 2014 14:05:24 +0000 (15:05 +0100)
bzr revid: fva@openerp.com-20140206140524-ur51ghcpdzwxv1yr

addons/hw_escpos/controllers/main.py
addons/hw_scanner/controllers/main.py

index 5230731..318f117 100644 (file)
@@ -11,7 +11,7 @@ import math
 import md5
 import openerp.addons.hw_proxy.controllers.main as hw_proxy
 import subprocess
-from threading import Thread
+from threading import Thread, Lock
 from Queue import Queue, Empty
 
 try:
@@ -39,6 +39,7 @@ class EscposDriver(Thread):
     def __init__(self):
         Thread.__init__(self)
         self.queue = Queue()
+        self.lock  = Lock()
         self.status = {'status':'connecting', 'messages':[]}
 
     def connected_usb_devices(self):
@@ -47,6 +48,12 @@ class EscposDriver(Thread):
             if usb.core.find(idVendor=device['vendor'], idProduct=device['product']) != None:
                 connected.append(device)
         return connected
+
+    def lockedstart(self):
+        self.lock.acquire()
+        if not self.isAlive():
+            self.start()
+        self.lock.release()
     
     def get_escpos_printer(self):
         try:
@@ -113,8 +120,7 @@ class EscposDriver(Thread):
                 _logger.error(e);
 
     def push_task(self,task, data = None):
-        if not self.isAlive():
-            self.start()
+        self.lockedstart()
         self.queue.put((time.time(),task,data))
 
     def print_receipt_body(self,eprint,receipt):
index 105856a..8fbdae6 100644 (file)
@@ -4,7 +4,7 @@ import os
 import time
 from os import listdir
 from os.path import join
-from threading import Thread
+from threading import Thread, Lock
 from select import select
 from Queue import Queue, Empty
 
@@ -26,6 +26,7 @@ except ImportError:
 class Scanner(Thread):
     def __init__(self):
         Thread.__init__(self)
+        self.lock = Lock()
         self.status = {'status':'connecting', 'messages':[]}
         self.input_dir = '/dev/input/by-id/'
         self.barcodes = Queue()
@@ -86,6 +87,12 @@ class Scanner(Thread):
             57:(" "," "),
         }
 
+    def lockedstart(self):
+        self.lock.acquire()
+        if not self.isAlive():
+            self.start()
+        self.lock.release()
+
     def set_status(self, status, message = None):
         if status == self.status['status']:
             if message != None and message != self.status['messages'][-1]:
@@ -102,8 +109,6 @@ class Scanner(Thread):
         elif status == 'disconnected' and message:
             _logger.warning('Disconnected Barcode Scanner: '+message)
 
-            
-
     def get_device(self):
         try:
             if not evdev:
@@ -135,6 +140,8 @@ class Scanner(Thread):
             busy reading another barcode
         """
 
+        self.lockedstart()
+
         while True:
             try:
                 timestamp, barcode = self.barcodes.get(True, 5)
@@ -144,8 +151,7 @@ class Scanner(Thread):
                 return ''
     
     def get_status(self):
-        if not s.isAlive():
-            s.start()
+        self.lockedstart()
         return self.status
 
     def run(self):
@@ -209,7 +215,6 @@ hw_proxy.drivers['scanner'] = s
 class ScannerDriver(hw_proxy.Proxy):
     @http.route('/hw_proxy/scanner', type='json', auth='none', cors='*')
     def scanner(self):
-        if not s.isAlive():
-            s.start()
         return s.get_barcode()
         
+