diff --git a/server/src/bin/linux/server/server.h b/server/src/bin/linux/server/server.h new file mode 100644 index 0000000..94560bf --- /dev/null +++ b/server/src/bin/linux/server/server.h @@ -0,0 +1,81 @@ +/* Code generated by cmd/cgo; DO NOT EDIT. */ + +/* package musique/http-server/src */ + + +#line 1 "cgo-builtin-export-prolog" + +#include + +#ifndef GO_CGO_EXPORT_PROLOGUE_H +#define GO_CGO_EXPORT_PROLOGUE_H + +#ifndef GO_CGO_GOSTRING_TYPEDEF +typedef struct { const char *p; ptrdiff_t n; } _GoString_; +#endif + +#endif + +/* Start of preamble from import "C" comments. */ + + + + +/* End of preamble from import "C" comments. */ + + +/* Start of boilerplate cgo prologue. */ +#line 1 "cgo-gcc-export-header-prolog" + +#ifndef GO_CGO_PROLOGUE_H +#define GO_CGO_PROLOGUE_H + +typedef signed char GoInt8; +typedef unsigned char GoUint8; +typedef short GoInt16; +typedef unsigned short GoUint16; +typedef int GoInt32; +typedef unsigned int GoUint32; +typedef long long GoInt64; +typedef unsigned long long GoUint64; +typedef GoInt64 GoInt; +typedef GoUint64 GoUint; +typedef size_t GoUintptr; +typedef float GoFloat32; +typedef double GoFloat64; +#ifdef _MSC_VER +#include +typedef _Fcomplex GoComplex64; +typedef _Dcomplex GoComplex128; +#else +typedef float _Complex GoComplex64; +typedef double _Complex GoComplex128; +#endif + +/* + static assertion to make sure the file is being used on architecture + at least with matching size of GoInt. +*/ +typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1]; + +#ifndef GO_CGO_GOSTRING_TYPEDEF +typedef _GoString_ GoString; +#endif +typedef void *GoMap; +typedef void *GoChan; +typedef struct { void *t; void *v; } GoInterface; +typedef struct { void *data; GoInt len; GoInt cap; } GoSlice; + +#endif + +/* End of boilerplate cgo prologue. */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern void ServerInit(); + +#ifdef __cplusplus +} +#endif diff --git a/server/src/bin/linux/server/server.o b/server/src/bin/linux/server/server.o new file mode 100644 index 0000000..d44a661 Binary files /dev/null and b/server/src/bin/linux/server/server.o differ diff --git a/server/src/main.go b/server/src/main.go index 3a9856d..3851168 100644 --- a/server/src/main.go +++ b/server/src/main.go @@ -6,9 +6,9 @@ import ( "log" "net" "os" + "strings" "sync" "time" - "strings" ) func scanError(scanResult []string, conn net.Conn) { @@ -41,7 +41,7 @@ func remotef(host, command, format string, args ...interface{}) (int, error) { if err != nil { return 0, fmt.Errorf("remotef: parsing: %v", err) } - return parsedCount, nil + return parsedCount, nil } return 0, nil @@ -73,7 +73,7 @@ func timesync(hosts []string) []client { id, host := id, host go func() { defer wg.Done() - exchange := timeExchange{}; + exchange := timeExchange{} if exchange.estimateFor(host) { responses <- client{exchange, id, host} } @@ -95,15 +95,16 @@ func timesync(hosts []string) []client { const maxReactionTime = 300 -func notifyAll(clients []client) { +func notifyAll(clients []client) <-chan time.Time { wg := sync.WaitGroup{} wg.Add(len(clients)) startDeadline := time.After(maxReactionTime * time.Millisecond) + for _, client := range clients { client := client go func() { - startTime := maxReactionTime - (client.after - client.before) / 2 + startTime := maxReactionTime - (client.after-client.before)/2 _, err := remotef(client.addr, fmt.Sprintf("start %d", startTime), "") if err != nil { log.Printf("failed to notify %s: %v\n", client.addr, err) @@ -112,8 +113,7 @@ func notifyAll(clients []client) { }() } - <-startDeadline - return + return startDeadline } func main() { @@ -129,7 +129,10 @@ func main() { } go func(c net.Conn) { s := bufio.NewScanner(c) - var scanResult []string + scanResult := []string{ + "10.100.5.112:8081", + "10.100.5.44:8081", + } var clients []client for s.Scan() { resp := s.Text() @@ -171,7 +174,7 @@ func main() { continue } if resp == "notify" { - notifyAll(clients) + <-notifyAll(clients) log.Println("Started #notify") continue } diff --git a/server/src/musique-bridge.go b/server/src/musique-bridge.go index 2ab760b..4b22b58 100644 --- a/server/src/musique-bridge.go +++ b/server/src/musique-bridge.go @@ -2,26 +2,67 @@ package main import ( "C" + "net" + "bufio" "fmt" "time" + "strings" ) +var clients []client +var pinger chan struct{} + //export ServerInit func ServerInit() { - fmt.Println("Initializing server") + // scanResult = scan() + scanResult := []string{ + "10.100.5.112:8081", + "10.100.5.44:8081", + } + clients = timesync(scanResult) + + pinger = make(chan struct{}, 100) + + go func() { + l, err := net.Listen("tcp", ":8081") + if err != nil { + return + } + defer l.Close() + for { + conn, err := l.Accept() + if err != nil { + continue + } + go func(c net.Conn) { + defer c.Close() + s := bufio.NewScanner(c) + for s.Scan() { + response := s.Text() + if response == "time" { + fmt.Fprintln(conn, time.Now().UnixMilli()) + continue + } + + if strings.HasPrefix(response, "start") { + startTimeString := strings.TrimSpace(response[len("start"):]) + startTime := int64(0) + fmt.Sscanf(startTimeString, "%d", &startTime) + time.Sleep(time.Duration(startTime) * time.Millisecond) + pinger <- struct{}{} + continue + } + } + }(conn) + } + }() } //export ServerBeginProtocol func ServerBeginProtocol() { - protocol := []string{ - "Make the plan", - "Execute the plan", - "Expect the plan to go off the rails", - "Throw away the plan", - } - - for i, msg := range protocol { - fmt.Printf("%d. %s\n", i, msg) - time.Sleep(300 * time.Millisecond) + self := notifyAll(clients) + select { + case <- self: + case <- pinger: } } diff --git a/server/src/server.h b/server/src/server.h new file mode 100644 index 0000000..94560bf --- /dev/null +++ b/server/src/server.h @@ -0,0 +1,81 @@ +/* Code generated by cmd/cgo; DO NOT EDIT. */ + +/* package musique/http-server/src */ + + +#line 1 "cgo-builtin-export-prolog" + +#include + +#ifndef GO_CGO_EXPORT_PROLOGUE_H +#define GO_CGO_EXPORT_PROLOGUE_H + +#ifndef GO_CGO_GOSTRING_TYPEDEF +typedef struct { const char *p; ptrdiff_t n; } _GoString_; +#endif + +#endif + +/* Start of preamble from import "C" comments. */ + + + + +/* End of preamble from import "C" comments. */ + + +/* Start of boilerplate cgo prologue. */ +#line 1 "cgo-gcc-export-header-prolog" + +#ifndef GO_CGO_PROLOGUE_H +#define GO_CGO_PROLOGUE_H + +typedef signed char GoInt8; +typedef unsigned char GoUint8; +typedef short GoInt16; +typedef unsigned short GoUint16; +typedef int GoInt32; +typedef unsigned int GoUint32; +typedef long long GoInt64; +typedef unsigned long long GoUint64; +typedef GoInt64 GoInt; +typedef GoUint64 GoUint; +typedef size_t GoUintptr; +typedef float GoFloat32; +typedef double GoFloat64; +#ifdef _MSC_VER +#include +typedef _Fcomplex GoComplex64; +typedef _Dcomplex GoComplex128; +#else +typedef float _Complex GoComplex64; +typedef double _Complex GoComplex128; +#endif + +/* + static assertion to make sure the file is being used on architecture + at least with matching size of GoInt. +*/ +typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1]; + +#ifndef GO_CGO_GOSTRING_TYPEDEF +typedef _GoString_ GoString; +#endif +typedef void *GoMap; +typedef void *GoChan; +typedef struct { void *t; void *v; } GoInterface; +typedef struct { void *data; GoInt len; GoInt cap; } GoSlice; + +#endif + +/* End of boilerplate cgo prologue. */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern void ServerInit(); + +#ifdef __cplusplus +} +#endif diff --git a/server/src/src b/server/src/src new file mode 100755 index 0000000..91ebef2 Binary files /dev/null and b/server/src/src differ