Skip to content

Commit d06806c

Browse files
author
Jonathan Warren
committed
Merge pull request #287 from Atheros1/master
gevent
2 parents 5f87415 + 21ce1f5 commit d06806c

10 files changed

Lines changed: 583 additions & 515 deletions

src/bitmessagemain.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@
1010
# The software version variable is now held in shared.py
1111

1212
#import ctypes
13+
try:
14+
from gevent import monkey
15+
monkey.patch_all()
16+
except ImportError as ex:
17+
print "cannot find gevent"
18+
1319
import signal # Used to capture a Ctrl-C keypress so that Bitmessage can shutdown gracefully.
1420
# The next 3 are used for the API
1521
from SimpleXMLRPCServer import *
@@ -459,9 +465,9 @@ def _dispatch(self, method, params):
459465
status, addressVersionNumber, streamNumber, toRipe = decodeAddress(
460466
toAddress)
461467
if status != 'success':
462-
shared.printLock.acquire()
463-
print 'API Error 0007: Could not decode address:', toAddress, ':', status
464-
shared.printLock.release()
468+
with shared.printLock:
469+
print 'API Error 0007: Could not decode address:', toAddress, ':', status
470+
465471
if status == 'checksumfailed':
466472
return 'API Error 0008: Checksum failed for address: ' + toAddress
467473
if status == 'invalidcharacters':
@@ -476,9 +482,9 @@ def _dispatch(self, method, params):
476482
status, addressVersionNumber, streamNumber, fromRipe = decodeAddress(
477483
fromAddress)
478484
if status != 'success':
479-
shared.printLock.acquire()
480-
print 'API Error 0007: Could not decode address:', fromAddress, ':', status
481-
shared.printLock.release()
485+
with shared.printLock:
486+
print 'API Error 0007: Could not decode address:', fromAddress, ':', status
487+
482488
if status == 'checksumfailed':
483489
return 'API Error 0008: Checksum failed for address: ' + fromAddress
484490
if status == 'invalidcharacters':
@@ -541,9 +547,9 @@ def _dispatch(self, method, params):
541547
status, addressVersionNumber, streamNumber, fromRipe = decodeAddress(
542548
fromAddress)
543549
if status != 'success':
544-
shared.printLock.acquire()
545-
print 'API Error 0007: Could not decode address:', fromAddress, ':', status
546-
shared.printLock.release()
550+
with shared.printLock:
551+
print 'API Error 0007: Could not decode address:', fromAddress, ':', status
552+
547553
if status == 'checksumfailed':
548554
return 'API Error 0008: Checksum failed for address: ' + fromAddress
549555
if status == 'invalidcharacters':
@@ -612,9 +618,9 @@ def _dispatch(self, method, params):
612618
status, addressVersionNumber, streamNumber, toRipe = decodeAddress(
613619
address)
614620
if status != 'success':
615-
shared.printLock.acquire()
616-
print 'API Error 0007: Could not decode address:', address, ':', status
617-
shared.printLock.release()
621+
with shared.printLock:
622+
print 'API Error 0007: Could not decode address:', address, ':', status
623+
618624
if status == 'checksumfailed':
619625
return 'API Error 0008: Checksum failed for address: ' + address
620626
if status == 'invalidcharacters':
@@ -741,9 +747,9 @@ def run(self):
741747
except:
742748
apiNotifyPath = ''
743749
if apiNotifyPath != '':
744-
shared.printLock.acquire()
745-
print 'Trying to call', apiNotifyPath
746-
shared.printLock.release()
750+
with shared.printLock:
751+
print 'Trying to call', apiNotifyPath
752+
747753
call([apiNotifyPath, "startingUp"])
748754
singleAPIThread = singleAPI()
749755
singleAPIThread.daemon = True # close the main program even if there are threads left
@@ -774,9 +780,9 @@ def run(self):
774780
import bitmessageqt
775781
bitmessageqt.run()
776782
else:
777-
shared.printLock.acquire()
778-
print 'Running as a daemon. You can use Ctrl+C to exit.'
779-
shared.printLock.release()
783+
with shared.printLock:
784+
print 'Running as a daemon. You can use Ctrl+C to exit.'
785+
780786
while True:
781787
time.sleep(20)
782788

src/bitmessageqt/__init__.py

Lines changed: 78 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,9 +1288,9 @@ def click_pushButtonSend(self):
12881288
status, addressVersionNumber, streamNumber, ripe = decodeAddress(
12891289
toAddress)
12901290
if status != 'success':
1291-
shared.printLock.acquire()
1292-
print 'Error: Could not decode', toAddress, ':', status
1293-
shared.printLock.release()
1291+
with shared.printLock:
1292+
print 'Error: Could not decode', toAddress, ':', status
1293+
12941294
if status == 'missingbm':
12951295
self.statusBar().showMessage(_translate(
12961296
"MainWindow", "Error: Bitmessage addresses start with BM- Please check %1").arg(toAddress))
@@ -2621,9 +2621,9 @@ def writeNewAddressToTable(self, label, address, streamNumber):
26212621

