package main

import (
	"fmt"
	"runtime"
	"time"

	"github.com/smartystreets/go-disruptor"
)

const (
	BufferSize = 1024 * 64
	BufferMask = BufferSize - 1
	Iterations = 1000000 * 100
)

var ringBuffer = [BufferSize]int64{}

func main() {
	runtime.GOMAXPROCS(2)

	written, read := disruptor.NewCursor(), disruptor.NewCursor()
	reader := disruptor.NewReader(read, written, written, SampleConsumer{})

	started := time.Now()
	reader.Start()
	publish(written, read)
	reader.Stop()
	finished := time.Now()
	fmt.Println(Iterations, finished.Sub(started))
}

const Reservations = 1
const ReservationMask = -Reservations + 1

func publish(written *disruptor.Cursor, upstream disruptor.Barrier) {
	sequence := disruptor.InitialSequenceValue
	writer := disruptor.NewWriter(written, upstream, BufferSize)
	for sequence <= Iterations {
		sequence = writer.Reserve(Reservations)

		for i := sequence + ReservationMask; i <= sequence; i++ {
			ringBuffer[i&BufferMask] = i
		}

		// ringBuffer[sequence&BufferMask] = sequence
		writer.Commit(sequence)
	}
}

// func publish(written *disruptor.Cursor, upstream disruptor.Barrier) {
// 	previous := disruptor.InitialSequenceValue
// 	gate := disruptor.InitialSequenceValue

// 	for previous <= Iterations {
// 		next := previous + 1

// 		for next-BufferSize > gate {
// 			gate = upstream.Read(next)
// 		}

// 		ringBuffer[next&BufferMask] = next
// 		written.Store(next)
// 		previous = next
// 	}
// }

type SampleConsumer struct{}

func (this SampleConsumer) Consume(lower, upper int64) {
	for lower <= upper {
		message := ringBuffer[lower&BufferMask]
		if message != lower {
			fmt.Println("Race condition", message, lower)
			panic("Race condition")
		}
		lower++
	}
}
