forked from ngaut/goTorrent
-
Notifications
You must be signed in to change notification settings - Fork 0
/
diskIo.go
65 lines (57 loc) · 1.1 KB
/
diskIo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package main
import (
"log"
"time"
)
const(
MODE_READ = 1
MODE_WRITE = 2
)
type IoArgs struct{
f FileStore
ioMode int
buf []byte
offset int64
context interface{}
}
type WriteContext struct{
peer *peerState
whichPiece uint32 //piece index
begin uint32
length uint32
}
type ReadContext struct{
peer *peerState
msgBuf []byte
globalOffset int64
length uint32
}
func IoRoutine(request <-chan *IoArgs, responce chan<- interface{} ) {
log.Println("start IoRoutine")
for arg := range request {
start := time.Now()
if cfg.doRealReadWrite {
if arg.ioMode == MODE_READ{
_, err := arg.f.ReadAt(arg.buf, arg.offset)
if err != nil {
panic("")
}
}else{ //write
_, err := arg.f.WriteAt(arg.buf, arg.offset)
if err != nil {
panic("")
}
}
}
sec := time.Now().Sub(start).Seconds()
if sec >= 2 {
var mod = "READ"
if arg.ioMode == MODE_WRITE {
mod = "WRITE"
}
log.Println("\nwarning, disk io too slow, use %v seconds, mod:%v, offset:%v\n", sec, mod, arg.offset)
}
responce<-arg.context
}
log.Println("exit IoRoutine")
}