Commit 5fca8c4d authored by Boris Mühmer's avatar Boris Mühmer
Browse files

merged current development state



Signed-off-by: default avatarBoris Mühmer <boris@muehmer.de>
parent 883ec2ee
Loading
Loading
Loading
Loading
+27 −1
Original line number Diff line number Diff line
# stars

stars
 No newline at end of file
Various tests with Golang channels and goroutines.

## Usage

### Normal

```shell
go run cmd/stars/main.go
go run cmd/stars/main.go --generic
go run cmd/stars/main.go --generic --count=16000
go run cmd/stars/main.go --generic --count=50000
go run cmd/stars/main.go --generic --count=8000
```

### Race detection enabled

```shell
go run -race cmd/stars/main.go
go run -race cmd/stars/main.go -generic
go run -race cmd/stars/main.go -generic -count 1000
go run -race cmd/stars/main.go --special=false
go run -race cmd/stars/main.go -special=false
go run -race cmd/stars/main.go --tick 10µs
go run -race cmd/stars/main.go --tick 50µs
```

<!-- End Of File -->

cmd/stars/main.go

0 → 100644
+93 −0
Original line number Diff line number Diff line
package main

import (
	"flag"
	"fmt"
	"os"
	"time"

	"repositories.muehmer.net/bsmrgo/stars/pkg/stars/actions/addavatar"
	"repositories.muehmer.net/bsmrgo/stars/pkg/stars/actions/listavatars"
	"repositories.muehmer.net/bsmrgo/stars/pkg/stars/objects/avatar"
	"repositories.muehmer.net/bsmrgo/stars/pkg/stars/simulator"
)

func main() {
	fmt.Fprintln(os.Stderr, "main(): started.")
	defer fmt.Fprintln(os.Stderr, "main(): terminated.")

	var tickDuration time.Duration
	var timeoutDuration time.Duration
	var addSpecialAvatars bool
	var addGenericAvatars bool
	var numberOfGenericAvatars int

	flag.DurationVar(&tickDuration, "tick", 50*time.Microsecond, "tick duration for the simulator")
	flag.DurationVar(&timeoutDuration, "timeout", 10*time.Second, "timeout until main() stops the simulator")
	flag.BoolVar(&addSpecialAvatars, "special", true, "enable special avatars")
	flag.BoolVar(&addGenericAvatars, "generic", false, "enable generic avatars")
	flag.IntVar(&numberOfGenericAvatars, "count", 10, "the number of generic avatars")

	flag.Parse()

	stop := make(chan bool)
	defer func() {
		close(stop)
		fmt.Fprintln(os.Stderr, "main(): closed stop channel")
	}()

	s := simulator.New(stop, tickDuration)
	go func() {
		fmt.Fprintln(os.Stderr, "main(): simulator started.")
		s.Run()
		fmt.Fprintln(os.Stderr, "main(): simulator finished.")
	}()

	<-s.ReadyChannel()
	fmt.Fprintln(os.Stderr, "main(): simulator is ready")

	if addSpecialAvatars {
		go func() {
			s.ActionChannel() <- addavatar.New(avatar.New("Johnson Smith"))
			s.ActionChannel() <- addavatar.New(avatar.New("Blue Velvet"))
			s.ActionChannel() <- addavatar.New(avatar.New("Jonny Silver"))
			s.ActionChannel() <- addavatar.New(avatar.New("Susi Sorglos"))
		}()
	}

	if addGenericAvatars {
		for i := 0; i < numberOfGenericAvatars; i++ {
			go func(i int) {
				s.ActionChannel() <- addavatar.New(avatar.New(fmt.Sprintf("Generic %d", i+1)))
			}(i)
		}
	}

	lv := listavatars.New()
	go func() {
		s.ActionChannel() <- lv
	}()
	<-lv.Done

	for i, n := range lv.Names {
		fmt.Fprintf(os.Stderr, "main(): Avatar %d: %s\n", i, n)
	}

	t := time.After(timeoutDuration)

	fmt.Fprintln(os.Stderr, "main(): loop: starting...")
loop:
	for {
		select {
		case <-t:
			fmt.Fprintln(os.Stderr, "main(): sending stop to simulator")
			stop <- true
			break loop
		}
	}
	fmt.Fprintln(os.Stderr, "main(): loop: exited.")

	r := <-s.DoneChannel()

	fmt.Fprintf(os.Stderr, "main(): simulator statistics: %s\n", r)
}

pkg/stars/actioner.go

0 → 100644
+7 −0
Original line number Diff line number Diff line
package stars

// Actioner ...
type Actioner interface {
	Name() string
	Do(Simulatorer) error
}
+40 −0
Original line number Diff line number Diff line
package addavatar

import (
	"fmt"
	"os"

	"repositories.muehmer.net/bsmrgo/stars/pkg/stars"
)

const (
	// CommandName ...
	CommandName = "Add Avatar"
)

// AddAvatar ...
type AddAvatar struct {
	avatar stars.Avatarer
}

// New ...
func New(avatar stars.Avatarer) *AddAvatar {
	return &AddAvatar{
		avatar: avatar,
	}
}

// Name ...
func (a *AddAvatar) Name() string {
	return CommandName
}

// Do ...
func (a *AddAvatar) Do(s stars.Simulatorer) error {
	fmt.Fprintf(os.Stderr, "Action: AddAvatar: %s\n", a.avatar.Name())
	s.Avatars()[a.avatar.Name()] = a.avatar
	go func() {
		a.avatar.Run()
	}()
	return nil
}
+37 −0
Original line number Diff line number Diff line
package listavatars

import "repositories.muehmer.net/bsmrgo/stars/pkg/stars"

const (
	// CommandName ...
	CommandName = "List Avatars"
)

// ListAvatars ...
type ListAvatars struct {
	Names []string
	Done  chan bool
}

// New ...
func New() *ListAvatars {
	return &ListAvatars{
		Names: []string{},
		Done:  make(chan bool),
	}
}

// Name ...
func (a *ListAvatars) Name() string {
	return CommandName
}

// Do ...
func (a *ListAvatars) Do(s stars.Simulatorer) error {
	defer close(a.Done)
	for key := range s.Avatars() {
		a.Names = append(a.Names, key)
	}
	a.Done <- true
	return nil
}
Loading