7
7
"github.com/Qitmeer/qng/core/types"
8
8
"github.com/Qitmeer/qng/core/types/pow"
9
9
"github.com/Qitmeer/qng/params"
10
- "github.com/Qitmeer/qng/services/mining"
11
10
"sync"
12
11
"sync/atomic"
13
12
"time"
@@ -49,8 +48,7 @@ type CPUWorker struct {
49
48
workWg sync.WaitGroup
50
49
updateNumWorks chan struct {}
51
50
numWorks uint32
52
- updateWork chan struct {}
53
- hasNewWork bool
51
+ hasNewWork atomic.Bool
54
52
55
53
miner * Miner
56
54
@@ -274,15 +272,7 @@ func (w *CPUWorker) Update() {
274
272
if atomic .LoadInt32 (& w .shutdown ) != 0 {
275
273
return
276
274
}
277
- w .Lock ()
278
- defer w .Unlock ()
279
-
280
- if w .discrete && w .discreteNum <= 0 {
281
- return
282
- }
283
- w .hasNewWork = true
284
- w .updateWork <- struct {}{}
285
- w .hasNewWork = false
275
+ w .hasNewWork .Store (true )
286
276
}
287
277
288
278
func (w * CPUWorker ) generateDiscrete (num int , block chan * hash.Hash ) bool {
@@ -302,45 +292,52 @@ func (w *CPUWorker) generateDiscrete(num int, block chan *hash.Hash) bool {
302
292
}
303
293
304
294
func (w * CPUWorker ) generateBlocks () {
305
- log .Trace (fmt .Sprintf ("Starting generate blocks worker:%s" , w .GetType ()))
295
+ log .Info (fmt .Sprintf ("Starting generate blocks worker:%s" , w .GetType ()))
306
296
out:
307
297
for {
308
298
// Quit when the miner is stopped.
309
299
select {
310
- case <- w .updateWork :
311
- if w .discrete && w .discreteNum <= 0 {
300
+ case <- w .quit :
301
+ break out
302
+ default :
303
+ // Non-blocking select to fall through
304
+ }
305
+ if w .discrete && w .discreteNum <= 0 || ! w .hasNewWork .Load () {
306
+ time .Sleep (time .Second )
307
+ continue
308
+ }
309
+ start := time .Now ()
310
+ if params .ActiveNetParams .Params .IsDevelopDiff () {
311
+ time .Sleep (params .ActiveNetParams .Params .TargetTimePerBlock )
312
+ }
313
+ sb := w .solveBlock ()
314
+ if sb != nil {
315
+ w .hasNewWork .Store (false )
316
+ block := types .NewBlock (sb )
317
+ info , err := w .miner .submitBlock (block )
318
+ if err != nil {
319
+ log .Error (fmt .Sprintf ("Failed to submit new block:%s ,%v" , block .Hash ().String (), err ))
320
+ w .cleanDiscrete ()
312
321
continue
313
322
}
314
- sb := w .solveBlock ()
315
- if sb != nil {
316
- block := types .NewBlock (sb )
317
- info , err := w .miner .submitBlock (block )
318
- if err != nil {
319
- log .Error (fmt .Sprintf ("Failed to submit new block:%s ,%v" , block .Hash ().String (), err ))
320
- w .cleanDiscrete ()
321
- continue
323
+ log .Info (fmt .Sprintf ("%v" , info ), "cost" , time .Since (start ).String ())
324
+
325
+ if w .discrete && w .discreteNum > 0 {
326
+ if w .discreteBlock != nil {
327
+ w .discreteBlock <- block .Hash ()
322
328
}
323
- log .Info (fmt .Sprintf ("%v" , info ))
324
-
325
- if w .discrete && w .discreteNum > 0 {
326
- if w .discreteBlock != nil {
327
- w .discreteBlock <- block .Hash ()
328
- }
329
- w .discreteNum --
330
- if w .discreteNum <= 0 {
331
- w .cleanDiscrete ()
332
- }
329
+ w .discreteNum --
330
+ if w .discreteNum <= 0 {
331
+ w .cleanDiscrete ()
333
332
}
334
- } else {
335
- w .cleanDiscrete ()
336
333
}
337
- case <- w . quit :
338
- break out
334
+ } else {
335
+ w . cleanDiscrete ()
339
336
}
340
337
}
341
338
342
339
w .workWg .Done ()
343
- log .Trace (fmt .Sprintf ("Generate blocks worker done:%s" , w .GetType ()))
340
+ log .Info (fmt .Sprintf ("Generate blocks worker done:%s" , w .GetType ()))
344
341
}
345
342
346
343
func (w * CPUWorker ) cleanDiscrete () {
@@ -359,7 +356,7 @@ func (w *CPUWorker) solveBlock() *types.Block {
359
356
}
360
357
// Start a ticker which is used to signal checks for stale work and
361
358
// updates to the speed monitor.
362
- ticker := time .NewTicker (333 * time .Millisecond )
359
+ ticker := time .NewTicker (time .Second )
363
360
defer ticker .Stop ()
364
361
365
362
// Create a couple of convenience variables.
@@ -405,16 +402,9 @@ func (w *CPUWorker) solveBlock() *types.Block {
405
402
// has been updated since the block template was
406
403
// generated and it has been at least 3 seconds,
407
404
// or if it's been one minute.
408
- if w . hasNewWork || roughtime .Now ().After (lastGenerated .Add (gbtRegenerateSeconds * time .Second )) {
405
+ if roughtime .Now ().After (lastGenerated .Add (gbtRegenerateSeconds * time .Second )) {
409
406
return nil
410
407
}
411
-
412
- err := mining .UpdateBlockTime (block , w .miner .BlockChain (), w .miner .timeSource , params .ActiveNetParams .Params )
413
- if err != nil {
414
- log .Warn (fmt .Sprintf ("CPU miner unable to update block template time: %v" , err ))
415
- return nil
416
- }
417
-
418
408
default :
419
409
// Non-blocking select to fall through
420
410
}
@@ -424,6 +414,9 @@ func (w *CPUWorker) solveBlock() *types.Block {
424
414
instance .SetParams (params .ActiveNetParams .Params .PowConfig )
425
415
hashesCompleted += 2
426
416
header .Pow = instance
417
+ if params .ActiveNetParams .Params .IsDevelopDiff () {
418
+ return block
419
+ }
427
420
if header .Pow .FindSolver (header .BlockData (), header .BlockHash (), header .Difficulty ) {
428
421
w .updateHashes <- hashesCompleted
429
422
return block
@@ -443,7 +436,6 @@ func NewCPUWorker(miner *Miner) *CPUWorker {
443
436
queryHashesPerSec : make (chan float64 ),
444
437
updateNumWorks : make (chan struct {}),
445
438
numWorks : defaultNumWorkers ,
446
- updateWork : make (chan struct {}),
447
439
}
448
440
449
441
return & w
0 commit comments