Changeset 33528b4 for server


Ignore:
Timestamp:
Jan 21, 2012, 7:25:17 PM (12 years ago)
Author:
Jessica B. Hamrick <jhamrick@…>
Branches:
no-cups
Children:
5e70cc2
Parents:
7daf25f
git-author:
Jessica B. Hamrick <jhamrick@…> (01/21/12 19:25:17)
git-committer:
Jessica B. Hamrick <jhamrick@…> (01/21/12 19:25:17)
Message:

Fix printer threading issues

File:
1 edited

Legend:

Unmodified
Added
Removed
  • server/lib/gutenbach/server/printer.py

    r57bc2dc r33528b4  
    8585
    8686        self.lock = threading.RLock()
    87         self.running = False
     87        self._running = False
    8888        self.paused = False
    8989
     
    9191        self._next_job_id = 1
    9292
     93    @sync
    9394    def __repr__(self):
    9495        return str(self)
    9596
     97    @sync
    9698    def __str__(self):
    97         return "<Printer '%s'>" % self.name 
     99        return "<Printer '%s'>" % self.name
    98100
    99101    def run(self):
    100         self.running = True
    101         while self.running:
    102             with self.lock:
    103                 try:
    104                     if not self.paused and self.current_job is None:
     102        self._running = True
     103        while self._running:
     104            try:
     105                with self.lock:
     106                    if self.current_job is None:
    105107                        self.start_job()
    106108                    elif self.current_job.is_done:
    107109                        self.complete_job()
    108                 except:
    109                     logger.fatal(traceback.format_exc())
    110                     sys.exit(1)
     110            except:
     111                logger.fatal(traceback.format_exc())
     112                sys.exit(1)
    111113            time.sleep(0.1)
     114
     115    def stop(self):
     116        with self.lock:
     117            self._running = False
     118        if self.ident is not None and self.isAlive():
     119            self.join()
    112120
    113121    ######################################################################
     
    143151        return jobs
    144152
     153    @property
     154    def is_running(self):
     155        running = self.ident is not None and self.isAlive() and self._running
     156        return running
     157
    145158    ######################################################################
    146159    ###                            Methods                             ###
     
    149162    @sync
    150163    def start_job(self):
    151         if self.current_job is None:
     164        if not self.paused and self.current_job is None:
    152165            try:
    153166                job_id = heapq.heappop(self.pending_jobs)
     
    162175    @sync
    163176    def complete_job(self):
    164         if self.current_job is None:
    165             return
    166 
    167         try:
    168             if not self.current_job.is_done:
    169                 self.current_job.stop()
    170         finally:
    171             self.finished_jobs.append(self.current_job.id)
    172             self.current_job = None
     177        if not self.paused and self.current_job is not None:
     178            try:
     179                if not self.current_job.is_done:
     180                    self.current_job.stop()
     181            finally:
     182                self.finished_jobs.append(self.current_job.id)
     183                self.current_job = None
    173184
    174185    @sync
     
    450461        Does nothing if the printer is already paused.
    451462        """
    452         if self.paused:
    453             return
    454 
    455         if self.current_job is not None and self.current_job.is_playing:
    456             self.current_job.pause()
    457 
    458         self.paused = True
     463       
     464        if not self.paused:
     465            if self.current_job is not None and self.current_job.is_playing:
     466                self.current_job.pause()
     467            self.paused = True
     468            logger.info("%s paused", str(self))
    459469
    460470    @sync
     
    464474        Does nothing if the printer is not paused.
    465475        """
    466         if not self.paused:
    467             return
    468 
    469         if self.current_job is not None:
    470             self.current_job.resume()
    471 
    472         self.paused = False
     476       
     477        if self.paused:
     478            if self.current_job is not None:
     479                self.current_job.resume()
     480            self.paused = False
     481            logger.info("%s unpaused", str(self))
    473482
    474483    @sync
Note: See TracChangeset for help on using the changeset viewer.