Hide bmpow output and relog it
using contextmanager found in https://stackoverflow.com/questions/5081657. Fixes: #1571
This commit is contained in:
parent
7ce0180eed
commit
174dffb360
|
@ -7,6 +7,7 @@ import ctypes
|
||||||
import hashlib
|
import hashlib
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import tempfile
|
||||||
import time
|
import time
|
||||||
from struct import pack, unpack
|
from struct import pack, unpack
|
||||||
from subprocess import call
|
from subprocess import call
|
||||||
|
@ -23,6 +24,42 @@ bitmsglib = 'bitmsghash.so'
|
||||||
bmpow = None
|
bmpow = None
|
||||||
|
|
||||||
|
|
||||||
|
class LogOutput(object): # pylint: disable=too-few-public-methods
|
||||||
|
"""
|
||||||
|
A context manager that block stdout for its scope
|
||||||
|
and appends it's content to log before exit. Usage::
|
||||||
|
|
||||||
|
with LogOutput():
|
||||||
|
os.system('ls -l')
|
||||||
|
|
||||||
|
https://stackoverflow.com/questions/5081657
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, prefix='PoW'):
|
||||||
|
self.prefix = prefix
|
||||||
|
sys.stdout.flush()
|
||||||
|
self._stdout = sys.stdout
|
||||||
|
self._stdout_fno = os.dup(sys.stdout.fileno())
|
||||||
|
self._dst, self._filepath = tempfile.mkstemp()
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
stdout = os.dup(1)
|
||||||
|
os.dup2(self._dst, 1)
|
||||||
|
os.close(self._dst)
|
||||||
|
sys.stdout = os.fdopen(stdout, 'w')
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
|
sys.stdout.close()
|
||||||
|
sys.stdout = self._stdout
|
||||||
|
sys.stdout.flush()
|
||||||
|
os.dup2(self._stdout_fno, 1)
|
||||||
|
|
||||||
|
with open(self._filepath) as out:
|
||||||
|
for line in out:
|
||||||
|
logger.info('%s: %s', self.prefix, line)
|
||||||
|
os.remove(self._filepath)
|
||||||
|
|
||||||
|
|
||||||
def _set_idle():
|
def _set_idle():
|
||||||
if 'linux' in sys.platform:
|
if 'linux' in sys.platform:
|
||||||
os.nice(20)
|
os.nice(20)
|
||||||
|
@ -109,12 +146,14 @@ def _doFastPoW(target, initialHash):
|
||||||
|
|
||||||
|
|
||||||
def _doCPoW(target, initialHash):
|
def _doCPoW(target, initialHash):
|
||||||
|
with LogOutput():
|
||||||
h = initialHash
|
h = initialHash
|
||||||
m = target
|
m = target
|
||||||
out_h = ctypes.pointer(ctypes.create_string_buffer(h, 64))
|
out_h = ctypes.pointer(ctypes.create_string_buffer(h, 64))
|
||||||
out_m = ctypes.c_ulonglong(m)
|
out_m = ctypes.c_ulonglong(m)
|
||||||
logger.debug("C PoW start")
|
logger.debug("C PoW start")
|
||||||
nonce = bmpow(out_h, out_m)
|
nonce = bmpow(out_h, out_m)
|
||||||
|
|
||||||
trialValue, = unpack('>Q', hashlib.sha512(hashlib.sha512(pack('>Q', nonce) + initialHash).digest()).digest()[0:8])
|
trialValue, = unpack('>Q', hashlib.sha512(hashlib.sha512(pack('>Q', nonce) + initialHash).digest()).digest()[0:8])
|
||||||
if state.shutdown != 0:
|
if state.shutdown != 0:
|
||||||
raise StopIteration("Interrupted")
|
raise StopIteration("Interrupted")
|
||||||
|
|
Reference in New Issue
Block a user