chrislu
3 years ago
2 changed files with 63 additions and 58 deletions
@ -0,0 +1,63 @@ |
|||||
|
package page_writer |
||||
|
|
||||
|
import ( |
||||
|
"sync/atomic" |
||||
|
) |
||||
|
|
||||
|
func (up *UploadPipeline) LockForRead(startOffset, stopOffset int64) { |
||||
|
startLogicChunkIndex := LogicChunkIndex(startOffset / up.ChunkSize) |
||||
|
stopLogicChunkIndex := LogicChunkIndex(stopOffset / up.ChunkSize) |
||||
|
if stopOffset%up.ChunkSize > 0 { |
||||
|
stopLogicChunkIndex += 1 |
||||
|
} |
||||
|
up.activeReadChunksLock.Lock() |
||||
|
defer up.activeReadChunksLock.Unlock() |
||||
|
for i := startLogicChunkIndex; i < stopLogicChunkIndex; i++ { |
||||
|
if count, found := up.activeReadChunks[i]; found { |
||||
|
up.activeReadChunks[i] = count + 1 |
||||
|
} else { |
||||
|
up.activeReadChunks[i] = 1 |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func (up *UploadPipeline) UnlockForRead(startOffset, stopOffset int64) { |
||||
|
startLogicChunkIndex := LogicChunkIndex(startOffset / up.ChunkSize) |
||||
|
stopLogicChunkIndex := LogicChunkIndex(stopOffset / up.ChunkSize) |
||||
|
if stopOffset%up.ChunkSize > 0 { |
||||
|
stopLogicChunkIndex += 1 |
||||
|
} |
||||
|
up.activeReadChunksLock.Lock() |
||||
|
defer up.activeReadChunksLock.Unlock() |
||||
|
for i := startLogicChunkIndex; i < stopLogicChunkIndex; i++ { |
||||
|
if count, found := up.activeReadChunks[i]; found { |
||||
|
if count == 1 { |
||||
|
delete(up.activeReadChunks, i) |
||||
|
} else { |
||||
|
up.activeReadChunks[i] = count - 1 |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func (up *UploadPipeline) IsLocked(logicChunkIndex LogicChunkIndex) bool { |
||||
|
up.activeReadChunksLock.Lock() |
||||
|
defer up.activeReadChunksLock.Unlock() |
||||
|
if count, found := up.activeReadChunks[logicChunkIndex]; found { |
||||
|
return count > 0 |
||||
|
} |
||||
|
return false |
||||
|
} |
||||
|
|
||||
|
func (up *UploadPipeline) waitForCurrentWritersToComplete() { |
||||
|
up.uploaderCountCond.L.Lock() |
||||
|
t := int32(100) |
||||
|
for { |
||||
|
t = atomic.LoadInt32(&up.uploaderCount) |
||||
|
if t <= 0 { |
||||
|
break |
||||
|
} |
||||
|
up.uploaderCountCond.Wait() |
||||
|
} |
||||
|
up.uploaderCountCond.L.Unlock() |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue