diff --git a/piece.go b/piece.go index 08fc9bab..c1410d0a 100644 --- a/piece.go +++ b/piece.go @@ -50,6 +50,7 @@ type Piece struct { numVerifies int64 hashing bool + marking bool storageCompletionOk bool publicPieceState PieceState diff --git a/piecestate.go b/piecestate.go index 7a2e7164..089adca4 100644 --- a/piecestate.go +++ b/piecestate.go @@ -8,8 +8,14 @@ import ( type PieceState struct { Priority piecePriority storage.Completion - // The piece is being hashed, or is queued for hash. + // The piece is being hashed, or is queued for hash. Deprecated: Use those fields instead. Checking bool + + Hashing bool + QueuedForHash bool + // The piece state is being marked in the storage. + Marking bool + // Some of the piece has been obtained. Partial bool } diff --git a/torrent.go b/torrent.go index 9e980abe..af8a2b00 100644 --- a/torrent.go +++ b/torrent.go @@ -500,9 +500,10 @@ func (t *Torrent) pieceState(index pieceIndex) (ret PieceState) { p := &t.pieces[index] ret.Priority = t.piecePriority(index) ret.Completion = p.completion() - if p.queuedForHash() || p.hashing { - ret.Checking = true - } + ret.QueuedForHash = p.queuedForHash() + ret.Hashing = p.hashing + ret.Checking = ret.QueuedForHash || ret.Hashing + ret.Marking = p.marking if !ret.Complete && t.piecePartiallyDownloaded(index) { ret.Partial = true } @@ -562,9 +563,15 @@ func (psr PieceStateRun) String() (ret string) { return "" } }() - if psr.Checking { + if psr.Hashing { ret += "H" } + if psr.QueuedForHash { + ret += "Q" + } + if psr.Marking { + ret += "M" + } if psr.Partial { ret += "P" } @@ -1739,6 +1746,13 @@ func (t *Torrent) pieceHashed(piece pieceIndex, passed bool, hashIoErr error) { } } + p.marking = true + t.publishPieceChange(piece) + defer func() { + p.marking = false + t.publishPieceChange(piece) + }() + if passed { if len(p.dirtiers) != 0 { // Don't increment stats above connection-level for every involved connection.