+func (p *Piece) pendingChunkIndex(chunkIndex chunkIndexType) bool {
+ return !p.chunkIndexDirty(chunkIndex)
+}
+
+func (p *Piece) pendingChunk(cs ChunkSpec, chunkSize pp.Integer) bool {
+ return p.pendingChunkIndex(chunkIndexFromChunkSpec(cs, chunkSize))
+}
+
+func (p *Piece) hasDirtyChunks() bool {
+ return p.numDirtyChunks() != 0
+}
+
+func (p *Piece) numDirtyChunks() chunkIndexType {
+ return chunkIndexType(roaringBitmapRangeCardinality[RequestIndex](
+ &p.t.dirtyChunks,
+ p.requestIndexOffset(),
+ p.t.pieceRequestIndexOffset(p.index+1)))
+}
+
+func (p *Piece) unpendChunkIndex(i chunkIndexType) {
+ p.t.dirtyChunks.Add(p.requestIndexOffset() + i)
+ p.t.updatePieceRequestOrder(p.index)
+ p.readerCond.Broadcast()
+}
+
+func (p *Piece) pendChunkIndex(i RequestIndex) {
+ p.t.dirtyChunks.Remove(p.requestIndexOffset() + i)
+ p.t.updatePieceRequestOrder(p.index)
+}
+
+func (p *Piece) numChunks() chunkIndexType {
+ return p.t.pieceNumChunks(p.index)
+}
+
+func (p *Piece) incrementPendingWrites() {
+ p.pendingWritesMutex.Lock()
+ p.pendingWrites++
+ p.pendingWritesMutex.Unlock()
+}
+
+func (p *Piece) decrementPendingWrites() {
+ p.pendingWritesMutex.Lock()
+ if p.pendingWrites == 0 {
+ panic("assertion")