mirror of
https://github.com/XRPLF/clio.git
synced 2025-11-19 19:25:53 +00:00
There was a data race inside `CoroutineGroup` because internal timer was used from multiple threads in the methods `asyncWait()` and `onCoroutineComplete()`. Changing `registerForeign()` to spawn to the same `yield_context` fixes the problem because now the timer is accessed only from the same coroutine which has an internal strand. During debugging I also added websocket support for `request_gun` tool.
38 lines
659 B
Go
38 lines
659 B
Go
package ammo_provider
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
"strings"
|
|
"sync/atomic"
|
|
)
|
|
|
|
type AmmoProvider struct {
|
|
ammo []string
|
|
currentBullet atomic.Uint64
|
|
}
|
|
|
|
func (ap *AmmoProvider) getIndex() uint64 {
|
|
result := ap.currentBullet.Add(1)
|
|
return result % uint64(len(ap.ammo))
|
|
}
|
|
|
|
func (ap *AmmoProvider) GetBullet() string {
|
|
for {
|
|
res := ap.ammo[ap.getIndex()]
|
|
if !strings.HasPrefix(res, "#") {
|
|
return res
|
|
}
|
|
}
|
|
}
|
|
|
|
func New(reader io.Reader) *AmmoProvider {
|
|
scanner := bufio.NewScanner(reader)
|
|
var ammo []string
|
|
for scanner.Scan() {
|
|
ammo = append(ammo, scanner.Text())
|
|
}
|
|
|
|
return &AmmoProvider{ammo: ammo}
|
|
}
|