Remove subthread locks
[canto-curses.git] / canto_curses / subthread.py
1 # -*- coding: utf-8 -*-
2 #Canto-curses - ncurses RSS reader
3 #   Copyright (C) 2014 Jack Miller <jack@codezen.org>
4 #
5 #   This program is free software; you can redistribute it and/or modify
6 #   it under the terms of the GNU General Public License version 2 as 
7 #   published by the Free Software Foundation.
8
9 # SubThread is just a basic wrapper for a sub connection from the backend that
10 # dispatches to sub functions based on socket traffic
11
12 from threading import Thread, Lock
13 import traceback
14 import logging
15
16 log = logging.getLogger("SUBTHREAD")
17
18 class SubThread(object):
19     def init(self, backend):
20         self.backend = backend
21
22         # Start up our own connection
23         self.conn = backend.connect()
24         self.prot_thread = None
25         self.alive = False
26
27     def prot_except(self, exception):
28         log.error("%s" % exception)
29
30     def prot_errors(self, errors):
31         for key in list(errors.keys()):
32             for val, error in errors[key]:
33                 log.error("%s = %s : %s" % (key, val, error))
34
35     def prot_info(self, info):
36         log.info("%s" % info)
37
38     def write(self, cmd, args):
39         return self.backend.do_write(self.conn, cmd, args)
40
41     def read(self):
42         return self.backend.do_read(self.conn)
43
44     def pthread(self):
45         self.alive = True
46
47         try:
48             while self.alive:
49                 r = self.read()
50
51                 if not r:
52                     continue
53
54                 # HUP
55                 if r == 16:
56                     self.alive = False
57                     break
58
59                 cmd, args = r
60                 protfunc = "prot_" + cmd.lower()
61                 if hasattr(self, protfunc):
62                     getattr(self, protfunc)(args)
63
64                     # For test-suite
65                     if hasattr(self.backend, "processed"):
66                         self.backend.processed(cmd, args)
67
68                 else:
69                     log.error("Unknown response?")
70                     log.error("%s - %s" % (cmd, args))
71         except Exception as e:
72             log.error("Thread exception: %s" % (e,))
73             log.error(''.join(traceback.format_exc()))
74
75         log.info("Thread exiting - disconnected\nAny further changes will be forgotten!")
76
77     def start_pthread(self):
78         self.prot_thread = Thread(target=self.pthread)
79         self.prot_thread.daemon = True
80         self.prot_thread.start()
81