forked from appscode/g2
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathoutpack.go
49 lines (44 loc) · 1.01 KB
/
outpack.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
package worker
import (
"encoding/binary"
rt "github.com/quantcast/g2/pkg/runtime"
)
// Worker side job
type outPack struct {
dataType rt.PT
data []byte
handle string
}
func getOutPack() (outpack *outPack) {
// TODO pool
return &outPack{}
}
// Encode a job to byte slice
func (outpack *outPack) Encode() (data []byte) {
var l int
if outpack.dataType == rt.PT_WorkFail {
l = len(outpack.handle)
} else {
l = len(outpack.data)
if outpack.handle != "" {
l += len(outpack.handle) + 1
}
}
data = rt.NewBuffer(l + rt.MinPacketLength)
binary.BigEndian.PutUint32(data[:4], rt.Req)
binary.BigEndian.PutUint32(data[4:8], outpack.dataType.Uint32())
binary.BigEndian.PutUint32(data[8:rt.MinPacketLength], uint32(l))
i := rt.MinPacketLength
if outpack.handle != "" {
hi := len(outpack.handle) + i
copy(data[i:hi], []byte(outpack.handle))
if outpack.dataType != rt.PT_WorkFail {
data[hi] = '\x00'
}
i = hi + 1
}
if outpack.dataType != rt.PT_WorkFail {
copy(data[i:], outpack.data)
}
return
}