26222622
def updateStatusBar(self, data):
26232623
if data != "":
2624-
shared.printLock.acquire()
2625-
print 'Status bar:', data
2626-
shared.printLock.release()
2624+
with shared.printLock:
2625+
print 'Status bar:', data
2626+
26272627
self.statusBar().showMessage(data)
26282628

26292629

@@ -2875,59 +2875,80 @@ class myTableWidgetItem(QTableWidgetItem):
28752875
def __lt__(self, other):
28762876
return int(self.data(33).toPyObject()) < int(other.data(33).toPyObject())
28772877

2878-
2879-
class UISignaler(QThread):
2878+
from threading import Thread
2879+
class UISignaler(Thread,QThread):
28802880

28812881
def __init__(self, parent=None):
2882+
Thread.__init__(self, parent)
28822883
QThread.__init__(self, parent)
28832884

28842885
def run(self):
28852886
while True:
2886-
command, data = shared.UISignalQueue.get()
2887-
if command == 'writeNewAddressToTable':
2888-
label, address, streamNumber = data
2889-
self.emit(SIGNAL(
2890-
"writeNewAddressToTable(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), label, address, str(streamNumber))
2891-
elif command == 'updateStatusBar':
2892-
self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"), data)
2893-
elif command == 'updateSentItemStatusByHash':
2894-
hash, message = data
2895-
self.emit(SIGNAL(
2896-
"updateSentItemStatusByHash(PyQt_PyObject,PyQt_PyObject)"), hash, message)
2897-
elif command == 'updateSentItemStatusByAckdata':
2898-
ackData, message = data
2899-
self.emit(SIGNAL(
2900-
"updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"), ackData, message)
2901-
elif command == 'displayNewInboxMessage':
2902-
inventoryHash, toAddress, fromAddress, subject, body = data
2903-
self.emit(SIGNAL(
2904-
"displayNewInboxMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),
2905-
inventoryHash, toAddress, fromAddress, subject, body)
2906-
elif command == 'displayNewSentMessage':
2907-
toAddress, fromLabel, fromAddress, subject, message, ackdata = data
2908-
self.emit(SIGNAL(
2909-
"displayNewSentMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),
2910-
toAddress, fromLabel, fromAddress, subject, message, ackdata)
2911-
elif command == 'updateNetworkStatusTab':
2912-
self.emit(SIGNAL("updateNetworkStatusTab()"))
2913-
elif command == 'incrementNumberOfMessagesProcessed':
2914-
self.emit(SIGNAL("incrementNumberOfMessagesProcessed()"))
2915-
elif command == 'incrementNumberOfPubkeysProcessed':
2916-
self.emit(SIGNAL("incrementNumberOfPubkeysProcessed()"))
2917-
elif command == 'incrementNumberOfBroadcastsProcessed':
2918-
self.emit(SIGNAL("incrementNumberOfBroadcastsProcessed()"))
2919-
elif command == 'setStatusIcon':
2920-
self.emit(SIGNAL("setStatusIcon(PyQt_PyObject)"), data)
2921-
elif command == 'rerenderInboxFromLabels':
2922-
self.emit(SIGNAL("rerenderInboxFromLabels()"))
2923-
elif command == 'rerenderSubscriptions':
2924-
self.emit(SIGNAL("rerenderSubscriptions()"))
2925-
elif command == 'removeInboxRowByMsgid':
2926-
self.emit(SIGNAL("removeInboxRowByMsgid(PyQt_PyObject)"), data)
2927-
else:
2928-
sys.stderr.write(
2929-
'Command sent to UISignaler not recognized: %s\n' % command)
2887+
try:
2888+
command, data = shared.UISignalQueue.get()
2889+
if command == 'writeNewAddressToTable':
2890+
label, address, streamNumber = data
2891+
self.emit(SIGNAL(
2892+
"writeNewAddressToTable(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), label, address, str(streamNumber))
2893+
elif command == 'updateStatusBar':
2894+
self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"), data)
2895+
elif command == 'updateSentItemStatusByHash':
2896+
hash, message = data
2897+
self.emit(SIGNAL(
2898+
"updateSentItemStatusByHash(PyQt_PyObject,PyQt_PyObject)"), hash, message)
2899+
elif command == 'updateSentItemStatusByAckdata':
2900+
ackData, message = data
2901+
self.emit(SIGNAL(
2902+
"updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"), ackData, message)
2903+
elif command == 'displayNewInboxMessage':
2904+
inventoryHash, toAddress, fromAddress, subject, body = data
2905+
self.emit(SIGNAL(
2906+
"displayNewInboxMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),
2907+
inventoryHash, toAddress, fromAddress, subject, body)
2908+
elif command == 'displayNewSentMessage':
2909+
toAddress, fromLabel, fromAddress, subject, message, ackdata = data
2910+
self.emit(SIGNAL(
2911+
"displayNewSentMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),
2912+
toAddress, fromLabel, fromAddress, subject, message, ackdata)
2913+
elif command == 'updateNetworkStatusTab':
2914+
self.emit(SIGNAL("updateNetworkStatusTab()"))
2915+
elif command == 'incrementNumberOfMessagesProcessed':
2916+
self.emit(SIGNAL("incrementNumberOfMessagesProcessed()"))
2917+
elif command == 'incrementNumberOfPubkeysProcessed':
2918+
self.emit(SIGNAL("incrementNumberOfPubkeysProcessed()"))
2919+
elif command == 'incrementNumberOfBroadcastsProcessed':
2920+
self.emit(SIGNAL("incrementNumberOfBroadcastsProcessed()"))
2921+
elif command == 'setStatusIcon':
2922+
self.emit(SIGNAL("setStatusIcon(PyQt_PyObject)"), data)
2923+
elif command == 'rerenderInboxFromLabels':
2924+
self.emit(SIGNAL("rerenderInboxFromLabels()"))
2925+
elif command == 'rerenderSubscriptions':
2926+
self.emit(SIGNAL("rerenderSubscriptions()"))
2927+
elif command == 'removeInboxRowByMsgid':
2928+
self.emit(SIGNAL("removeInboxRowByMsgid(PyQt_PyObject)"), data)
2929+
else:
2930+
sys.stderr.write(
2931+
'Command sent to UISignaler not recognized: %s\n' % command)
2932+
except Exception,ex:
2933+
# uncaught exception will block gevent
2934+
import traceback
2935+
traceback.print_exc()
2936+
traceback.print_stack()
2937+
print ex
2938+
pass
29302939

2940+
try:
2941+
import gevent
2942+
except ImportError as ex:
2943+
gevent = None
2944+
else:
2945+
def mainloop(app):
2946+
while True:
2947+
app.processEvents()
2948+
gevent.sleep(0.01)
2949+
def testprint():
2950+
#print 'this is running'
2951+
gevent.spawn_later(1, testprint)
29312952

29322953
def run():
29332954
app = QtGui.QApplication(sys.argv)
@@ -2946,5 +2967,8 @@ def run():
29462967
myapp.appIndicatorInit(app)
29472968
myapp.ubuntuMessagingMenuInit()
29482969
myapp.notifierInit()
2949-
2950-
sys.exit(app.exec_())
2970+
if gevent is None:
2971+
sys.exit(app.exec_())
2972+
else:
2973+
gevent.joinall([gevent.spawn(testprint), gevent.spawn(mainloop, app), gevent.spawn(mainloop, app), gevent.spawn(mainloop, app), gevent.spawn(mainloop, app), gevent.spawn(mainloop, app)])
2974+
print 'done'

src/class_bgWorker.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#! /usr/bin/python
2+
# -*- coding: utf-8 -*-
3+
# cody by linker.lin@me.com
4+
5+
__author__ = 'linkerlin'
6+
7+
8+
import threading
9+
import Queue
10+
import time
11+
12+
class bgWorker(threading.Thread):
13+
def __init__(self):
14+
threading.Thread.__init__(self)
15+
self.q = Queue.Queue()
16+
self.setDaemon(True)
17+
18+
def post(self,job):
19+
self.q.put(job)
20+
21+
def run(self):
22+
while 1:
23+
job=None
24+
try:
25+
job = self.q.get(block=True)
26+
if job:
27+
job()
28+
except Exception as ex:
29+
print "Error,job exception:",ex.message,type(ex)
30+
time.sleep(0.05)
31+
else:
32+
#print "job: ", job, " done"
33+
pass
34+
finally:
35+
time.sleep(0.05)
36+
37+
bgworker = bgWorker()
38+
bgworker.start()

src/class_outgoingSynSender.py

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,15 @@ def run(self):
6161
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
6262
sock.settimeout(20)
6363
if shared.config.get('bitmessagesettings', 'socksproxytype') == 'none' and shared.verbose >= 2:
64-
shared.printLock.acquire()
65-
print 'Trying an outgoing connection to', HOST, ':', PORT
66-
shared.printLock.release()
64+
with shared.printLock:
65+
print 'Trying an outgoing connection to', HOST, ':', PORT
66+
6767
# sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
6868
elif shared.config.get('bitmessagesettings', 'socksproxytype') == 'SOCKS4a':
6969
if shared.verbose >= 2:
70-
shared.printLock.acquire()
71-
print '(Using SOCKS4a) Trying an outgoing connection to', HOST, ':', PORT
72-
shared.printLock.release()
70+
with shared.printLock:
71+
print '(Using SOCKS4a) Trying an outgoing connection to', HOST, ':', PORT
72+
7373
proxytype = socks.PROXY_TYPE_SOCKS4
7474
sockshostname = shared.config.get(
7575
'bitmessagesettings', 'sockshostname')
@@ -88,9 +88,9 @@ def run(self):
8888
proxytype, sockshostname, socksport, rdns)
8989
elif shared.config.get('bitmessagesettings', 'socksproxytype') == 'SOCKS5':
9090
if shared.verbose >= 2:
91-
shared.printLock.acquire()
92-
print '(Using SOCKS5) Trying an outgoing connection to', HOST, ':', PORT
93-
shared.printLock.release()
91+
with shared.printLock:
92+
print '(Using SOCKS5) Trying an outgoing connection to', HOST, ':', PORT
93+
9494
proxytype = socks.PROXY_TYPE_SOCKS5
9595
sockshostname = shared.config.get(
9696
'bitmessagesettings', 'sockshostname')
@@ -116,9 +116,9 @@ def run(self):
116116
rd.setup(sock, HOST, PORT, self.streamNumber,
117117
someObjectsOfWhichThisRemoteNodeIsAlreadyAware, self.selfInitiatedConnections)
118118
rd.start()
119-
shared.printLock.acquire()
120-
print self, 'connected to', HOST, 'during an outgoing attempt.'
121-
shared.printLock.release()
119+
with shared.printLock:
120+
print self, 'connected to', HOST, 'during an outgoing attempt.'
121+
122122

123123
sd = sendDataThread()
124124
sd.setup(sock, HOST, PORT, self.streamNumber,
@@ -128,18 +128,18 @@ def run(self):
128128

129129
except socks.GeneralProxyError as err:
130130
if shared.verbose >= 2:
131-
shared.printLock.acquire()
132-
print 'Could NOT connect to', HOST, 'during outgoing attempt.', err
133-
shared.printLock.release()
131+
with shared.printLock:
132+
print 'Could NOT connect to', HOST, 'during outgoing attempt.', err
133+
134134
PORT, timeLastSeen = shared.knownNodes[
135135
self.streamNumber][HOST]
136136
if (int(time.time()) - timeLastSeen) > 172800 and len(shared.knownNodes[self.streamNumber]) > 1000: # for nodes older than 48 hours old if we have more than 1000 hosts in our list, delete from the shared.knownNodes data-structure.
137137
shared.knownNodesLock.acquire()
138138
del shared.knownNodes[self.streamNumber][HOST]
139139
shared.knownNodesLock.release()
140-
shared.printLock.acquire()
141-
print 'deleting ', HOST, 'from shared.knownNodes because it is more than 48 hours old and we could not connect to it.'
142-
shared.printLock.release()
140+
with shared.printLock:
141+
print 'deleting ', HOST, 'from shared.knownNodes because it is more than 48 hours old and we could not connect to it.'
142+
143143
except socks.Socks5AuthError as err:
144144
shared.UISignalQueue.put((
145145
'updateStatusBar', tr.translateText(
@@ -154,18 +154,18 @@ def run(self):
154154
print 'Bitmessage MIGHT be having trouble connecting to the SOCKS server. ' + str(err)
155155
else:
156156
if shared.verbose >= 1:
157-
shared.printLock.acquire()
158-
print 'Could NOT connect to', HOST, 'during outgoing attempt.', err
159-
shared.printLock.release()
157+
with shared.printLock:
158+
print 'Could NOT connect to', HOST, 'during outgoing attempt.', err
159+
160160
PORT, timeLastSeen = shared.knownNodes[
161161
self.streamNumber][HOST]
162162
if (int(time.time()) - timeLastSeen) > 172800 and len(shared.knownNodes[self.streamNumber]) > 1000: # for nodes older than 48 hours old if we have more than 1000 hosts in our list, delete from the knownNodes data-structure.
163163
shared.knownNodesLock.acquire()
164164
del shared.knownNodes[self.streamNumber][HOST]
165165
shared.knownNodesLock.release()
166-
shared.printLock.acquire()
167-
print 'deleting ', HOST, 'from knownNodes because it is more than 48 hours old and we could not connect to it.'
168-
shared.printLock.release()
166+
with shared.printLock:
167+
print 'deleting ', HOST, 'from knownNodes because it is more than 48 hours old and we could not connect to it.'
168+
169169
except Exception as err:
170170
sys.stderr.write(
171171
'An exception has occurred in the outgoingSynSender thread that was not caught by other exception types: ')

0 commit comments

Comments
 (0)