All Projects → hedzr → go-ringbuf

hedzr / go-ringbuf

Licence: Apache-2.0 license
Lock-free MPMC Ring Buffer (Generic) for SMP, in golang. Some posts in chinese:

Programming Languages

go
31211 projects - #10 most used programming language

Projects that are alternatives of or similar to go-ringbuf

heidi
heidi : tidy data in Haskell
Stars: ✭ 24 (-44.19%)
Mutual labels:  generics, generic-programming
hatrack
Fast, multi-reader, multi-writer, lockless data structures for parallel programming
Stars: ✭ 55 (+27.91%)
Mutual labels:  ring-buffer, lock-free
fifo-rs
A first-in-first-out for bytes, like kfifo in Linux.
Stars: ✭ 18 (-58.14%)
Mutual labels:  ring-buffer, lock-free
generics
No description or website provided.
Stars: ✭ 25 (-41.86%)
Mutual labels:  generics, generic-programming
Auth Adt
Authenticated Data Structures Generically
Stars: ✭ 150 (+248.84%)
Mutual labels:  generics
Goreuse
Generic Code for Go
Stars: ✭ 93 (+116.28%)
Mutual labels:  generics
Swift Complex
Complex numbers in Swift
Stars: ✭ 66 (+53.49%)
Mutual labels:  generics
Lgenerics
Generic algorithms and data structures for Lazarus/Free Pascal
Stars: ✭ 59 (+37.21%)
Mutual labels:  generics
lancet
A comprehensive, efficient, and reusable util function library of go.
Stars: ✭ 2,228 (+5081.4%)
Mutual labels:  generics
Arrow Meta
Functional companion to Kotlin's Compiler
Stars: ✭ 246 (+472.09%)
Mutual labels:  generics
Gomacro
Interactive Go interpreter and debugger with REPL, Eval, generics and Lisp-like macros
Stars: ✭ 1,784 (+4048.84%)
Mutual labels:  generics
Miniboxing Plugin
Miniboxing is a program transformation that improves the performance of Scala generics when used with primitive types. It can speed up generic collections by factors between 1.5x and 22x, while maintaining bytecode duplication to a minimum. You can easily add miniboxing to your sbt project:
Stars: ✭ 106 (+146.51%)
Mutual labels:  generics
Higgledy
Higher-kinded data via generics
Stars: ✭ 153 (+255.81%)
Mutual labels:  generics
Gen
Type-driven code generation for Go
Stars: ✭ 1,246 (+2797.67%)
Mutual labels:  generics
Gengen
A Go source transformation tool for generics
Stars: ✭ 253 (+488.37%)
Mutual labels:  generics
Gena
Generic pseudo-templated containers for C. Written entirely in C89 with design inspired by the C++ STL. /// DOCS ARE SLIGHTLY OUTDATED, PROJECT IS STABLE AND STILL IN ACTIVE DEVELOPMENT
Stars: ✭ 61 (+41.86%)
Mutual labels:  generics
Envy
😠 Environmentally friendly environment variables
Stars: ✭ 132 (+206.98%)
Mutual labels:  generics
Staticvec
Implements a fixed-capacity stack-allocated Vec alternative backed by an array, using const generics.
Stars: ✭ 236 (+448.84%)
Mutual labels:  generics
Go Generics Example
Example code for Go generics
Stars: ✭ 121 (+181.4%)
Mutual labels:  generics
Ply
Painless polymorphism
Stars: ✭ 117 (+172.09%)
Mutual labels:  generics

go-ringbuf [V2]

Go GitHub tag (latest SemVer) GoDoc FOSSA Status Go Report Card Coverage Status

go-ringbuf provides a high-performance, lock-free circular queue (ring buffer) implementation in golang.

MPMC (multiple-producers and multiple consumers) enabled.

History

v2.0.+

securrity updates

v2.0.0 @20220408 - go 1.18+

generic version for MPMC Ring Buffer.

  • rewritten with go generics

v1.0.+

security updates

v1.0.0 @20220408

Last release for classical version.

Next release (v2) will move to go 1.18+ with generic enabled.

v0.9.1 @2022

  • review all codes
  • updated deps
  • review and solve uncertain misreport failed licenses
    • we have two deps: hedzr/errors and hedzr/log, and both them have no 3rd-party deps.
    • we have no more 3rd-party deps.
    • we assumed a free license under MIT (unified).

Getting Start

go get -v github.com/hedzr/go-ringbuf/v2

Samples

package main

import (
	"fmt"
	"github.com/hedzr/go-ringbuf/v2"
	"log"
)

func main() {
	testIntRB()
	testStringRB()
}

func testStringRB() {
	var err error
	var rb = ringbuf.New[string](80)
	err = rb.Enqueue("abcde")
	errChk(err)

	var item string
	item, err = rb.Dequeue()
	errChk(err)
	fmt.Printf("dequeue ok: %v\n", item)
}

func testIntRB() {
	var err error
	var rb = ringbuf.New[int](80)
	err = rb.Enqueue(3)
	errChk(err)

	var item int
	item, err = rb.Dequeue()
	errChk(err)
	fmt.Printf("dequeue ok: %v\n", item)
}

func errChk(err error) {
	if err != nil {
		log.Fatal(err)
	}
}

Using Ring-Buffer as a fixed resource pool

The following codes is for v1, needed for rewriting

func newRes() *Res{...}

var rb fast.RingBuffer

func initFunc() (err error) {
  const maxSize = 16
  
  if rb = fast.New(uint32(maxSize)); rb == nil {
		err = errors.New("cannot create fast.RingBuffer")
		return
	}

    // CapReal() will be available since v0.8.8, or replace it with Cap() - 1
	for i := uint32(0); i < rb.CapReal(); i++ {
		if err = rb.Enqueue(newRes()); err != nil {
			return
		}
	}
}

func loopFor() {
  var err error
  for {
    it, err := rb.Dequeue()
    checkErr(err)
    if res, ok := it.(*Res); ok {
      // do stuff with `res`, and put it back into ring-buffer
      err = rb.Enqueue(it)
    }
  }
}

Contrib

Welcome

LICENSE

Apache 2.0

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].