jakewins / 4fq Goto Github PK
View Code? Open in Web Editor NEWLow latency batching queues for Go
License: Apache License 2.0
Low latency batching queues for Go
License: Apache License 2.0
Not actually an issue. I'm curious why you pad with 56 bytes on each side here
type sequence struct {
_lpad [56]byte
value int64
_rpad [56]byte
}
goos: darwin
goarch: amd64
pkg: github.com/jakewins/4fq/pkg/queue
BenchmarkChannel-4 20000000 63.7 ns/op
BenchmarkMpscQueue-4 20000000 176 ns/op
PASS
Tested on my 2017 macbook pro, macOS mojave 10.14.1
% go test -race
==================
WARNING: DATA RACE
Read at 0x00c42016c0b8 by goroutine 12:
github.com/jakewins/4fq/pkg/queue.(*sequencer).next()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:155 +0x5e
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:66 +0x59
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Previous write at 0x00c42016c0b8 by goroutine 10:
sync/atomic.CompareAndSwapInt64()
/home/dfc/go/src/runtime/race_amd64.s:298 +0xb
github.com/jakewins/4fq/pkg/queue.(*sequence).compareAndSet()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:92 +0x52
github.com/jakewins/4fq/pkg/queue.(*sequencer).next()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:169 +0x1db
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:66 +0x59
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Goroutine 12 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 10 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
==================
==================
WARNING: DATA RACE
Write at 0x00c42016c038 by goroutine 8:
sync/atomic.AddInt64()
/home/dfc/go/src/runtime/race_amd64.s:276 +0xb
github.com/jakewins/4fq/pkg/queue.(*sequence).add()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:95 +0x48
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).Drain()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:90 +0x1a5
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:66 +0x274
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Previous read at 0x00c42016c038 by goroutine 12:
github.com/jakewins/4fq/pkg/queue.(*sequencer).next()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:162 +0x10d
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:66 +0x59
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Goroutine 8 (running) created at:
testing.(*T).Run()
/home/dfc/go/src/testing/testing.go:716 +0x53c
testing.runTests.func1()
/home/dfc/go/src/testing/testing.go:900 +0xaa
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
testing.runTests()
/home/dfc/go/src/testing/testing.go:906 +0x4ac
testing.(*M).Run()
/home/dfc/go/src/testing/testing.go:841 +0x1c3
main.main()
github.com/jakewins/4fq/pkg/queue/_test/_testmain.go:50 +0x20f
Goroutine 12 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
==================
==================
WARNING: DATA RACE
Write at 0x00c42016c138 by goroutine 14:
sync/atomic.StoreInt64()
/home/dfc/go/src/runtime/race_amd64.s:234 +0xb
github.com/jakewins/4fq/pkg/queue.(*sequence).set()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:89 +0x48
github.com/jakewins/4fq/pkg/queue.(*sequencer).next()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:168 +0x193
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:66 +0x59
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Previous read at 0x00c42016c138 by goroutine 15:
github.com/jakewins/4fq/pkg/queue.(*sequencer).next()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:159 +0xb4
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:66 +0x59
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Goroutine 14 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 15 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
==================
==================
WARNING: DATA RACE
Write at 0x00c42016c138 by goroutine 15:
sync/atomic.StoreInt64()
/home/dfc/go/src/runtime/race_amd64.s:234 +0xb
github.com/jakewins/4fq/pkg/queue.(*sequence).set()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:89 +0x48
github.com/jakewins/4fq/pkg/queue.(*sequencer).next()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:168 +0x193
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:66 +0x59
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Previous read at 0x00c42016c138 by goroutine 10:
github.com/jakewins/4fq/pkg/queue.(*sequencer).next()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:159 +0xb4
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:66 +0x59
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Goroutine 15 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 10 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
==================
==================
WARNING: DATA RACE
Write at 0x00c42016c138 by goroutine 12:
sync/atomic.StoreInt64()
/home/dfc/go/src/runtime/race_amd64.s:234 +0xb
github.com/jakewins/4fq/pkg/queue.(*sequence).set()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:89 +0x48
github.com/jakewins/4fq/pkg/queue.(*sequencer).next()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:168 +0x193
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:66 +0x59
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Previous read at 0x00c42016c138 by goroutine 15:
github.com/jakewins/4fq/pkg/queue.(*sequencer).next()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:159 +0xb4
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:66 +0x59
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Goroutine 12 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 15 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
==================
==================
WARNING: DATA RACE
Write at 0x00c42016c138 by goroutine 10:
sync/atomic.StoreInt64()
/home/dfc/go/src/runtime/race_amd64.s:234 +0xb
github.com/jakewins/4fq/pkg/queue.(*sequence).set()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:89 +0x48
github.com/jakewins/4fq/pkg/queue.(*sequencer).next()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:168 +0x193
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:66 +0x59
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Previous read at 0x00c42016c138 by goroutine 15:
github.com/jakewins/4fq/pkg/queue.(*sequencer).next()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/queue.go:159 +0xb4
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:66 +0x59
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Goroutine 10 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 15 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
==================
==================
WARNING: DATA RACE
Write at 0x00c42000c488 by goroutine 10:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:50 +0xc1
Previous read at 0x00c42000c488 by goroutine 8:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func3()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:63 +0x67
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).Drain()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:88 +0x157
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:66 +0x274
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 10 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 8 (running) created at:
testing.(*T).Run()
/home/dfc/go/src/testing/testing.go:716 +0x53c
testing.runTests.func1()
/home/dfc/go/src/testing/testing.go:900 +0xaa
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
testing.runTests()
/home/dfc/go/src/testing/testing.go:906 +0x4ac
testing.(*M).Run()
/home/dfc/go/src/testing/testing.go:841 +0x1c3
main.main()
github.com/jakewins/4fq/pkg/queue/_test/_testmain.go:50 +0x20f
==================
==================
WARNING: DATA RACE
Write at 0x00c42000c448 by goroutine 15:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:50 +0xc1
Previous read at 0x00c42000c448 by goroutine 8:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func3()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:63 +0x67
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).Drain()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:88 +0x157
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:66 +0x274
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 15 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 8 (running) created at:
testing.(*T).Run()
/home/dfc/go/src/testing/testing.go:716 +0x53c
testing.runTests.func1()
/home/dfc/go/src/testing/testing.go:900 +0xaa
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
testing.runTests()
/home/dfc/go/src/testing/testing.go:906 +0x4ac
testing.(*M).Run()
/home/dfc/go/src/testing/testing.go:841 +0x1c3
main.main()
github.com/jakewins/4fq/pkg/queue/_test/_testmain.go:50 +0x20f
==================
==================
WARNING: DATA RACE
Write at 0x00c42000c468 by goroutine 12:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:50 +0xc1
Previous read at 0x00c42000c468 by goroutine 8:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func3()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:63 +0x67
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).Drain()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:88 +0x157
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:66 +0x274
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 12 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 8 (running) created at:
testing.(*T).Run()
/home/dfc/go/src/testing/testing.go:716 +0x53c
testing.runTests.func1()
/home/dfc/go/src/testing/testing.go:900 +0xaa
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
testing.runTests()
/home/dfc/go/src/testing/testing.go:906 +0x4ac
testing.(*M).Run()
/home/dfc/go/src/testing/testing.go:841 +0x1c3
main.main()
github.com/jakewins/4fq/pkg/queue/_test/_testmain.go:50 +0x20f
==================
==================
WARNING: DATA RACE
Write at 0x00c42000c428 by goroutine 14:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:50 +0xc1
Previous read at 0x00c42000c428 by goroutine 8:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func3()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:63 +0x67
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).Drain()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:88 +0x157
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:66 +0x274
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 14 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 8 (running) created at:
testing.(*T).Run()
/home/dfc/go/src/testing/testing.go:716 +0x53c
testing.runTests.func1()
/home/dfc/go/src/testing/testing.go:900 +0xaa
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
testing.runTests()
/home/dfc/go/src/testing/testing.go:906 +0x4ac
testing.(*M).Run()
/home/dfc/go/src/testing/testing.go:841 +0x1c3
main.main()
github.com/jakewins/4fq/pkg/queue/_test/_testmain.go:50 +0x20f
==================
==================
WARNING: DATA RACE
Write at 0x00c42000c420 by goroutine 12:
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:68 +0xe5
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Previous write at 0x00c42000c420 by goroutine 14:
github.com/jakewins/4fq/pkg/queue.(*mpscQueue).NextFree()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc.go:68 +0xe5
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround.func2()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:49 +0x57
Goroutine 12 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
Goroutine 14 (running) created at:
github.com/jakewins/4fq/pkg/queue_test.TestMPSCBufferWrapAround()
/home/dfc/src/github.com/jakewins/4fq/pkg/queue/mpsc_test.go:56 +0xdb
testing.tRunner()
/home/dfc/go/src/testing/testing.go:679 +0x228
==================
--- FAIL: TestMPSCBufferWrapAround (0.80s)
testing.go:632: race detected during execution of test
FAIL
FAIL github.com/jakewins/4fq/pkg/queue 0.814s
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.