1
0
forked from ScoDoc/ScoDoc

disable PDF lock (unnecessary in ScoDoc 9)

This commit is contained in:
Emmanuel Viennet 2021-08-22 07:47:06 +02:00
parent f47128a7af
commit 12b903f02e

View File

@ -30,13 +30,17 @@
reportlab n'est pas réentrante: il ne faut qu'une seule opération PDF au même moment. reportlab n'est pas réentrante: il ne faut qu'une seule opération PDF au même moment.
Tout accès à ReportLab doit donc être précédé d'un PDFLOCK.acquire() Tout accès à ReportLab doit donc être précédé d'un PDFLOCK.acquire()
et terminé par un PDFLOCK.release() et terminé par un PDFLOCK.release()
En ScoDoc 9, ce n'est pas nécessaire car on est multiptocessus / monothread.
""" """
import io import io
import time
import re
import os import os
import unicodedata import queue
import re
import threading
import time
import traceback import traceback
import unicodedata
import reportlab import reportlab
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Frame, PageBreak from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Frame, PageBreak
@ -63,7 +67,6 @@ from app.scodoc.sco_utils import (
from app.scodoc.notes_log import log from app.scodoc.notes_log import log
from app.scodoc.sco_exceptions import ScoGenError from app.scodoc.sco_exceptions import ScoGenError
import sco_version import sco_version
import six
PAGE_HEIGHT = defaultPageSize[1] PAGE_HEIGHT = defaultPageSize[1]
PAGE_WIDTH = defaultPageSize[0] PAGE_WIDTH = defaultPageSize[0]
@ -337,14 +340,14 @@ import threading, time, six.moves.queue, six.moves._thread
class PDFLock(object): class PDFLock(object):
def __init__(self, timeout=15): def __init__(self, timeout=15):
self.Q = six.moves.queue.Queue(1) self.Q = queue.Queue(1)
self.timeout = timeout self.timeout = timeout
self.current_thread = None self.current_thread = None
self.nref = 0 self.nref = 0
def release(self): def release(self):
"Release lock. Raise Empty if not acquired first" "Release lock. Raise Empty if not acquired first"
if self.current_thread == six.moves._thread.get_ident(): if self.current_thread == threading.get_ident():
self.nref -= 1 self.nref -= 1
if self.nref == 0: if self.nref == 0:
log("PDFLock: release from %s" % self.current_thread) log("PDFLock: release from %s" % self.current_thread)
@ -356,16 +359,32 @@ class PDFLock(object):
def acquire(self): def acquire(self):
"Acquire lock. Raise ScoGenError if can't lock after timeout." "Acquire lock. Raise ScoGenError if can't lock after timeout."
if self.current_thread == six.moves._thread.get_ident(): if self.current_thread == threading.get_ident():
self.nref += 1 self.nref += 1
return # deja lock pour ce thread return # deja lock pour ce thread
try: try:
self.Q.put(1, True, self.timeout) self.Q.put(1, True, self.timeout)
except six.moves.queue.Full: except queue.Full:
raise ScoGenError(msg="Traitement PDF occupé: ré-essayez") raise ScoGenError(msg="Traitement PDF occupé: ré-essayez")
self.current_thread = six.moves._thread.get_ident() self.current_thread = threading.get_ident()
self.nref = 1 self.nref = 1
log("PDFLock: granted to %s" % self.current_thread) log("PDFLock: granted to %s" % self.current_thread)
PDFLOCK = PDFLock() class FakeLock:
"Pour ScoDoc 9: pas de verrou"
def __init__(self, timeout=15):
self.timeout = timeout
self.current_thread = threading.get_ident()
def acquire(self):
assert threading.get_ident() == self.current_thread
pass
def release(self):
assert threading.get_ident() == self.current_thread
pass
PDFLOCK = FakeLock()