From 902585d81b7a487bbc301060aad1dc1722f0f1f2 Mon Sep 17 00:00:00 2001 From: Tom Young Date: Sun, 12 Dec 2021 10:56:34 -0500 Subject: [PATCH 01/25] Fix go.mod files --- components/io/go.mod | 3 +++ components/subnets/go.mod | 3 +++ components/testrtn/go.mod | 3 +++ core/go.mod | 3 +++ go.mod | 15 +++++++++++++++ go.sum | 2 -- 6 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 components/io/go.mod create mode 100644 components/subnets/go.mod create mode 100644 components/testrtn/go.mod create mode 100644 core/go.mod diff --git a/components/io/go.mod b/components/io/go.mod new file mode 100644 index 0000000..b5a1235 --- /dev/null +++ b/components/io/go.mod @@ -0,0 +1,3 @@ +module github.com/jpaulm/gofbp/components/io + +go 1.17 diff --git a/components/subnets/go.mod b/components/subnets/go.mod new file mode 100644 index 0000000..2fb187e --- /dev/null +++ b/components/subnets/go.mod @@ -0,0 +1,3 @@ +module githup.com/jpaulm/gofbp/components/subnets + +go 1.17 diff --git a/components/testrtn/go.mod b/components/testrtn/go.mod new file mode 100644 index 0000000..91db267 --- /dev/null +++ b/components/testrtn/go.mod @@ -0,0 +1,3 @@ +module github.com/jpaulm/gofbp/components/testrtn + +go 1.17 diff --git a/core/go.mod b/core/go.mod new file mode 100644 index 0000000..ed7a529 --- /dev/null +++ b/core/go.mod @@ -0,0 +1,3 @@ +module github.com/jpaulm/gofbp/core + +go 1.17 diff --git a/go.mod b/go.mod index dfc619e..100bd61 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,18 @@ module github.com/jpaulm/gofbp +replace github.com/jpaulm/gofbp/components/io => ./components/io + +replace github.com/jpaulm/gofbp/core => ./core + +replace github.com/jpaulm/gofbp/components/subnets => ./components/subnets + +replace github.com/jpaulm/gofbp/components/testrtn => ./components/testrtn + go 1.17 + +require ( + github.com/jpaulm/gofbp/components/io v0.0.0-00010101000000-000000000000 + github.com/jpaulm/gofbp/components/subnets v0.0.0-00010101000000-000000000000 + github.com/jpaulm/gofbp/components/testrtn v0.0.0-00010101000000-000000000000 + github.com/jpaulm/gofbp/core v0.0.0-00010101000000-000000000000 +) diff --git a/go.sum b/go.sum index db93090..e69de29 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +0,0 @@ -github.com/jpaulm/gofbp v1.0.0 h1:ly0gtz/ihVuu1H71Z4iRLmz+n9AfqEkJHgTkIkxPEtc= -github.com/jpaulm/gofbp v1.0.0/go.mod h1:g2Dwwa5o9SUdYZCix8jfHG6N4dl1p2WNGYBsYfs6uZU= From 1fbe71fb9a0dda90017e08f0803e87200b529d3d Mon Sep 17 00:00:00 2001 From: Tom Young Date: Sun, 12 Dec 2021 14:58:07 -0500 Subject: [PATCH 02/25] Made process.go lint free --- core/inarrayport.go | 6 +++--- core/initializationconnection.go | 6 +++--- core/network.go | 4 ++-- core/process.go | 3 ++- core/subnet_support.go | 16 ++++++++-------- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/core/inarrayport.go b/core/inarrayport.go index 53c1eb5..50d92f5 100644 --- a/core/inarrayport.go +++ b/core/inarrayport.go @@ -10,9 +10,9 @@ type InArrayPort struct { portName string fullName string - array []*InPort - mtx sync.Mutex - closed bool + array []*InPort + mtx sync.Mutex + closed bool } func (c *InArrayPort) IsDrained() bool { diff --git a/core/initializationconnection.go b/core/initializationconnection.go index 88af991..8ee7b2b 100644 --- a/core/initializationconnection.go +++ b/core/initializationconnection.go @@ -9,9 +9,9 @@ type InitializationConnection struct { network *Network portName string fullName string - closed bool - value interface{} - mtx sync.Mutex + closed bool + value interface{} + mtx sync.Mutex } func (c *InitializationConnection) IsDrained() bool { diff --git a/core/network.go b/core/network.go index 842dd3c..70cfe9a 100644 --- a/core/network.go +++ b/core/network.go @@ -17,7 +17,7 @@ import ( var tracing bool var tracelocks bool -var generate_gids bool +var generateGids bool type Network struct { Name string @@ -331,7 +331,7 @@ func setOptions() { s = "" i = strings.Index(rec, s) if i > -1 && rec[i+len(s):i+len(s)+4] == "true" { - generate_gids = true + generateGids = true } } } diff --git a/core/process.go b/core/process.go index 652cda5..713e224 100644 --- a/core/process.go +++ b/core/process.go @@ -9,6 +9,7 @@ import ( "sync/atomic" ) +/** type Process defines a gofbp process */ type Process struct { gid uint64 Name string @@ -214,7 +215,7 @@ func (p *Process) Run() { defer trace(p, " terminated") trace(p, " started") - if generate_gids { + if generateGids { fmt.Println("Goroutine", p.Name+":", "no.", getGID()) } diff --git a/core/subnet_support.go b/core/subnet_support.go index de87af5..6cc982c 100644 --- a/core/subnet_support.go +++ b/core/subnet_support.go @@ -7,7 +7,7 @@ import ( type SubIn struct { //ipt InputConn - iptIp InputConn + iptIP InputConn out OutputConn eipt InputConn } @@ -22,12 +22,12 @@ func (subIn *SubIn) Setup(p *Process) { subIn.out = p.OpenOutPort("OUT") - subIn.iptIp = p.OpenInPort("NAME") + subIn.iptIP = p.OpenInPort("NAME") } func (subIn *SubIn) Execute(p *Process) { - icpkt := p.Receive(subIn.iptIp) + icpkt := p.Receive(subIn.iptIP) param := icpkt.Contents.(string) p.Discard(icpkt) @@ -56,7 +56,7 @@ func (subIn *SubIn) Execute(p *Process) { func (subIn *SubInSS) Execute(p *Process) { - icpkt := p.Receive(subIn.iptIp) + icpkt := p.Receive(subIn.iptIP) param := icpkt.Contents.(string) p.Discard(icpkt) @@ -92,7 +92,7 @@ func (subIn *SubInSS) Execute(p *Process) { type SubOut struct { ipt InputConn - iptIp InputConn + iptIP InputConn eopt OutputConn } @@ -104,14 +104,14 @@ func (subOut *SubOut) Setup(p *Process) { subOut.ipt = p.OpenInPort("IN") - subOut.iptIp = p.OpenInPort("NAME") + subOut.iptIP = p.OpenInPort("NAME") } //func (SubOut) MustRun() {} func (subOut *SubOut) Execute(p *Process) { - icpkt := p.Receive(subOut.iptIp) + icpkt := p.Receive(subOut.iptIP) param := icpkt.Contents.(string) p.Discard(icpkt) @@ -137,7 +137,7 @@ func (subOut *SubOut) Execute(p *Process) { } func (subOut *SubOutSS) Execute(p *Process) { - icpkt := p.Receive(subOut.iptIp) + icpkt := p.Receive(subOut.iptIP) param := icpkt.Contents.(string) p.Discard(icpkt) From c4d2f482c0f48fd5fcc26f8bc761c55bfa01b81b Mon Sep 17 00:00:00 2001 From: Tom Young Date: Sun, 12 Dec 2021 14:58:20 -0500 Subject: [PATCH 03/25] Made process.go lint free --- core/process.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/core/process.go b/core/process.go index 713e224..d56feb0 100644 --- a/core/process.go +++ b/core/process.go @@ -9,7 +9,7 @@ import ( "sync/atomic" ) -/** type Process defines a gofbp process */ +//Process type defines a gofbp process. type Process struct { gid uint64 Name string @@ -28,6 +28,7 @@ type Process struct { autoOutput inputCommon } +//Nostarted const reflects current process status const ( Notstarted int32 = iota Active @@ -37,6 +38,7 @@ const ( Terminated ) +//OpenInPort function opens and returns InputConn func (p *Process) OpenInPort(s string) InputConn { var in InputConn var b bool @@ -51,6 +53,7 @@ func (p *Process) OpenInPort(s string) InputConn { return in } +//OpenInArrayPort method opens and returns InArrayPort func (p *Process) OpenInArrayPort(s string) *InArrayPort { var in *InArrayPort var b bool @@ -67,6 +70,7 @@ func (p *Process) OpenInArrayPort(s string) *InArrayPort { return in } +//OpenOutPort method opens and returns OutputConn func (p *Process) OpenOutPort(s string) OutputConn { var out OutputConn var b bool @@ -86,6 +90,7 @@ func (p *Process) OpenOutPort(s string) OutputConn { } +//OpenOutPortOptional function opens and returns OutputConn func (p *Process) OpenOutPortOptional(s string) OutputConn { var out OutputConn var b bool @@ -109,6 +114,7 @@ func (p *Process) OpenOutPortOptional(s string) OutputConn { // not sure it makes sense to allow optional for array ports! +//OpenOutArrayPort method opens and returns OutArrayPort func (p *Process) OpenOutArrayPort(s string) *OutArrayPort { var out *OutArrayPort var b bool @@ -129,18 +135,22 @@ func (p *Process) OpenOutArrayPort(s string) *OutArrayPort { } // Send sends a packet to the output connection. -// Returns false when fails to send. + +//Send method emits Packet, returning false when fails to send. func (p *Process) Send(o OutputConn, pkt *Packet) bool { //o.SetSender(p) return o.send(p, pkt) } + +//Receive method accepts InputConn and returns Packet // Receive receives from the connection. // Returns nil, when there's no more data. func (p *Process) Receive(c InputConn) *Packet { return c.receive(p) } +//Close method closes InputConn func (p *Process) Close(c InputConn) { c.Close() } @@ -209,6 +219,7 @@ func (p *Process) inputState() (bool, bool, bool) { } } +//Run method initializes and Executes Process func (p *Process) Run() { defer atomic.StoreInt32(&p.status, Terminated) @@ -280,6 +291,7 @@ func (p *Process) isMustRun() bool { return hasMustRun } +//Create method creates and interface and returns a Packet // create packet containing anything! func (p *Process) Create(x interface{}) *Packet { var pkt *Packet = new(Packet) @@ -289,6 +301,7 @@ func (p *Process) Create(x interface{}) *Packet { return pkt } +//CreateBracket method builds a new Packet and returns it // create bracket func (p *Process) CreateBracket(pktType int32, s string) *Packet { var pkt *Packet = new(Packet) @@ -299,6 +312,7 @@ func (p *Process) CreateBracket(pktType int32, s string) *Packet { return pkt } +//Discard method sets Packet to nil func (p *Process) Discard(pkt *Packet) { if pkt == nil { panic("Discarding nil packet") From 0a9e6b648eeeff933d18922c3fa47040747af85d Mon Sep 17 00:00:00 2001 From: Tom Young Date: Sun, 12 Dec 2021 15:14:07 -0500 Subject: [PATCH 04/25] DeLint'ed components/... --- components/io/readfile.go | 3 +++ components/io/writefile.go | 12 ++++++++---- components/testrtn/counter.go | 2 -- components/testrtn/discard.go | 2 -- components/testrtn/kick.go | 2 -- components/testrtn/prefix.go | 8 ++++---- components/testrtn/selector.go | 8 ++++---- components/testrtn/sender.go | 4 ++-- 8 files changed, 21 insertions(+), 20 deletions(-) diff --git a/components/io/readfile.go b/components/io/readfile.go index c63d70f..39686c3 100644 --- a/components/io/readfile.go +++ b/components/io/readfile.go @@ -10,16 +10,19 @@ import ( "github.com/jpaulm/gofbp/core" ) +//ReadFile type defines ipt and opt type ReadFile struct { ipt core.InputConn opt core.OutputConn } +//Setup method opens readFile func (readFile *ReadFile) Setup(p *core.Process) { readFile.ipt = p.OpenInPort("FILENAME") readFile.opt = p.OpenOutPort("OUT") } +//Execute method starts Process func (readFile *ReadFile) Execute(p *core.Process) { icpkt := p.Receive(readFile.ipt) diff --git a/components/io/writefile.go b/components/io/writefile.go index 5a420a3..0c51998 100644 --- a/components/io/writefile.go +++ b/components/io/writefile.go @@ -7,29 +7,33 @@ import ( "github.com/jpaulm/gofbp/core" ) +// WriteFile type defines iptIP, ipt, and opt type WriteFile struct { - iptIp core.InputConn + iptIP core.InputConn ipt core.InputConn opt core.OutputConn } +//Setup method initializes Process func (writeFile *WriteFile) Setup(p *core.Process) { - writeFile.iptIp = p.OpenInPort("FILENAME") + writeFile.iptIP = p.OpenInPort("FILENAME") writeFile.ipt = p.OpenInPort("IN") writeFile.opt = p.OpenOutPortOptional("OUT") } +//MustRun method func (WriteFile) MustRun() {} +//Execute method strts Process func (writeFile *WriteFile) Execute(p *core.Process) { - icpkt := p.Receive(writeFile.iptIp) + icpkt := p.Receive(writeFile.iptIP) fname, ok := icpkt.Contents.(string) if !ok { panic("Parameter (file name) not a string") } p.Discard(icpkt) - p.Close(writeFile.iptIp) + p.Close(writeFile.iptIP) f, err := os.Create(fname) if err != nil { diff --git a/components/testrtn/counter.go b/components/testrtn/counter.go index 1b2134d..aea187e 100644 --- a/components/testrtn/counter.go +++ b/components/testrtn/counter.go @@ -22,7 +22,6 @@ func (counter *Counter) Setup(p *core.Process) { func (Counter) MustRun() {} func (counter *Counter) Execute(p *core.Process) { - count := 0 @@ -43,5 +42,4 @@ func (counter *Counter) Execute(p *core.Process) { pkt := p.Create(strconv.Itoa(count)) p.Send(counter.cnt, pkt) - } diff --git a/components/testrtn/discard.go b/components/testrtn/discard.go index 3cd3c6d..d77e585 100644 --- a/components/testrtn/discard.go +++ b/components/testrtn/discard.go @@ -17,7 +17,6 @@ func (discard *Discard) Setup(p *core.Process) { //func (Discard) MustRun() {} func (discard *Discard) Execute(p *core.Process) { - for { var pkt = p.Receive(discard.ipt) @@ -30,5 +29,4 @@ func (discard *Discard) Execute(p *core.Process) { } - } diff --git a/components/testrtn/kick.go b/components/testrtn/kick.go index ae05160..e9db4af 100644 --- a/components/testrtn/kick.go +++ b/components/testrtn/kick.go @@ -15,10 +15,8 @@ func (kick *Kick) Setup(p *core.Process) { } func (kick *Kick) Execute(p *core.Process) { - var pkt = p.Create("Kicker IP") p.Send(kick.opt, pkt) - } diff --git a/components/testrtn/prefix.go b/components/testrtn/prefix.go index 261fde2..8397f37 100644 --- a/components/testrtn/prefix.go +++ b/components/testrtn/prefix.go @@ -8,7 +8,7 @@ import ( type Prefix struct { ipt core.InputConn - iptIp core.InputConn + iptIP core.InputConn out core.OutputConn } @@ -18,17 +18,17 @@ func (prefix *Prefix) Setup(p *core.Process) { prefix.out = p.OpenOutPort("OUT") - prefix.iptIp = p.OpenInPort("PARAM") + prefix.iptIP = p.OpenInPort("PARAM") } func (prefix *Prefix) Execute(p *core.Process) { - icpkt := p.Receive(prefix.iptIp) + icpkt := p.Receive(prefix.iptIP) param := icpkt.Contents.(string) p.Discard(icpkt) - p.Close(prefix.iptIp) + p.Close(prefix.iptIP) for { var pkt = p.Receive(prefix.ipt) diff --git a/components/testrtn/selector.go b/components/testrtn/selector.go index d3adc87..85b2987 100644 --- a/components/testrtn/selector.go +++ b/components/testrtn/selector.go @@ -9,7 +9,7 @@ import ( type Selector struct { ipt core.InputConn - iptIp core.InputConn + iptIP core.InputConn out1 core.OutputConn out2 core.OutputConn } @@ -22,20 +22,20 @@ func (selector *Selector) Setup(p *core.Process) { selector.out2 = p.OpenOutPortOptional("REJ") - selector.iptIp = p.OpenInPort("PARAM") + selector.iptIP = p.OpenInPort("PARAM") } func (Selector) MustRun() {} func (selector *Selector) Execute(p *core.Process) { - icpkt := p.Receive(selector.iptIp) + icpkt := p.Receive(selector.iptIP) param := icpkt.Contents.(string) i := len(param) p.Discard(icpkt) - p.Close(selector.iptIp) + p.Close(selector.iptIP) for { var pkt = p.Receive(selector.ipt) diff --git a/components/testrtn/sender.go b/components/testrtn/sender.go index b73d262..532d8dd 100644 --- a/components/testrtn/sender.go +++ b/components/testrtn/sender.go @@ -18,7 +18,7 @@ func (sender *Sender) Setup(p *core.Process) { } func (sender *Sender) Execute(p *core.Process) { - + icpkt := p.Receive(sender.ipt) j, _ := strconv.Atoi(icpkt.Contents.(string)) p.Discard(icpkt) @@ -29,5 +29,5 @@ func (sender *Sender) Execute(p *core.Process) { pkt = p.Create("IP - # " + strconv.Itoa(i)) p.Send(sender.opt, pkt) } - + } From c41f3c65e670120a587de3ead015e865a2f35ffc Mon Sep 17 00:00:00 2001 From: Tom Young Date: Mon, 13 Dec 2021 06:39:33 -0500 Subject: [PATCH 05/25] Changed some go.mod files from jpaulm to tyoung3 --- components/testrtn/go.mod | 4 ++-- core/go.mod | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/testrtn/go.mod b/components/testrtn/go.mod index 91db267..3e14440 100644 --- a/components/testrtn/go.mod +++ b/components/testrtn/go.mod @@ -1,3 +1,3 @@ -module github.com/jpaulm/gofbp/components/testrtn - +module github.com/tyoung3/gofbp/components/testrtn +replace github.com/jpaulm/gofbp/components/testrtn github.com/tyoung3/gofbp/components/testrtn go 1.17 diff --git a/core/go.mod b/core/go.mod index ed7a529..e5dab6e 100644 --- a/core/go.mod +++ b/core/go.mod @@ -1,3 +1,3 @@ -module github.com/jpaulm/gofbp/core - +module github.com/tyoung3/gofbp/core +replace github.com/jpaulm/gofbp/core github.com/tyoung3/gofbp/core go 1.17 From d0f0546f8238639838698efd1d330a7e774e6c7e Mon Sep 17 00:00:00 2001 From: Tom Young Date: Mon, 13 Dec 2021 07:03:53 -0500 Subject: [PATCH 06/25] Add version to go.mod replace directives --- components/testrtn/go.mod | 5 +++-- core/go.mod | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/components/testrtn/go.mod b/components/testrtn/go.mod index 3e14440..dea9689 100644 --- a/components/testrtn/go.mod +++ b/components/testrtn/go.mod @@ -1,3 +1,4 @@ -module github.com/tyoung3/gofbp/components/testrtn -replace github.com/jpaulm/gofbp/components/testrtn github.com/tyoung3/gofbp/components/testrtn +module github.com/tyoung3/gofbp/components/testrtn +replace github.com/jpaulm/gofbp/components/testrtn => github.com/tyoung3/gofbp/components/testrtn v0.0.0 +replace github.com/jpaulm/gofbp/core => github.com/tyoung3/gofbp/core v0.0.0 go 1.17 diff --git a/core/go.mod b/core/go.mod index e5dab6e..1590a60 100644 --- a/core/go.mod +++ b/core/go.mod @@ -1,3 +1,5 @@ module github.com/tyoung3/gofbp/core -replace github.com/jpaulm/gofbp/core github.com/tyoung3/gofbp/core + +replace github.com/jpaulm/gofbp/core => github.com/tyoung3/gofbp/core v0.0.0 + go 1.17 From da95df65f1574cde48482921b3145d546ed694e4 Mon Sep 17 00:00:00 2001 From: Tom Young Date: Mon, 13 Dec 2021 07:47:21 -0500 Subject: [PATCH 07/25] Removed some go.mod file --- components/io/go.mod | 3 --- components/subnets/go.mod | 3 --- components/testrtn/go.mod | 4 ---- core/go.mod | 5 ----- go.mod | 7 ------- 5 files changed, 22 deletions(-) delete mode 100644 components/io/go.mod delete mode 100644 components/subnets/go.mod delete mode 100644 components/testrtn/go.mod delete mode 100644 core/go.mod diff --git a/components/io/go.mod b/components/io/go.mod deleted file mode 100644 index b5a1235..0000000 --- a/components/io/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/jpaulm/gofbp/components/io - -go 1.17 diff --git a/components/subnets/go.mod b/components/subnets/go.mod deleted file mode 100644 index 2fb187e..0000000 --- a/components/subnets/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module githup.com/jpaulm/gofbp/components/subnets - -go 1.17 diff --git a/components/testrtn/go.mod b/components/testrtn/go.mod deleted file mode 100644 index dea9689..0000000 --- a/components/testrtn/go.mod +++ /dev/null @@ -1,4 +0,0 @@ -module github.com/tyoung3/gofbp/components/testrtn -replace github.com/jpaulm/gofbp/components/testrtn => github.com/tyoung3/gofbp/components/testrtn v0.0.0 -replace github.com/jpaulm/gofbp/core => github.com/tyoung3/gofbp/core v0.0.0 -go 1.17 diff --git a/core/go.mod b/core/go.mod deleted file mode 100644 index 1590a60..0000000 --- a/core/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/tyoung3/gofbp/core - -replace github.com/jpaulm/gofbp/core => github.com/tyoung3/gofbp/core v0.0.0 - -go 1.17 diff --git a/go.mod b/go.mod index 100bd61..ca191bd 100644 --- a/go.mod +++ b/go.mod @@ -9,10 +9,3 @@ replace github.com/jpaulm/gofbp/components/subnets => ./components/subnets replace github.com/jpaulm/gofbp/components/testrtn => ./components/testrtn go 1.17 - -require ( - github.com/jpaulm/gofbp/components/io v0.0.0-00010101000000-000000000000 - github.com/jpaulm/gofbp/components/subnets v0.0.0-00010101000000-000000000000 - github.com/jpaulm/gofbp/components/testrtn v0.0.0-00010101000000-000000000000 - github.com/jpaulm/gofbp/core v0.0.0-00010101000000-000000000000 -) From d5c7799cdb048b3d548c6992292d9960c41df90c Mon Sep 17 00:00:00 2001 From: Tom Young Date: Wed, 15 Dec 2021 09:24:18 -0500 Subject: [PATCH 08/25] v1.0.1 --- core/component.go => component.go | 2 +- components/subnets/sssubnet1.go | 27 ------------------ components/subnets/sssubnet2.go | 27 ------------------ components/subnets/subnet1.go | 27 ------------------ go.mod | 8 ------ core/inarrayport.go => inarrayport.go | 2 +- ...nnection.go => initializationconnection.go | 2 +- core/inport.go => inport.go | 2 +- core/inputconn.go => inputconn.go | 2 +- .../force_deadlock_test.go | 0 gofbp_test.go => internal/gofbp_test.go | 20 ++++++------- params.xml => internal/params.xml | 0 renovate.json => internal/renovate.json | 0 settings.json => internal/settings.json | 0 .../testdata}/deadlock/main.go | 0 {testdata => internal/testdata}/infqueue | 0 {testdata => internal/testdata}/testdata.txt | 0 .../testinfqueueasmain_test.go | 8 +++--- .../testloadbal_test.go | 6 ++-- .../testsubnet1_test.go | 8 +++--- .../testsubnet2_test.go | 8 +++--- .../testsubnet3_test.go | 8 +++--- {components/io => io}/readfile.go | 16 +++++------ {components/io => io}/writefile.go | 14 ++++----- core/network.go => network.go | 2 +- core/nulloutport.go => nulloutport.go | 2 +- core/outarrayport.go => outarrayport.go | 2 +- core/outport.go => outport.go | 2 +- core/outputconn.go => outputconn.go | 2 +- core/packet.go => packet.go | 2 +- .../download/golang.org/x/tools/gopls/@v/list | 1 - .../golang.org/x/tools/gopls/@v/v0.7.3.info | 1 - .../golang.org/x/tools/gopls/@v/v0.7.3.mod | 24 ---------------- .../lookup/golang.org/x/tools/gopls@v0.7.3 | 9 ------ .../sumdb/sum.golang.org/tile/8/0/x028/713 | Bin 8192 -> 0 bytes .../sum.golang.org/tile/8/0/x029/808.p/160 | Bin 5120 -> 0 bytes .../sumdb/sum.golang.org/tile/8/1/112 | Bin 8192 -> 0 bytes .../sumdb/sum.golang.org/tile/8/1/116.p/112 | Bin 3584 -> 0 bytes .../sumdb/sum.golang.org/tile/8/2/000.p/116 | Bin 3712 -> 0 bytes pkg/mod/cache/lock | 0 pkg/sumdb/sum.golang.org/latest | 5 ---- core/process.go => process.go | 15 +++++----- core/subnet_support.go => subnet_support.go | 2 +- subnets/sssubnet1.go | 27 ++++++++++++++++++ subnets/sssubnet2.go | 27 ++++++++++++++++++ subnets/subnet1.go | 27 ++++++++++++++++++ {components/testrtn => testrtn}/concatstr.go | 10 +++---- {components/testrtn => testrtn}/counter.go | 12 ++++---- .../testrtn => testrtn}/delayedreceiver.go | 8 +++--- {components/testrtn => testrtn}/discard.go | 8 +++--- {components/testrtn => testrtn}/kick.go | 8 +++--- .../testrtn => testrtn}/loadbalance.go | 14 ++++----- {components/testrtn => testrtn}/prefix.go | 12 ++++---- {components/testrtn => testrtn}/receiver.go | 8 +++--- .../testrtn => testrtn}/roundrobinsender.go | 10 +++---- {components/testrtn => testrtn}/selector.go | 14 ++++----- {components/testrtn => testrtn}/sender.go | 12 ++++---- .../testrtn => testrtn}/substreamsender.go | 24 ++++++++-------- .../testrtn => testrtn}/writetoconsnl.go | 14 ++++----- .../testrtn => testrtn}/writetoconsole.go | 14 ++++----- 60 files changed, 228 insertions(+), 277 deletions(-) rename core/component.go => component.go (90%) delete mode 100644 components/subnets/sssubnet1.go delete mode 100644 components/subnets/sssubnet2.go delete mode 100644 components/subnets/subnet1.go rename core/inarrayport.go => inarrayport.go (98%) rename core/initializationconnection.go => initializationconnection.go (98%) rename core/inport.go => inport.go (99%) rename core/inputconn.go => inputconn.go (96%) rename force_deadlock_test.go => internal/force_deadlock_test.go (100%) rename gofbp_test.go => internal/gofbp_test.go (90%) rename params.xml => internal/params.xml (100%) rename renovate.json => internal/renovate.json (100%) rename settings.json => internal/settings.json (100%) rename {testdata => internal/testdata}/deadlock/main.go (100%) rename {testdata => internal/testdata}/infqueue (100%) rename {testdata => internal/testdata}/testdata.txt (100%) rename testinfqueueasmain_test.go => internal/testinfqueueasmain_test.go (78%) rename testloadbal_test.go => internal/testloadbal_test.go (83%) rename testsubnet1_test.go => internal/testsubnet1_test.go (70%) rename testsubnet2_test.go => internal/testsubnet2_test.go (77%) rename testsubnet3_test.go => internal/testsubnet3_test.go (80%) rename {components/io => io}/readfile.go (76%) rename {components/io => io}/writefile.go (81%) rename core/network.go => network.go (99%) rename core/nulloutport.go => nulloutport.go (95%) rename core/outarrayport.go => outarrayport.go (98%) rename core/outport.go => outport.go (99%) rename core/outputconn.go => outputconn.go (95%) rename core/packet.go => packet.go (90%) delete mode 100644 pkg/mod/cache/download/golang.org/x/tools/gopls/@v/list delete mode 100644 pkg/mod/cache/download/golang.org/x/tools/gopls/@v/v0.7.3.info delete mode 100644 pkg/mod/cache/download/golang.org/x/tools/gopls/@v/v0.7.3.mod delete mode 100644 pkg/mod/cache/download/sumdb/sum.golang.org/lookup/golang.org/x/tools/gopls@v0.7.3 delete mode 100644 pkg/mod/cache/download/sumdb/sum.golang.org/tile/8/0/x028/713 delete mode 100644 pkg/mod/cache/download/sumdb/sum.golang.org/tile/8/0/x029/808.p/160 delete mode 100644 pkg/mod/cache/download/sumdb/sum.golang.org/tile/8/1/112 delete mode 100644 pkg/mod/cache/download/sumdb/sum.golang.org/tile/8/1/116.p/112 delete mode 100644 pkg/mod/cache/download/sumdb/sum.golang.org/tile/8/2/000.p/116 delete mode 100644 pkg/mod/cache/lock delete mode 100644 pkg/sumdb/sum.golang.org/latest rename core/process.go => process.go (96%) rename core/subnet_support.go => subnet_support.go (99%) create mode 100644 subnets/sssubnet1.go create mode 100644 subnets/sssubnet2.go create mode 100644 subnets/subnet1.go rename {components/testrtn => testrtn}/concatstr.go (68%) rename {components/testrtn => testrtn}/counter.go (71%) rename {components/testrtn => testrtn}/delayedreceiver.go (67%) rename {components/testrtn => testrtn}/discard.go (63%) rename {components/testrtn => testrtn}/kick.go (52%) rename {components/testrtn => testrtn}/loadbalance.go (62%) rename {components/testrtn => testrtn}/prefix.go (73%) rename {components/testrtn => testrtn}/receiver.go (65%) rename {components/testrtn => testrtn}/roundrobinsender.go (66%) rename {components/testrtn => testrtn}/selector.go (77%) rename {components/testrtn => testrtn}/sender.go (66%) rename {components/testrtn => testrtn}/substreamsender.go (55%) rename {components/testrtn => testrtn}/writetoconsnl.go (67%) rename {components/testrtn => testrtn}/writetoconsole.go (65%) diff --git a/core/component.go b/component.go similarity index 90% rename from core/component.go rename to component.go index d7d96d6..d75ac47 100644 --- a/core/component.go +++ b/component.go @@ -1,4 +1,4 @@ -package core +package gofbp type Component interface { Setup(*Process) diff --git a/components/subnets/sssubnet1.go b/components/subnets/sssubnet1.go deleted file mode 100644 index db07317..0000000 --- a/components/subnets/sssubnet1.go +++ /dev/null @@ -1,27 +0,0 @@ -package subnets - -import ( - "github.com/jpaulm/gofbp/components/testrtn" - "github.com/jpaulm/gofbp/core" -) - -type SSSubnet1 struct{} - -func (subnet *SSSubnet1) Setup(p *core.Process) {} - -func (subnet *SSSubnet1) Execute(p *core.Process) { - net := core.NewSubnet("SSSubnet1", p) - - proc1 := net.NewProc("SubInSS", &core.SubInSS{}) // Substream-Sensitive SubIn - - proc2 := net.NewProc("WriteToConsole1", &testrtn.WriteToConsole{}) - - proc3 := net.NewProc("SubOutSS", &core.SubOutSS{}) // Substream-delimiter-Generating SubOut - - net.Initialize("IN", proc1, "NAME") - net.Connect(proc1, "OUT", proc2, "IN", 6) - net.Connect(proc2, "OUT", proc3, "IN", 6) - net.Initialize("OUT", proc3, "NAME") - - net.Run() -} diff --git a/components/subnets/sssubnet2.go b/components/subnets/sssubnet2.go deleted file mode 100644 index 3c4a94f..0000000 --- a/components/subnets/sssubnet2.go +++ /dev/null @@ -1,27 +0,0 @@ -package subnets - -import ( - "github.com/jpaulm/gofbp/components/testrtn" - "github.com/jpaulm/gofbp/core" -) - -type SSSubnet2 struct{} - -func (subnet *SSSubnet2) Setup(p *core.Process) {} - -func (subnet *SSSubnet2) Execute(p *core.Process) { - net := core.NewSubnet("SSSubnet2", p) - - proc1 := net.NewProc("SubInSS", &core.SubInSS{}) // Substream-Sensitive SubIn - - proc2 := net.NewProc("Count", &testrtn.Counter{}) // count length of each substream (excl. brackets) - - proc3 := net.NewProc("SubOut", &core.SubOut{}) // Basic SubOut - - net.Initialize("IN", proc1, "NAME") - net.Connect(proc1, "OUT", proc2, "IN", 6) - net.Connect(proc2, "COUNT", proc3, "IN", 6) - net.Initialize("OUT", proc3, "NAME") - - net.Run() -} diff --git a/components/subnets/subnet1.go b/components/subnets/subnet1.go deleted file mode 100644 index 7147336..0000000 --- a/components/subnets/subnet1.go +++ /dev/null @@ -1,27 +0,0 @@ -package subnets - -import ( - "github.com/jpaulm/gofbp/components/testrtn" - "github.com/jpaulm/gofbp/core" -) - -type Subnet1 struct{} - -func (subnet *Subnet1) Setup(p *core.Process) {} - -func (subnet *Subnet1) Execute(p *core.Process) { - net := core.NewSubnet("Subnet1", p) - - proc1 := net.NewProc("SubIn", &core.SubIn{}) - - proc2 := net.NewProc("WriteToConsole1", &testrtn.WriteToConsole{}) - - proc3 := net.NewProc("SubOut", &core.SubOut{}) - - net.Initialize("IN", proc1, "NAME") - net.Connect(proc1, "OUT", proc2, "IN", 6) - net.Connect(proc2, "OUT", proc3, "IN", 6) - net.Initialize("OUT", proc3, "NAME") - - net.Run() -} diff --git a/go.mod b/go.mod index ca191bd..dfc619e 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,3 @@ module github.com/jpaulm/gofbp -replace github.com/jpaulm/gofbp/components/io => ./components/io - -replace github.com/jpaulm/gofbp/core => ./core - -replace github.com/jpaulm/gofbp/components/subnets => ./components/subnets - -replace github.com/jpaulm/gofbp/components/testrtn => ./components/testrtn - go 1.17 diff --git a/core/inarrayport.go b/inarrayport.go similarity index 98% rename from core/inarrayport.go rename to inarrayport.go index 50d92f5..3f39f94 100644 --- a/core/inarrayport.go +++ b/inarrayport.go @@ -1,4 +1,4 @@ -package core +package gofbp import ( //"fmt" diff --git a/core/initializationconnection.go b/initializationconnection.go similarity index 98% rename from core/initializationconnection.go rename to initializationconnection.go index 8ee7b2b..e4e3419 100644 --- a/core/initializationconnection.go +++ b/initializationconnection.go @@ -1,4 +1,4 @@ -package core +package gofbp import ( //"fmt" diff --git a/core/inport.go b/inport.go similarity index 99% rename from core/inport.go rename to inport.go index 7a755a5..6299b09 100644 --- a/core/inport.go +++ b/inport.go @@ -1,4 +1,4 @@ -package core +package gofbp import ( //"fmt" diff --git a/core/inputconn.go b/inputconn.go similarity index 96% rename from core/inputconn.go rename to inputconn.go index 3a5ecb8..2f07f1c 100644 --- a/core/inputconn.go +++ b/inputconn.go @@ -1,4 +1,4 @@ -package core +package gofbp type inputCommon interface { IsDrained() bool diff --git a/force_deadlock_test.go b/internal/force_deadlock_test.go similarity index 100% rename from force_deadlock_test.go rename to internal/force_deadlock_test.go diff --git a/gofbp_test.go b/internal/gofbp_test.go similarity index 90% rename from gofbp_test.go rename to internal/gofbp_test.go index 6c31142..f507e46 100644 --- a/gofbp_test.go +++ b/internal/gofbp_test.go @@ -5,13 +5,13 @@ import ( "path/filepath" - "github.com/jpaulm/gofbp/components/io" - "github.com/jpaulm/gofbp/components/testrtn" - "github.com/jpaulm/gofbp/core" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/io" + "github.com/jpaulm/gofbp/testrtn" ) func TestMerge(t *testing.T) { - net := core.NewNetwork("Merge") + net := gofbp.NewNetwork("Merge") proc1 := net.NewProc("Sender1", &testrtn.Sender{}) proc2 := net.NewProc("Sender2", &testrtn.Sender{}) @@ -27,7 +27,7 @@ func TestMerge(t *testing.T) { } func TestConcat(t *testing.T) { - net := core.NewNetwork("Concat") + net := gofbp.NewNetwork("Concat") proc1 := net.NewProc("Sender", &testrtn.Sender{}) @@ -47,7 +47,7 @@ func TestConcat(t *testing.T) { } func TestRRDist(t *testing.T) { - net := core.NewNetwork("RRDist") + net := gofbp.NewNetwork("RRDist") proc1 := net.NewProc("Sender", &testrtn.Sender{}) @@ -67,7 +67,7 @@ func TestRRDist(t *testing.T) { } func TestCopyFile(t *testing.T) { - net := core.NewNetwork("CopyFile") + net := gofbp.NewNetwork("CopyFile") proc1 := net.NewProc("ReadFile", &io.ReadFile{}) @@ -84,7 +84,7 @@ func TestDoSelect1(t *testing.T) { // port REJ from proc2 is connected - net := core.NewNetwork("DoSelect1") + net := gofbp.NewNetwork("DoSelect1") proc1 := net.NewProc("ReadFile", &io.ReadFile{}) proc2 := net.NewProc("Select", &testrtn.Selector{}) @@ -105,7 +105,7 @@ func TestDoSelect2(t *testing.T) { // port REJ from proc2 is NOT connected - net := core.NewNetwork("DoSelect2") + net := gofbp.NewNetwork("DoSelect2") proc1 := net.NewProc("ReadFile", &io.ReadFile{}) proc2 := net.NewProc("Select", &testrtn.Selector{}) @@ -123,7 +123,7 @@ func TestDoSelect2(t *testing.T) { } func TestWriteToConsUsingNL(t *testing.T) { - net := core.NewNetwork("TestWriteToConsUsingNL") + net := gofbp.NewNetwork("TestWriteToConsUsingNL") proc1 := net.NewProc("Sender1", &testrtn.Sender{}) proc2 := net.NewProc("Sender2", &testrtn.Sender{}) diff --git a/params.xml b/internal/params.xml similarity index 100% rename from params.xml rename to internal/params.xml diff --git a/renovate.json b/internal/renovate.json similarity index 100% rename from renovate.json rename to internal/renovate.json diff --git a/settings.json b/internal/settings.json similarity index 100% rename from settings.json rename to internal/settings.json diff --git a/testdata/deadlock/main.go b/internal/testdata/deadlock/main.go similarity index 100% rename from testdata/deadlock/main.go rename to internal/testdata/deadlock/main.go diff --git a/testdata/infqueue b/internal/testdata/infqueue similarity index 100% rename from testdata/infqueue rename to internal/testdata/infqueue diff --git a/testdata/testdata.txt b/internal/testdata/testdata.txt similarity index 100% rename from testdata/testdata.txt rename to internal/testdata/testdata.txt diff --git a/testinfqueueasmain_test.go b/internal/testinfqueueasmain_test.go similarity index 78% rename from testinfqueueasmain_test.go rename to internal/testinfqueueasmain_test.go index b52f20a..50c8efd 100644 --- a/testinfqueueasmain_test.go +++ b/internal/testinfqueueasmain_test.go @@ -3,13 +3,13 @@ package main import ( "testing" - "github.com/jpaulm/gofbp/components/io" - "github.com/jpaulm/gofbp/components/testrtn" - "github.com/jpaulm/gofbp/core" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/io" + "github.com/jpaulm/gofbp/testrtn" ) func TestInfQueueAsMain(t *testing.T) { - net := core.NewNetwork("InfQueueAsMain") + net := gofbp.NewNetwork("InfQueueAsMain") proc1 := net.NewProc("Sender", &testrtn.Sender{}) proc2 := net.NewProc("WriteFile", &io.WriteFile{}) diff --git a/testloadbal_test.go b/internal/testloadbal_test.go similarity index 83% rename from testloadbal_test.go rename to internal/testloadbal_test.go index 18998be..f5efd06 100644 --- a/testloadbal_test.go +++ b/internal/testloadbal_test.go @@ -3,12 +3,12 @@ package main import ( "testing" - "github.com/jpaulm/gofbp/components/testrtn" - "github.com/jpaulm/gofbp/core" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/testrtn" ) func TestLoadBal(t *testing.T) { - net := core.NewNetwork("TestLoadBal") + net := gofbp.NewNetwork("TestLoadBal") proc1 := net.NewProc("Sender", &testrtn.Sender{}) diff --git a/testsubnet1_test.go b/internal/testsubnet1_test.go similarity index 70% rename from testsubnet1_test.go rename to internal/testsubnet1_test.go index a97d83b..82031e0 100644 --- a/testsubnet1_test.go +++ b/internal/testsubnet1_test.go @@ -3,13 +3,13 @@ package main import ( "testing" - "github.com/jpaulm/gofbp/components/subnets" - "github.com/jpaulm/gofbp/components/testrtn" - "github.com/jpaulm/gofbp/core" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/subnets" + "github.com/jpaulm/gofbp/testrtn" ) func TestSubnet1(t *testing.T) { - net := core.NewNetwork("TestSubnet1") + net := gofbp.NewNetwork("TestSubnet1") proc1 := net.NewProc("Sender1", &testrtn.Sender{}) diff --git a/testsubnet2_test.go b/internal/testsubnet2_test.go similarity index 77% rename from testsubnet2_test.go rename to internal/testsubnet2_test.go index daa839d..0a0da00 100644 --- a/testsubnet2_test.go +++ b/internal/testsubnet2_test.go @@ -5,13 +5,13 @@ package main import ( "testing" - "github.com/jpaulm/gofbp/components/subnets" - "github.com/jpaulm/gofbp/components/testrtn" - "github.com/jpaulm/gofbp/core" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/subnets" + "github.com/jpaulm/gofbp/testrtn" ) func TestSubnet2(t *testing.T) { - net := core.NewNetwork("TestSubnet2") + net := gofbp.NewNetwork("TestSubnet2") proc1 := net.NewProc("SubstreamSender", &testrtn.SubstreamSender{}) // sends multiple substreams of varying lengths diff --git a/testsubnet3_test.go b/internal/testsubnet3_test.go similarity index 80% rename from testsubnet3_test.go rename to internal/testsubnet3_test.go index d8f0637..37afec4 100644 --- a/testsubnet3_test.go +++ b/internal/testsubnet3_test.go @@ -5,13 +5,13 @@ package main import ( "testing" - "github.com/jpaulm/gofbp/components/subnets" - "github.com/jpaulm/gofbp/components/testrtn" - "github.com/jpaulm/gofbp/core" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/subnets" + "github.com/jpaulm/gofbp/testrtn" ) func TestSubnet3(t *testing.T) { - net := core.NewNetwork("TestSubnet3") + net := gofbp.NewNetwork("TestSubnet3") proc1 := net.NewProc("SubstreamSender", &testrtn.SubstreamSender{}) // sends multiple substreams of varying lengths proc1a := net.NewProc("WriteToConsole3", &testrtn.WriteToConsole{}) diff --git a/components/io/readfile.go b/io/readfile.go similarity index 76% rename from components/io/readfile.go rename to io/readfile.go index 39686c3..780ae23 100644 --- a/components/io/readfile.go +++ b/io/readfile.go @@ -7,23 +7,23 @@ import ( "os" "strings" - "github.com/jpaulm/gofbp/core" + "github.com/jpaulm/gofbp" ) //ReadFile type defines ipt and opt type ReadFile struct { - ipt core.InputConn - opt core.OutputConn + ipt gofbp.InputConn + opt gofbp.OutputConn } -//Setup method opens readFile -func (readFile *ReadFile) Setup(p *core.Process) { +//Setup method opens readFile +func (readFile *ReadFile) Setup(p *gofbp.Process) { readFile.ipt = p.OpenInPort("FILENAME") readFile.opt = p.OpenOutPort("OUT") } -//Execute method starts Process -func (readFile *ReadFile) Execute(p *core.Process) { +//Execute method starts Process +func (readFile *ReadFile) Execute(p *gofbp.Process) { icpkt := p.Receive(readFile.ipt) fname, ok := icpkt.Contents.(string) @@ -37,7 +37,7 @@ func (readFile *ReadFile) Execute(p *core.Process) { p.Discard(icpkt) p.Close(readFile.ipt) - var pkt *core.Packet + var pkt *gofbp.Packet var rec string defer f.Close() diff --git a/components/io/writefile.go b/io/writefile.go similarity index 81% rename from components/io/writefile.go rename to io/writefile.go index 0c51998..23509a3 100644 --- a/components/io/writefile.go +++ b/io/writefile.go @@ -4,28 +4,28 @@ import ( "fmt" "os" - "github.com/jpaulm/gofbp/core" + "github.com/jpaulm/gofbp" ) // WriteFile type defines iptIP, ipt, and opt type WriteFile struct { - iptIP core.InputConn - ipt core.InputConn - opt core.OutputConn + iptIP gofbp.InputConn + ipt gofbp.InputConn + opt gofbp.OutputConn } //Setup method initializes Process -func (writeFile *WriteFile) Setup(p *core.Process) { +func (writeFile *WriteFile) Setup(p *gofbp.Process) { writeFile.iptIP = p.OpenInPort("FILENAME") writeFile.ipt = p.OpenInPort("IN") writeFile.opt = p.OpenOutPortOptional("OUT") } -//MustRun method +//MustRun method func (WriteFile) MustRun() {} //Execute method strts Process -func (writeFile *WriteFile) Execute(p *core.Process) { +func (writeFile *WriteFile) Execute(p *gofbp.Process) { icpkt := p.Receive(writeFile.iptIP) fname, ok := icpkt.Contents.(string) diff --git a/core/network.go b/network.go similarity index 99% rename from core/network.go rename to network.go index 70cfe9a..d7235d7 100644 --- a/core/network.go +++ b/network.go @@ -1,4 +1,4 @@ -package core +package gofbp import ( "fmt" diff --git a/core/nulloutport.go b/nulloutport.go similarity index 95% rename from core/nulloutport.go rename to nulloutport.go index 8903f28..9d31c6c 100644 --- a/core/nulloutport.go +++ b/nulloutport.go @@ -1,4 +1,4 @@ -package core +package gofbp type NullOutPort struct { sender *Process diff --git a/core/outarrayport.go b/outarrayport.go similarity index 98% rename from core/outarrayport.go rename to outarrayport.go index 119bf41..c6154cf 100644 --- a/core/outarrayport.go +++ b/outarrayport.go @@ -1,4 +1,4 @@ -package core +package gofbp import ( //"fmt" diff --git a/core/outport.go b/outport.go similarity index 99% rename from core/outport.go rename to outport.go index eb056a0..19d4f8d 100644 --- a/core/outport.go +++ b/outport.go @@ -1,4 +1,4 @@ -package core +package gofbp import ( "sync/atomic" diff --git a/core/outputconn.go b/outputconn.go similarity index 95% rename from core/outputconn.go rename to outputconn.go index a4e5a7b..e91aa7c 100644 --- a/core/outputconn.go +++ b/outputconn.go @@ -1,4 +1,4 @@ -package core +package gofbp type outputCommon interface { Close() diff --git a/core/packet.go b/packet.go similarity index 90% rename from core/packet.go rename to packet.go index f5cd950..8a12c62 100644 --- a/core/packet.go +++ b/packet.go @@ -1,4 +1,4 @@ -package core +package gofbp const ( Normal int32 = iota diff --git a/pkg/mod/cache/download/golang.org/x/tools/gopls/@v/list b/pkg/mod/cache/download/golang.org/x/tools/gopls/@v/list deleted file mode 100644 index 3d105a6..0000000 --- a/pkg/mod/cache/download/golang.org/x/tools/gopls/@v/list +++ /dev/null @@ -1 +0,0 @@ -v0.7.3 diff --git a/pkg/mod/cache/download/golang.org/x/tools/gopls/@v/v0.7.3.info b/pkg/mod/cache/download/golang.org/x/tools/gopls/@v/v0.7.3.info deleted file mode 100644 index e5ac8d4..0000000 --- a/pkg/mod/cache/download/golang.org/x/tools/gopls/@v/v0.7.3.info +++ /dev/null @@ -1 +0,0 @@ -{"Version":"v0.7.3","Time":"2021-10-15T15:11:15Z"} \ No newline at end of file diff --git a/pkg/mod/cache/download/golang.org/x/tools/gopls/@v/v0.7.3.mod b/pkg/mod/cache/download/golang.org/x/tools/gopls/@v/v0.7.3.mod deleted file mode 100644 index 795c149..0000000 --- a/pkg/mod/cache/download/golang.org/x/tools/gopls/@v/v0.7.3.mod +++ /dev/null @@ -1,24 +0,0 @@ -module golang.org/x/tools/gopls - -go 1.18 - -require ( - github.com/google/go-cmp v0.5.6 - github.com/jba/templatecheck v0.6.0 - github.com/sanity-io/litter v1.5.1 - github.com/sergi/go-diff v1.1.0 - golang.org/x/mod v0.4.2 - golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e - golang.org/x/tools v0.1.8-0.20211014194737-fc98fb2abd48 - honnef.co/go/tools v0.2.0 - mvdan.cc/gofumpt v0.1.1 - mvdan.cc/xurls/v2 v2.3.0 -) - -require ( - github.com/BurntSushi/toml v0.3.1 // indirect - github.com/google/safehtml v0.0.2 // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/text v0.3.6 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect -) diff --git a/pkg/mod/cache/download/sumdb/sum.golang.org/lookup/golang.org/x/tools/gopls@v0.7.3 b/pkg/mod/cache/download/sumdb/sum.golang.org/lookup/golang.org/x/tools/gopls@v0.7.3 deleted file mode 100644 index 719a1d7..0000000 --- a/pkg/mod/cache/download/sumdb/sum.golang.org/lookup/golang.org/x/tools/gopls@v0.7.3 +++ /dev/null @@ -1,9 +0,0 @@ -7350634 -golang.org/x/tools/gopls v0.7.3 h1:Lru57ht8vtDMouRskFC085VAjBAZRAISd/lwvwOOV0Q= -golang.org/x/tools/gopls v0.7.3/go.mod h1:I2g1ow+mLbhf12iRXU2CMngcTXz8ge7kbrQUNp34Axw= - -go.sum database tree -7631008 -mdir6bwUx2zzU+4xJ7mpBZ6jby5m3oZ6dkmNRClHxBI= - -— sum.golang.org Az3griw85MEInWHLd6r3nZnTlE8xL4ctOg1Q0gNRc0op67cpiVp3sWOB04qZEL9QxyfTcpdy2mKfvYXsKMZRwKfSdQE= diff --git a/pkg/mod/cache/download/sumdb/sum.golang.org/tile/8/0/x028/713 b/pkg/mod/cache/download/sumdb/sum.golang.org/tile/8/0/x028/713 deleted file mode 100644 index e1d4eecb603bb964544d49516b7923925a0c86fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 diff --git a/pkg/mod/cache/download/sumdb/sum.golang.org/tile/8/0/x029/808.p/160 b/pkg/mod/cache/download/sumdb/sum.golang.org/tile/8/0/x029/808.p/160 deleted file mode 100644 index 071b0eae1bd73cad67d6bd25c3a27049f9cfcacc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5120 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 diff --git a/pkg/mod/cache/download/sumdb/sum.golang.org/tile/8/1/112 b/pkg/mod/cache/download/sumdb/sum.golang.org/tile/8/1/112 deleted file mode 100644 index 7dc6d78592b9a4547e4d1e9a6e655c6e40f1a7e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 Date: Wed, 15 Dec 2021 09:33:05 -0500 Subject: [PATCH 09/25] Changed go.mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index dfc619e..11c3651 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module github.com/jpaulm/gofbp +module github.com/tyoung3/gofbp go 1.17 From 267807712f4501e39c74568df7214b1a9159e670 Mon Sep 17 00:00:00 2001 From: Tom Young Date: Wed, 15 Dec 2021 10:23:41 -0500 Subject: [PATCH 10/25] tyoung3 go.mod --- go.mod | 10 ++++++++++ go.sum | 2 ++ 2 files changed, 12 insertions(+) diff --git a/go.mod b/go.mod index 11c3651..db097d7 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,13 @@ module github.com/tyoung3/gofbp +replace github.com/jpaulm/gofbp/io => github.com/tyoung3/gofbp/io v1.0.2 + +replace github.com/jpaulm/gofbp/testrtn => github.com/tyoung3/gofbp/testrtn v1.0.2 + +replace github.com/jpaulm/gofbp/subnets => github.com/tyoung3/gofbp/subnets v1.0.2 + +replace github.com/jpaulm/gofbp => github.com/tyoung3/gofbp v1.0.2 + go 1.17 + +require github.com/jpaulm/gofbp v0.0.0-00010101000000-000000000000 diff --git a/go.sum b/go.sum index e69de29..53323f7 100644 --- a/go.sum +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/tyoung3/gofbp v1.0.2 h1:Q8aAq512gXXInEpbxfSUeCejrvHYDnnK/inkTFYmzA8= +github.com/tyoung3/gofbp v1.0.2/go.mod h1:33964hnFwj7SlrXdjYg0uE+cd3Z7QEAuUlMZGwWo9Ow= From 328e1fd40a9cd41188e3eae02469140ec5f80445 Mon Sep 17 00:00:00 2001 From: Tom Young Date: Wed, 15 Dec 2021 11:41:52 -0500 Subject: [PATCH 11/25] Imports from jpaulm to tyoung3 --- factor.sh | 12 ++++++++++++ go.mod | 10 ++++------ go.sum | 2 -- internal/gofbp_test.go | 6 +++--- internal/testinfqueueasmain_test.go | 6 +++--- internal/testloadbal_test.go | 4 ++-- internal/testsubnet1_test.go | 6 +++--- internal/testsubnet2_test.go | 6 +++--- internal/testsubnet3_test.go | 6 +++--- io/readfile.go | 2 +- io/writefile.go | 2 +- subnets/sssubnet1.go | 4 ++-- subnets/sssubnet2.go | 4 ++-- subnets/subnet1.go | 4 ++-- testrtn/concatstr.go | 2 +- testrtn/counter.go | 2 +- testrtn/delayedreceiver.go | 2 +- testrtn/discard.go | 2 +- testrtn/kick.go | 2 +- testrtn/loadbalance.go | 2 +- testrtn/prefix.go | 2 +- testrtn/receiver.go | 2 +- testrtn/roundrobinsender.go | 2 +- testrtn/selector.go | 2 +- testrtn/sender.go | 2 +- testrtn/substreamsender.go | 2 +- testrtn/writetoconsnl.go | 2 +- testrtn/writetoconsole.go | 2 +- utils/analyze_deadlock.go | 2 +- 29 files changed, 56 insertions(+), 48 deletions(-) create mode 100755 factor.sh diff --git a/factor.sh b/factor.sh new file mode 100755 index 0000000..3286fea --- /dev/null +++ b/factor.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +for sdir in io subnets testrtn ./ utils internal ; do + pushd $sdir + for fl in *go; do + echo $sdir/$fl + sed -s s"/jpaulm/tyoung3/" $fl > /tmp/$fl && mv /tmp/$fl $fl + done + popd +done + +done diff --git a/go.mod b/go.mod index db097d7..ff56da2 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,11 @@ module github.com/tyoung3/gofbp -replace github.com/jpaulm/gofbp/io => github.com/tyoung3/gofbp/io v1.0.2 +//replace github.com/jpaulm/gofbp/io => github.com/tyoung3/gofbp/io v1.0.2 -replace github.com/jpaulm/gofbp/testrtn => github.com/tyoung3/gofbp/testrtn v1.0.2 +//replace github.com/jpaulm/gofbp/testrtn => github.com/tyoung3/gofbp/testrtn v1.0.2 -replace github.com/jpaulm/gofbp/subnets => github.com/tyoung3/gofbp/subnets v1.0.2 +//replace github.com/jpaulm/gofbp/subnets => github.com/tyoung3/gofbp/subnets v1.0.2 -replace github.com/jpaulm/gofbp => github.com/tyoung3/gofbp v1.0.2 +//replace github.com/jpaulm/gofbp => github.com/tyoung3/gofbp v1.0.2 go 1.17 - -require github.com/jpaulm/gofbp v0.0.0-00010101000000-000000000000 diff --git a/go.sum b/go.sum index 53323f7..e69de29 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +0,0 @@ -github.com/tyoung3/gofbp v1.0.2 h1:Q8aAq512gXXInEpbxfSUeCejrvHYDnnK/inkTFYmzA8= -github.com/tyoung3/gofbp v1.0.2/go.mod h1:33964hnFwj7SlrXdjYg0uE+cd3Z7QEAuUlMZGwWo9Ow= diff --git a/internal/gofbp_test.go b/internal/gofbp_test.go index f507e46..7a884e8 100644 --- a/internal/gofbp_test.go +++ b/internal/gofbp_test.go @@ -5,9 +5,9 @@ import ( "path/filepath" - "github.com/jpaulm/gofbp" - "github.com/jpaulm/gofbp/io" - "github.com/jpaulm/gofbp/testrtn" + "github.com/tyoung3/gofbp" + "github.com/tyoung3/gofbp/io" + "github.com/tyoung3/gofbp/testrtn" ) func TestMerge(t *testing.T) { diff --git a/internal/testinfqueueasmain_test.go b/internal/testinfqueueasmain_test.go index 50c8efd..f83515f 100644 --- a/internal/testinfqueueasmain_test.go +++ b/internal/testinfqueueasmain_test.go @@ -3,9 +3,9 @@ package main import ( "testing" - "github.com/jpaulm/gofbp" - "github.com/jpaulm/gofbp/io" - "github.com/jpaulm/gofbp/testrtn" + "github.com/tyoung3/gofbp" + "github.com/tyoung3/gofbp/io" + "github.com/tyoung3/gofbp/testrtn" ) func TestInfQueueAsMain(t *testing.T) { diff --git a/internal/testloadbal_test.go b/internal/testloadbal_test.go index f5efd06..16ed274 100644 --- a/internal/testloadbal_test.go +++ b/internal/testloadbal_test.go @@ -3,8 +3,8 @@ package main import ( "testing" - "github.com/jpaulm/gofbp" - "github.com/jpaulm/gofbp/testrtn" + "github.com/tyoung3/gofbp" + "github.com/tyoung3/gofbp/testrtn" ) func TestLoadBal(t *testing.T) { diff --git a/internal/testsubnet1_test.go b/internal/testsubnet1_test.go index 82031e0..04f7335 100644 --- a/internal/testsubnet1_test.go +++ b/internal/testsubnet1_test.go @@ -3,9 +3,9 @@ package main import ( "testing" - "github.com/jpaulm/gofbp" - "github.com/jpaulm/gofbp/subnets" - "github.com/jpaulm/gofbp/testrtn" + "github.com/tyoung3/gofbp" + "github.com/tyoung3/gofbp/subnets" + "github.com/tyoung3/gofbp/testrtn" ) func TestSubnet1(t *testing.T) { diff --git a/internal/testsubnet2_test.go b/internal/testsubnet2_test.go index 0a0da00..1f3a69e 100644 --- a/internal/testsubnet2_test.go +++ b/internal/testsubnet2_test.go @@ -5,9 +5,9 @@ package main import ( "testing" - "github.com/jpaulm/gofbp" - "github.com/jpaulm/gofbp/subnets" - "github.com/jpaulm/gofbp/testrtn" + "github.com/tyoung3/gofbp" + "github.com/tyoung3/gofbp/subnets" + "github.com/tyoung3/gofbp/testrtn" ) func TestSubnet2(t *testing.T) { diff --git a/internal/testsubnet3_test.go b/internal/testsubnet3_test.go index 37afec4..108d0c1 100644 --- a/internal/testsubnet3_test.go +++ b/internal/testsubnet3_test.go @@ -5,9 +5,9 @@ package main import ( "testing" - "github.com/jpaulm/gofbp" - "github.com/jpaulm/gofbp/subnets" - "github.com/jpaulm/gofbp/testrtn" + "github.com/tyoung3/gofbp" + "github.com/tyoung3/gofbp/subnets" + "github.com/tyoung3/gofbp/testrtn" ) func TestSubnet3(t *testing.T) { diff --git a/io/readfile.go b/io/readfile.go index 780ae23..76bef0e 100644 --- a/io/readfile.go +++ b/io/readfile.go @@ -7,7 +7,7 @@ import ( "os" "strings" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) //ReadFile type defines ipt and opt diff --git a/io/writefile.go b/io/writefile.go index 23509a3..14a3a52 100644 --- a/io/writefile.go +++ b/io/writefile.go @@ -4,7 +4,7 @@ import ( "fmt" "os" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) // WriteFile type defines iptIP, ipt, and opt diff --git a/subnets/sssubnet1.go b/subnets/sssubnet1.go index 003a2b8..3e0dbb1 100644 --- a/subnets/sssubnet1.go +++ b/subnets/sssubnet1.go @@ -1,8 +1,8 @@ package subnets import ( - "github.com/jpaulm/gofbp" - "github.com/jpaulm/gofbp/testrtn" + "github.com/tyoung3/gofbp" + "github.com/tyoung3/gofbp/testrtn" ) type SSSubnet1 struct{} diff --git a/subnets/sssubnet2.go b/subnets/sssubnet2.go index 3506785..53dada1 100644 --- a/subnets/sssubnet2.go +++ b/subnets/sssubnet2.go @@ -1,8 +1,8 @@ package subnets import ( - "github.com/jpaulm/gofbp" - "github.com/jpaulm/gofbp/testrtn" + "github.com/tyoung3/gofbp" + "github.com/tyoung3/gofbp/testrtn" ) type SSSubnet2 struct{} diff --git a/subnets/subnet1.go b/subnets/subnet1.go index df6ffb6..7a5c13a 100644 --- a/subnets/subnet1.go +++ b/subnets/subnet1.go @@ -1,8 +1,8 @@ package subnets import ( - "github.com/jpaulm/gofbp" - "github.com/jpaulm/gofbp/testrtn" + "github.com/tyoung3/gofbp" + "github.com/tyoung3/gofbp/testrtn" ) type Subnet1 struct{} diff --git a/testrtn/concatstr.go b/testrtn/concatstr.go index 5857e6b..0247065 100644 --- a/testrtn/concatstr.go +++ b/testrtn/concatstr.go @@ -1,6 +1,6 @@ package testrtn -import "github.com/jpaulm/gofbp" +import "github.com/tyoung3/gofbp" type ConcatStr struct { ipt gofbp.InputArrayConn diff --git a/testrtn/counter.go b/testrtn/counter.go index 81858f7..899acf7 100644 --- a/testrtn/counter.go +++ b/testrtn/counter.go @@ -4,7 +4,7 @@ import ( //"fmt" "strconv" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) type Counter struct { diff --git a/testrtn/delayedreceiver.go b/testrtn/delayedreceiver.go index fda03f1..fe72c83 100644 --- a/testrtn/delayedreceiver.go +++ b/testrtn/delayedreceiver.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) type DelayedReceiver struct { diff --git a/testrtn/discard.go b/testrtn/discard.go index 832cde9..e4db1b5 100644 --- a/testrtn/discard.go +++ b/testrtn/discard.go @@ -3,7 +3,7 @@ package testrtn import ( //"fmt" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) type Discard struct { diff --git a/testrtn/kick.go b/testrtn/kick.go index 7fe58ba..a684224 100644 --- a/testrtn/kick.go +++ b/testrtn/kick.go @@ -3,7 +3,7 @@ package testrtn import ( //"fmt" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) type Kick struct { diff --git a/testrtn/loadbalance.go b/testrtn/loadbalance.go index 7f91c5a..32fe4c0 100644 --- a/testrtn/loadbalance.go +++ b/testrtn/loadbalance.go @@ -1,7 +1,7 @@ package testrtn import ( - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) type LoadBalance struct { diff --git a/testrtn/prefix.go b/testrtn/prefix.go index a8374d5..fbc91d2 100644 --- a/testrtn/prefix.go +++ b/testrtn/prefix.go @@ -3,7 +3,7 @@ package testrtn import ( "fmt" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) type Prefix struct { diff --git a/testrtn/receiver.go b/testrtn/receiver.go index 19c4549..1be3e59 100644 --- a/testrtn/receiver.go +++ b/testrtn/receiver.go @@ -3,7 +3,7 @@ package testrtn import ( "fmt" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) type Receiver struct { diff --git a/testrtn/roundrobinsender.go b/testrtn/roundrobinsender.go index fd499ca..26f41ac 100644 --- a/testrtn/roundrobinsender.go +++ b/testrtn/roundrobinsender.go @@ -1,7 +1,7 @@ package testrtn import ( - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) type RoundRobinSender struct { diff --git a/testrtn/selector.go b/testrtn/selector.go index 29be0a6..3e487a6 100644 --- a/testrtn/selector.go +++ b/testrtn/selector.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) type Selector struct { diff --git a/testrtn/sender.go b/testrtn/sender.go index bab580c..11726df 100644 --- a/testrtn/sender.go +++ b/testrtn/sender.go @@ -4,7 +4,7 @@ import ( //"fmt" "strconv" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) type Sender struct { diff --git a/testrtn/substreamsender.go b/testrtn/substreamsender.go index c98aa93..fc77d03 100644 --- a/testrtn/substreamsender.go +++ b/testrtn/substreamsender.go @@ -3,7 +3,7 @@ package testrtn import ( "strconv" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) type SubstreamSender struct { diff --git a/testrtn/writetoconsnl.go b/testrtn/writetoconsnl.go index abf522a..e84bdd7 100644 --- a/testrtn/writetoconsnl.go +++ b/testrtn/writetoconsnl.go @@ -3,7 +3,7 @@ package testrtn import ( "fmt" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) // WriteToConsole modified to be a non-looper (NL) diff --git a/testrtn/writetoconsole.go b/testrtn/writetoconsole.go index 7626e93..b6922fb 100644 --- a/testrtn/writetoconsole.go +++ b/testrtn/writetoconsole.go @@ -3,7 +3,7 @@ package testrtn import ( "fmt" - "github.com/jpaulm/gofbp" + "github.com/tyoung3/gofbp" ) type WriteToConsole struct { diff --git a/utils/analyze_deadlock.go b/utils/analyze_deadlock.go index b64f87f..36b0d38 100644 --- a/utils/analyze_deadlock.go +++ b/utils/analyze_deadlock.go @@ -58,7 +58,7 @@ func main() { } j = strings.Index(rec[i:], "[sync.Cond.Wait]:") i += j - // github.com/jpaulm/gofbp/core.(*Process).Send(...) + // github.com/tyoung3/gofbp/core.(*Process).Send(...) k = strings.Index(rec[i:], "(*Process).") l := strings.Index(rec[i+k+11:], "(") fmt.Println("Process:", gName+",", "Status:", rec[i+k+11:i+k+11+l]) From f84de66aae7b264461c6ed4be2de98201ce81f1c Mon Sep 17 00:00:00 2001 From: Tom Young Date: Wed, 15 Dec 2021 14:50:53 -0500 Subject: [PATCH 12/25] add factor.sh --- factor.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 factor.sh diff --git a/factor.sh b/factor.sh new file mode 100644 index 0000000..3286fea --- /dev/null +++ b/factor.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +for sdir in io subnets testrtn ./ utils internal ; do + pushd $sdir + for fl in *go; do + echo $sdir/$fl + sed -s s"/jpaulm/tyoung3/" $fl > /tmp/$fl && mv /tmp/$fl $fl + done + popd +done + +done From 5b167377061d2c4f7542e4b2fca733afe0852eac Mon Sep 17 00:00:00 2001 From: Tom Young Date: Wed, 15 Dec 2021 15:07:31 -0500 Subject: [PATCH 13/25] v0.4.0 --- factor.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/factor.sh b/factor.sh index 3286fea..2182646 100755 --- a/factor.sh +++ b/factor.sh @@ -8,5 +8,3 @@ for sdir in io subnets testrtn ./ utils internal ; do done popd done - -done From db019180560bffd4ccd54daedd8517aab89a544e Mon Sep 17 00:00:00 2001 From: Tom Young Date: Wed, 15 Dec 2021 17:51:39 -0500 Subject: [PATCH 14/25] Update go.mod --- go.mod | 8 -------- 1 file changed, 8 deletions(-) diff --git a/go.mod b/go.mod index ff56da2..11c3651 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,3 @@ module github.com/tyoung3/gofbp -//replace github.com/jpaulm/gofbp/io => github.com/tyoung3/gofbp/io v1.0.2 - -//replace github.com/jpaulm/gofbp/testrtn => github.com/tyoung3/gofbp/testrtn v1.0.2 - -//replace github.com/jpaulm/gofbp/subnets => github.com/tyoung3/gofbp/subnets v1.0.2 - -//replace github.com/jpaulm/gofbp => github.com/tyoung3/gofbp v1.0.2 - go 1.17 From a827f147b172118544e3db7f3413fb7b3399f3dc Mon Sep 17 00:00:00 2001 From: Tom Young Date: Wed, 15 Dec 2021 18:03:09 -0500 Subject: [PATCH 15/25] v1.0.3 --- go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/go.mod b/go.mod index 11c3651..c5776c4 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,4 @@ module github.com/tyoung3/gofbp + go 1.17 From dbcb92ad1b25b963985e4110c5f8b82af7bfef57 Mon Sep 17 00:00:00 2001 From: Tom Young Date: Thu, 16 Dec 2021 05:14:16 -0500 Subject: [PATCH 16/25] Refactor imports --- factor.sh | 10 ---------- go.mod | 3 +-- internal/factor.sh | 21 +++++++++++++++++++++ internal/gofbp_test.go | 6 +++--- internal/testinfqueueasmain_test.go | 6 +++--- internal/testloadbal_test.go | 4 ++-- internal/testsubnet1_test.go | 6 +++--- internal/testsubnet2_test.go | 6 +++--- internal/testsubnet3_test.go | 6 +++--- io/readfile.go | 2 +- io/writefile.go | 2 +- subnets/sssubnet1.go | 4 ++-- subnets/sssubnet2.go | 4 ++-- subnets/subnet1.go | 4 ++-- testrtn/concatstr.go | 2 +- testrtn/counter.go | 2 +- testrtn/delayedreceiver.go | 2 +- testrtn/discard.go | 2 +- testrtn/kick.go | 2 +- testrtn/loadbalance.go | 2 +- testrtn/prefix.go | 2 +- testrtn/receiver.go | 2 +- testrtn/roundrobinsender.go | 2 +- testrtn/selector.go | 2 +- testrtn/sender.go | 2 +- testrtn/substreamsender.go | 2 +- testrtn/writetoconsnl.go | 2 +- testrtn/writetoconsole.go | 2 +- utils/analyze_deadlock.go | 2 +- 29 files changed, 62 insertions(+), 52 deletions(-) delete mode 100755 factor.sh create mode 100755 internal/factor.sh diff --git a/factor.sh b/factor.sh deleted file mode 100755 index 2182646..0000000 --- a/factor.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -for sdir in io subnets testrtn ./ utils internal ; do - pushd $sdir - for fl in *go; do - echo $sdir/$fl - sed -s s"/jpaulm/tyoung3/" $fl > /tmp/$fl && mv /tmp/$fl $fl - done - popd -done diff --git a/go.mod b/go.mod index c5776c4..dfc619e 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,3 @@ -module github.com/tyoung3/gofbp - +module github.com/jpaulm/gofbp go 1.17 diff --git a/internal/factor.sh b/internal/factor.sh new file mode 100755 index 0000000..208268d --- /dev/null +++ b/internal/factor.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +pfx="github.com/" +from="$pfx$1"; to="$pfx$2" +log=/tmp/factor.log + +case $# in + 2) + echo FACTOR.SH: `date` >> $log + for sdir in ../ ../io ../subnets ../testrtn ../utils ../internal ; do + pushd $sdir >/dev/null + for fl in *go; do + echo $sdir/$fl >> $log + sed -s s"!$from!$to!" $fl > /tmp/$fl && mv /tmp/$fl $fl && count=$(($count+1)) + done + popd >/dev/null + done + echo $count hits + ;; + *)echo USAGE: $0 FROM TO; exit 1;; +esac diff --git a/internal/gofbp_test.go b/internal/gofbp_test.go index 7a884e8..f507e46 100644 --- a/internal/gofbp_test.go +++ b/internal/gofbp_test.go @@ -5,9 +5,9 @@ import ( "path/filepath" - "github.com/tyoung3/gofbp" - "github.com/tyoung3/gofbp/io" - "github.com/tyoung3/gofbp/testrtn" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/io" + "github.com/jpaulm/gofbp/testrtn" ) func TestMerge(t *testing.T) { diff --git a/internal/testinfqueueasmain_test.go b/internal/testinfqueueasmain_test.go index f83515f..50c8efd 100644 --- a/internal/testinfqueueasmain_test.go +++ b/internal/testinfqueueasmain_test.go @@ -3,9 +3,9 @@ package main import ( "testing" - "github.com/tyoung3/gofbp" - "github.com/tyoung3/gofbp/io" - "github.com/tyoung3/gofbp/testrtn" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/io" + "github.com/jpaulm/gofbp/testrtn" ) func TestInfQueueAsMain(t *testing.T) { diff --git a/internal/testloadbal_test.go b/internal/testloadbal_test.go index 16ed274..f5efd06 100644 --- a/internal/testloadbal_test.go +++ b/internal/testloadbal_test.go @@ -3,8 +3,8 @@ package main import ( "testing" - "github.com/tyoung3/gofbp" - "github.com/tyoung3/gofbp/testrtn" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/testrtn" ) func TestLoadBal(t *testing.T) { diff --git a/internal/testsubnet1_test.go b/internal/testsubnet1_test.go index 04f7335..82031e0 100644 --- a/internal/testsubnet1_test.go +++ b/internal/testsubnet1_test.go @@ -3,9 +3,9 @@ package main import ( "testing" - "github.com/tyoung3/gofbp" - "github.com/tyoung3/gofbp/subnets" - "github.com/tyoung3/gofbp/testrtn" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/subnets" + "github.com/jpaulm/gofbp/testrtn" ) func TestSubnet1(t *testing.T) { diff --git a/internal/testsubnet2_test.go b/internal/testsubnet2_test.go index 1f3a69e..0a0da00 100644 --- a/internal/testsubnet2_test.go +++ b/internal/testsubnet2_test.go @@ -5,9 +5,9 @@ package main import ( "testing" - "github.com/tyoung3/gofbp" - "github.com/tyoung3/gofbp/subnets" - "github.com/tyoung3/gofbp/testrtn" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/subnets" + "github.com/jpaulm/gofbp/testrtn" ) func TestSubnet2(t *testing.T) { diff --git a/internal/testsubnet3_test.go b/internal/testsubnet3_test.go index 108d0c1..37afec4 100644 --- a/internal/testsubnet3_test.go +++ b/internal/testsubnet3_test.go @@ -5,9 +5,9 @@ package main import ( "testing" - "github.com/tyoung3/gofbp" - "github.com/tyoung3/gofbp/subnets" - "github.com/tyoung3/gofbp/testrtn" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/subnets" + "github.com/jpaulm/gofbp/testrtn" ) func TestSubnet3(t *testing.T) { diff --git a/io/readfile.go b/io/readfile.go index 76bef0e..780ae23 100644 --- a/io/readfile.go +++ b/io/readfile.go @@ -7,7 +7,7 @@ import ( "os" "strings" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) //ReadFile type defines ipt and opt diff --git a/io/writefile.go b/io/writefile.go index 14a3a52..23509a3 100644 --- a/io/writefile.go +++ b/io/writefile.go @@ -4,7 +4,7 @@ import ( "fmt" "os" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) // WriteFile type defines iptIP, ipt, and opt diff --git a/subnets/sssubnet1.go b/subnets/sssubnet1.go index 3e0dbb1..003a2b8 100644 --- a/subnets/sssubnet1.go +++ b/subnets/sssubnet1.go @@ -1,8 +1,8 @@ package subnets import ( - "github.com/tyoung3/gofbp" - "github.com/tyoung3/gofbp/testrtn" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/testrtn" ) type SSSubnet1 struct{} diff --git a/subnets/sssubnet2.go b/subnets/sssubnet2.go index 53dada1..3506785 100644 --- a/subnets/sssubnet2.go +++ b/subnets/sssubnet2.go @@ -1,8 +1,8 @@ package subnets import ( - "github.com/tyoung3/gofbp" - "github.com/tyoung3/gofbp/testrtn" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/testrtn" ) type SSSubnet2 struct{} diff --git a/subnets/subnet1.go b/subnets/subnet1.go index 7a5c13a..df6ffb6 100644 --- a/subnets/subnet1.go +++ b/subnets/subnet1.go @@ -1,8 +1,8 @@ package subnets import ( - "github.com/tyoung3/gofbp" - "github.com/tyoung3/gofbp/testrtn" + "github.com/jpaulm/gofbp" + "github.com/jpaulm/gofbp/testrtn" ) type Subnet1 struct{} diff --git a/testrtn/concatstr.go b/testrtn/concatstr.go index 0247065..5857e6b 100644 --- a/testrtn/concatstr.go +++ b/testrtn/concatstr.go @@ -1,6 +1,6 @@ package testrtn -import "github.com/tyoung3/gofbp" +import "github.com/jpaulm/gofbp" type ConcatStr struct { ipt gofbp.InputArrayConn diff --git a/testrtn/counter.go b/testrtn/counter.go index 899acf7..81858f7 100644 --- a/testrtn/counter.go +++ b/testrtn/counter.go @@ -4,7 +4,7 @@ import ( //"fmt" "strconv" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) type Counter struct { diff --git a/testrtn/delayedreceiver.go b/testrtn/delayedreceiver.go index fe72c83..fda03f1 100644 --- a/testrtn/delayedreceiver.go +++ b/testrtn/delayedreceiver.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) type DelayedReceiver struct { diff --git a/testrtn/discard.go b/testrtn/discard.go index e4db1b5..832cde9 100644 --- a/testrtn/discard.go +++ b/testrtn/discard.go @@ -3,7 +3,7 @@ package testrtn import ( //"fmt" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) type Discard struct { diff --git a/testrtn/kick.go b/testrtn/kick.go index a684224..7fe58ba 100644 --- a/testrtn/kick.go +++ b/testrtn/kick.go @@ -3,7 +3,7 @@ package testrtn import ( //"fmt" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) type Kick struct { diff --git a/testrtn/loadbalance.go b/testrtn/loadbalance.go index 32fe4c0..7f91c5a 100644 --- a/testrtn/loadbalance.go +++ b/testrtn/loadbalance.go @@ -1,7 +1,7 @@ package testrtn import ( - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) type LoadBalance struct { diff --git a/testrtn/prefix.go b/testrtn/prefix.go index fbc91d2..a8374d5 100644 --- a/testrtn/prefix.go +++ b/testrtn/prefix.go @@ -3,7 +3,7 @@ package testrtn import ( "fmt" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) type Prefix struct { diff --git a/testrtn/receiver.go b/testrtn/receiver.go index 1be3e59..19c4549 100644 --- a/testrtn/receiver.go +++ b/testrtn/receiver.go @@ -3,7 +3,7 @@ package testrtn import ( "fmt" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) type Receiver struct { diff --git a/testrtn/roundrobinsender.go b/testrtn/roundrobinsender.go index 26f41ac..fd499ca 100644 --- a/testrtn/roundrobinsender.go +++ b/testrtn/roundrobinsender.go @@ -1,7 +1,7 @@ package testrtn import ( - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) type RoundRobinSender struct { diff --git a/testrtn/selector.go b/testrtn/selector.go index 3e487a6..29be0a6 100644 --- a/testrtn/selector.go +++ b/testrtn/selector.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) type Selector struct { diff --git a/testrtn/sender.go b/testrtn/sender.go index 11726df..bab580c 100644 --- a/testrtn/sender.go +++ b/testrtn/sender.go @@ -4,7 +4,7 @@ import ( //"fmt" "strconv" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) type Sender struct { diff --git a/testrtn/substreamsender.go b/testrtn/substreamsender.go index fc77d03..c98aa93 100644 --- a/testrtn/substreamsender.go +++ b/testrtn/substreamsender.go @@ -3,7 +3,7 @@ package testrtn import ( "strconv" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) type SubstreamSender struct { diff --git a/testrtn/writetoconsnl.go b/testrtn/writetoconsnl.go index e84bdd7..abf522a 100644 --- a/testrtn/writetoconsnl.go +++ b/testrtn/writetoconsnl.go @@ -3,7 +3,7 @@ package testrtn import ( "fmt" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) // WriteToConsole modified to be a non-looper (NL) diff --git a/testrtn/writetoconsole.go b/testrtn/writetoconsole.go index b6922fb..7626e93 100644 --- a/testrtn/writetoconsole.go +++ b/testrtn/writetoconsole.go @@ -3,7 +3,7 @@ package testrtn import ( "fmt" - "github.com/tyoung3/gofbp" + "github.com/jpaulm/gofbp" ) type WriteToConsole struct { diff --git a/utils/analyze_deadlock.go b/utils/analyze_deadlock.go index 36b0d38..b64f87f 100644 --- a/utils/analyze_deadlock.go +++ b/utils/analyze_deadlock.go @@ -58,7 +58,7 @@ func main() { } j = strings.Index(rec[i:], "[sync.Cond.Wait]:") i += j - // github.com/tyoung3/gofbp/core.(*Process).Send(...) + // github.com/jpaulm/gofbp/core.(*Process).Send(...) k = strings.Index(rec[i:], "(*Process).") l := strings.Index(rec[i+k+11:], "(") fmt.Println("Process:", gName+",", "Status:", rec[i+k+11:i+k+11+l]) From 8c78c1feb42fc63961b324adb2f68ef559e4ea0b Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 31 Jan 2022 10:15:21 -0500 Subject: [PATCH 17/25] update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4d0ba53..257114d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ qs_*.* bak bin/ *.exe +TWY* From 9c99bbc3371b3a9e00cff8e292cfeea2927c29d1 Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 31 Jan 2022 10:19:51 -0500 Subject: [PATCH 18/25] reclone jpaulm/gofbp --- README.md | 100 ++++- analyze_deadlock_compile.bat | 1 + components/io/readfile.go | 71 +++ components/io/writefile.go | 66 +++ components/subnets/sssubnet1.go | 28 ++ components/subnets/sssubnet2.go | 27 ++ components/subnets/subnet1.go | 29 ++ components/testrtn/concatstr.go | 35 ++ components/testrtn/counter.go | 45 ++ components/testrtn/delayedreceiver.go | 32 ++ components/testrtn/discard.go | 32 ++ components/testrtn/intsender.go | 37 ++ components/testrtn/kick.go | 22 + components/testrtn/loadbalance.go | 47 ++ components/testrtn/prefix.go | 49 +++ components/testrtn/receiver.go | 31 ++ components/testrtn/roundrobinsender.go | 36 ++ components/testrtn/selector.go | 62 +++ components/testrtn/sender.go | 37 ++ components/testrtn/substreamsender.go | 55 +++ components/testrtn/writetoconsnl.go | 48 +++ components/testrtn/writetoconsole.go | 45 ++ components/websocket/ans/params.xml | 6 + components/websocket/ans/ws_ans_req.go | 45 ++ components/websocket/ans/ws_ans_req_test.go | 26 ++ components/websocket/ws_ans_req.go | 45 ++ components/websocket/ws_request.go | 180 ++++++++ components/websocket/ws_respond.go | 57 +++ core/component.go | 14 + core/inarrayport.go | 80 ++++ core/initializationconnection.go | 74 ++++ core/inport.go | 136 ++++++ core/inputconn.go | 25 ++ core/network.go | 453 ++++++++++++++++++++ core/nulloutport.go | 19 + core/outarrayport.go | 64 +++ core/outport.go | 94 ++++ core/outputconn.go | 20 + core/packet.go | 13 + core/process.go | 349 +++++++++++++++ core/subnet_support.go | 168 ++++++++ diagrams/Esses.png | Bin 0 -> 836 bytes diagrams/Merge.drw | 26 ++ diagrams/Subnet-diagram.drw | 19 +- diagrams/Subnet-diagram.png | Bin 14525 -> 12198 bytes diagrams/Subnet1.drw | 17 + go.mod | 4 + go.sum | 2 + merge.go | 25 ++ params.xml | 7 + renovate.json | 9 + scripts/chat2.html | 169 ++++++++ settings.json | 4 + subnet_tests/subnet-diagram.go | 20 + subnet_tests/subnets/subnet1.go | 26 ++ testing/force_deadlock_test.go | 39 ++ testing/gofbp_test.go | 139 ++++++ testing/numbers.txt | 40 ++ testing/testdata/deadlock/main.go | 25 ++ testing/testdata/infqueue | 40 ++ testing/testdata/testdata.txt | 6 + testing/testinfqueueasmain_test.go | 26 ++ testing/testintsender_test.go | 27 ++ testing/testloadbal_test.go | 28 ++ testing/testsubnet1_test.go | 25 ++ testing/testsubnet2_test.go | 27 ++ testing/testsubnet3_test.go | 29 ++ testing/testwebsocket_test.go | 26 ++ 68 files changed, 3579 insertions(+), 29 deletions(-) create mode 100644 analyze_deadlock_compile.bat create mode 100644 components/io/readfile.go create mode 100644 components/io/writefile.go create mode 100644 components/subnets/sssubnet1.go create mode 100644 components/subnets/sssubnet2.go create mode 100644 components/subnets/subnet1.go create mode 100644 components/testrtn/concatstr.go create mode 100644 components/testrtn/counter.go create mode 100644 components/testrtn/delayedreceiver.go create mode 100644 components/testrtn/discard.go create mode 100644 components/testrtn/intsender.go create mode 100644 components/testrtn/kick.go create mode 100644 components/testrtn/loadbalance.go create mode 100644 components/testrtn/prefix.go create mode 100644 components/testrtn/receiver.go create mode 100644 components/testrtn/roundrobinsender.go create mode 100644 components/testrtn/selector.go create mode 100644 components/testrtn/sender.go create mode 100644 components/testrtn/substreamsender.go create mode 100644 components/testrtn/writetoconsnl.go create mode 100644 components/testrtn/writetoconsole.go create mode 100644 components/websocket/ans/params.xml create mode 100644 components/websocket/ans/ws_ans_req.go create mode 100644 components/websocket/ans/ws_ans_req_test.go create mode 100644 components/websocket/ws_ans_req.go create mode 100644 components/websocket/ws_request.go create mode 100644 components/websocket/ws_respond.go create mode 100644 core/component.go create mode 100644 core/inarrayport.go create mode 100644 core/initializationconnection.go create mode 100644 core/inport.go create mode 100644 core/inputconn.go create mode 100644 core/network.go create mode 100644 core/nulloutport.go create mode 100644 core/outarrayport.go create mode 100644 core/outport.go create mode 100644 core/outputconn.go create mode 100644 core/packet.go create mode 100644 core/process.go create mode 100644 core/subnet_support.go create mode 100644 diagrams/Esses.png create mode 100644 diagrams/Merge.drw create mode 100644 diagrams/Subnet1.drw create mode 100644 merge.go create mode 100644 params.xml create mode 100644 renovate.json create mode 100644 scripts/chat2.html create mode 100644 settings.json create mode 100644 subnet_tests/subnet-diagram.go create mode 100644 subnet_tests/subnets/subnet1.go create mode 100644 testing/force_deadlock_test.go create mode 100644 testing/gofbp_test.go create mode 100644 testing/numbers.txt create mode 100644 testing/testdata/deadlock/main.go create mode 100644 testing/testdata/infqueue create mode 100644 testing/testdata/testdata.txt create mode 100644 testing/testinfqueueasmain_test.go create mode 100644 testing/testintsender_test.go create mode 100644 testing/testloadbal_test.go create mode 100644 testing/testsubnet1_test.go create mode 100644 testing/testsubnet2_test.go create mode 100644 testing/testsubnet3_test.go create mode 100644 testing/testwebsocket_test.go diff --git a/README.md b/README.md index 1becf53..3492832 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ # GoFBP -This repo holds the beginning of an FBP implementation in Go +This repo contains an FBP implementation in Go. It conforms pretty closely to the scheduling logic in JavaFBP, C#FBP and C++FBP (all on https://github.com/jpaulm ). There may well be further internal changes, but I am hoping that the "external" APIs (network and component definitions) are now firm. +Current tag: **v1.0.6** . + ## General General web site for "classical" FBP: @@ -12,8 +14,10 @@ General web site for "classical" FBP: In computer programming, flow-based programming (FBP) is a programming paradigm that defines applications as networks of "black box" processes, which exchange data across predefined connections by message passing, where the connections are specified externally to the processes. These black box processes can be reconnected endlessly to form different applications without having to be changed internally. FBP is thus naturally component-oriented. FBP is a particular form of dataflow programming based on bounded buffers, information packets with defined lifetimes, named ports, and separate definition of connections. + +DrawFBP (https://github.com/jpaulm/drawfbp) can now generate working GoFBP network and subnet definitions from a network diagram (as well as JavaFBP, C#FBP, JSON and free-form notations). -GoFBP Network Definition Syntax and Component API: +## GoFBP Network Definition Syntax and Component API: * https://jpaulm.github.io/fbp/gosyntax.htm ## Features (these are common to all FBP implementations on GitHub/jpaulm): @@ -25,19 +29,61 @@ GoFBP Network Definition Syntax and Component API: - "automatic" in- and out-ports - notation is port name = "*" - GoFBP (and the other FBP implementations on https://github.com/jpaulm distingish between "invocation" and "activation" of processes: a process is invoked once, but may be activated multiple times (if it does a return before all its input ports have been drained) +## Running your app with GoFBP + +In the `go.mod` file in your root, add the statement + +``` +require github.com/jpaulm/gofbp latest +``` +and then run the command `go mod tidy` - this will change the word `latest` to the latest version, and store it back in your `go.mod` file. + +If you need parameter values other than `false`, you will have to access a `params.xml` file, as shown below. + +Command to run your network, e.g.: + +``` +go run Merge.go +``` + +A number of test cases are in the `testing` folder, and can be run as follows: + +``` +cd testing +go test +``` +To run an individual network, e.g. `TestIntSender` in `testing\testintsender_test.go`, +run +``` +cd testing +go test -run IntSender +``` + +### Notes: + +- One comment about running with subnets: the subnet or subnets should be in a different folder from the code that invokes it. If they are in the same folder, apparently both the invoking code and the subnet need to be named individually in a `go run` command... this is not required when running under VSCode, or from an `.exe` file. + ## Tracing -An XML file has been provided in the root, called `params.xml`. So far there is only one parameter: +An XML file has been provided in the root, called `params.xml`. If you need values other than all `false`, you will need to reference this using the `LoadXMLParams` and `SetParams` methods - see https://jpaulm.github.io/fbp/gosyntax.htm . -
-<?xml version="1.0"?>
-<tracing>true|false</tracing>
-<tracelocks>true|false</tracelocks>
-
+Format of the tracing definitions file: + +``` + + +false +false +true + +``` +The `generate-gIds` parameter is only used to assist in debugging deadlocks, so can default most of the time - see below. ## Subnets These are described in Chap. 7 in "Flow-Based Programming": Composite Components - https://jpaulmorrison.com/fbp/compos.shtml , although we haven't implemented dynamic subnets (yet)! +**Note:** If a subnet `.go` file is in the same folder as the network `.go` file invoking it, the `NewProc` call should be written without the folder - e.g. `net.NewProc("Run___Subnet", &Subnet1{})`, but currently DrawFBP cannot detect this situation, so, when using notation `GoFBP`, this call will not be generated correctly. + ## Test Cases The following test cases are now working - thanks to Egon Elbre and Emil Valeev for all their help! @@ -56,9 +102,11 @@ The following test cases are now working - thanks to Egon Elbre and Emil Valeev - test subnet (SubIn and SubOut) - force deadlock (separate test file) - this is designed to crash, and in fact will give a message if it does *not* crash! + +- simple web sockets test -To run them, position to your `GitHub\gofbp` directory, and do any of the following: +To run them, position to your `GitHub\gofbp\testing` directory (note the additional folder, as of tag `v1.0.3` plus), and do any of the following: - `go test -run Merge -count=1` - `go test -run Concat -count=1` @@ -69,9 +117,11 @@ To run them, position to your `GitHub\gofbp` directory, and do any of the follow - `go test -run WriteToConsUsingNL -count=1` (note the activated/deactivated messages) - `go test -run ForceDeadlock -count=1` - `go test -run InfQueueAsMain -count=1` (note the "automatic" ports between WriteFile and ReadFile) +- `go test -run LoadBal -count=1` (this does load balancing, and uses two DelayedReceiver processes) - `go test -run Subnet1 -count=1` - `go test -run Subnet2 -count=1` - `go test -run Subnet3 -count=1` +- `go test -run TestWebSocket -count=1` - for more instructions, see # Test WebSockets (below) **Note**: ForceDeadlock is constructed differently so that it can "crash" without disrupting the flow of tests: the network definition has to be compiled "on the fly", so it is actually in `testdata`, while the test itself contains the code to compile and run the test. @@ -130,14 +180,34 @@ The following components are available: - `readfile.go` - `writefile.go` +"websocket" folder (for instructions, see below): +- `ws_request.go` +- `ws_respond.go` +- `ws_ans_req.go` (sample component - properly belongs in test suite) + +**Test Websockets** + +- position to your `GitHub\gofbp\testing` directory in DOS +- run `go test -run TestWebSocket -count=1` + +- in File Explorer, locate `GitHub\gofbp\scripts\chat2.html` +- open with Firefox or Chrome +- enter `namelist` in the Command box, hit enter or Send +- you should see `Server: Line1`, `Server: Line2`, `Server: Line3` show up in the box below "Send" +- you can repeat this multiple times, and the 3 output lines will be appended each time to the current display +- click on `Stop WS` - you will see `End of dialog` next to `Status` + +- you're done... except that, right now, it's not coming down cleanly, so you will have to close the DOS session manually. Hopefully, this will be fixed soon! + + **To dos** -- More and better documentation - Convert `panic`s to more standard Go error handling -- Way too much logging - have to make that optional - put remaining logging under switch control +- Way too much logging - have to make that optional - put remaining logging under switch control - *done!* - Add subnet handling - *done!* -- Generate GoFBP networks from DrawFBP - https://github.com/jpaulm/drawfbp -- Add Load Balancing component -- Add sample code showing use of substreams +- Generate GoFBP networks from DrawFBP - https://github.com/jpaulm/drawfbp - *done!* +- Add Load Balancing component - *done!* +- Add sample code showing use of substreams - *done!* - "Automatic" ports - *done!* -- Add Lua interface - see https://jpaulm.github.io/fbp/thlua.html +- Add Lua interface - similar to https://jpaulm.github.io/fbp/thlua.html + diff --git a/analyze_deadlock_compile.bat b/analyze_deadlock_compile.bat new file mode 100644 index 0000000..b921a0d --- /dev/null +++ b/analyze_deadlock_compile.bat @@ -0,0 +1 @@ +go build -o analyze_deadlock.exe utils\analyze_deadlock.go \ No newline at end of file diff --git a/components/io/readfile.go b/components/io/readfile.go new file mode 100644 index 0000000..20bb3e7 --- /dev/null +++ b/components/io/readfile.go @@ -0,0 +1,71 @@ +/*Package io implements gofbp I/O*/ +package io + +import ( + //"core" + "fmt" + "io" + "os" + "strings" + + "github.com/jpaulm/gofbp/core" +) + +//ReadFile type defines ipt and opt +type ReadFile struct { + ipt core.InputConn + opt core.OutputConn +} + +//Setup method opens readFile +func (readFile *ReadFile) Setup(p *core.Process) { + readFile.ipt = p.OpenInPort("FILENAME") + readFile.opt = p.OpenOutPort("OUT") +} + +//Execute method starts Process +func (readFile *ReadFile) Execute(p *core.Process) { + + icpkt := p.Receive(readFile.ipt) + fname, ok := icpkt.Contents.(string) + if !ok { + panic("Parameter (file name) not a string") + } + f, err := os.Open(fname) + if err != nil { + panic("Unable to read file: " + fname) + } + p.Discard(icpkt) + p.Close(readFile.ipt) + + var pkt *core.Packet + var rec string + + defer f.Close() + buf := make([]byte, 1024) + for { + n, err := f.Read(buf) + if err == io.EOF { + break + } + if err != nil { + fmt.Println(err) + continue + } + if n > 0 { + //fmt.Println(string(buf[:n])) + rec += string(buf[:n]) + } + } + + for { + i := strings.Index(rec, "\n") + if i == -1 { + break + } + pkt = p.Create(rec[:i]) + p.Send(readFile.opt, pkt) + rec = rec[i+1:] + } + +} diff --git a/components/io/writefile.go b/components/io/writefile.go new file mode 100644 index 0000000..a9d34c2 --- /dev/null +++ b/components/io/writefile.go @@ -0,0 +1,66 @@ +package io + +import ( + "fmt" + "os" + + "github.com/jpaulm/gofbp/core" +) + +// WriteFile type defines iptIP, ipt, and opt +type WriteFile struct { + iptIP core.InputConn + ipt core.InputConn + opt core.OutputConn +} + +//Setup method initializes Process +func (writeFile *WriteFile) Setup(p *core.Process) { + writeFile.iptIP = p.OpenInPort("FILENAME") + writeFile.ipt = p.OpenInPort("IN") + writeFile.opt = p.OpenOutPortOptional("OUT") +} + +//MustRun method +func (WriteFile) MustRun() {} + +//Execute method starts Process +func (writeFile *WriteFile) Execute(p *core.Process) { + + icpkt := p.Receive(writeFile.iptIP) + fname, ok := icpkt.Contents.(string) + if !ok { + panic("Parameter (file name) not a string") + } + p.Discard(icpkt) + p.Close(writeFile.iptIP) + + f, err := os.Create(fname) + if err != nil { + panic("Unable to open file: " + fname) + } + defer fmt.Println(p.Name+": File", fname, "written") + defer f.Close() + + for { + var pkt = p.Receive(writeFile.ipt) + if pkt == nil { + break + } + + data := fmt.Sprint(pkt.Contents) + _, err2 := fmt.Fprintln(f, data) + + if err2 != nil { + panic("Unable to write file: " + fname) + } + + f.Sync() + if !writeFile.opt.IsConnected() { + p.Discard(pkt) + } else { + p.Send(writeFile.opt, pkt) + } + + } +} diff --git a/components/subnets/sssubnet1.go b/components/subnets/sssubnet1.go new file mode 100644 index 0000000..e979044 --- /dev/null +++ b/components/subnets/sssubnet1.go @@ -0,0 +1,28 @@ +/*Package subnets implements FBP subnet processing*/ +package subnets + +import ( + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +type SSSubnet1 struct{} + +func (subnet *SSSubnet1) Setup(p *core.Process) {} + +func (subnet *SSSubnet1) Execute(p *core.Process) { + net := core.NewSubnet("SSSubnet1", p) + + proc1 := net.NewProc("SubInSS", &core.SubInSS{}) // Substream-Sensitive SubIn + + proc2 := net.NewProc("WriteToConsole1", &testrtn.WriteToConsole{}) + + proc3 := net.NewProc("SubOutSS", &core.SubOutSS{}) // Substream-delimiter-Generating SubOut + + net.Initialize("IN", proc1, "NAME") + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "OUT", proc3, "IN", 6) + net.Initialize("OUT", proc3, "NAME") + + net.Run() +} diff --git a/components/subnets/sssubnet2.go b/components/subnets/sssubnet2.go new file mode 100644 index 0000000..3c4a94f --- /dev/null +++ b/components/subnets/sssubnet2.go @@ -0,0 +1,27 @@ +package subnets + +import ( + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +type SSSubnet2 struct{} + +func (subnet *SSSubnet2) Setup(p *core.Process) {} + +func (subnet *SSSubnet2) Execute(p *core.Process) { + net := core.NewSubnet("SSSubnet2", p) + + proc1 := net.NewProc("SubInSS", &core.SubInSS{}) // Substream-Sensitive SubIn + + proc2 := net.NewProc("Count", &testrtn.Counter{}) // count length of each substream (excl. brackets) + + proc3 := net.NewProc("SubOut", &core.SubOut{}) // Basic SubOut + + net.Initialize("IN", proc1, "NAME") + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "COUNT", proc3, "IN", 6) + net.Initialize("OUT", proc3, "NAME") + + net.Run() +} diff --git a/components/subnets/subnet1.go b/components/subnets/subnet1.go new file mode 100644 index 0000000..39182d0 --- /dev/null +++ b/components/subnets/subnet1.go @@ -0,0 +1,29 @@ +package subnets + +import ( + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +type Subnet1 struct{} + +func (subnet *Subnet1) Setup(p *core.Process) {} + +func (subnet *Subnet1) Execute(p *core.Process) { + net := core.NewSubnet("Subnet1", p) + + proc1 := net.NewProc("SubIn", &core.SubIn{}) + + proc2 := net.NewProc("WriteToConsole1", &testrtn.WriteToConsole{}) + + proc3 := net.NewProc("SubOut", &core.SubOut{}) + + net.Initialize("IN", proc1, "NAME") + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "OUT", proc3, "IN", 6) + net.Initialize("OUT", proc3, "NAME") + + net.Run() +} + +// NAME->0(proc1 SubIn)1.OUT -> IN.0(Proc2 WriteToConsole1)1.OUT -> NAME.0(proc3 SubOut); diff --git a/components/testrtn/concatstr.go b/components/testrtn/concatstr.go new file mode 100644 index 0000000..b491bc7 --- /dev/null +++ b/components/testrtn/concatstr.go @@ -0,0 +1,35 @@ +package testrtn + +import ( + "github.com/jpaulm/gofbp/core" +) + +type ConcatStr struct { + ipt core.InputArrayConn + opt core.OutputConn +} + +func (concatstr *ConcatStr) Setup(p *core.Process) { + concatstr.ipt = p.OpenInArrayPort("IN") + concatstr.opt = p.OpenOutPort("OUT") +} + +func (concatstr *ConcatStr) Execute(p *core.Process) { + + for i := 0; i < concatstr.ipt.ArrayLength(); i++ { + + for { + conn := concatstr.ipt.GetArrayItem(i) + if conn == nil { + continue + } + var pkt = p.Receive(conn) + if pkt == nil { + break + } + //fmt.Println("Output: ", pkt.Contents) + p.Send(concatstr.opt, pkt) + } + } + +} diff --git a/components/testrtn/counter.go b/components/testrtn/counter.go new file mode 100644 index 0000000..aea187e --- /dev/null +++ b/components/testrtn/counter.go @@ -0,0 +1,45 @@ +package testrtn + +import ( + //"fmt" + "strconv" + + "github.com/jpaulm/gofbp/core" +) + +type Counter struct { + ipt core.InputConn + cnt core.OutputConn + opt core.OutputConn +} + +func (counter *Counter) Setup(p *core.Process) { + counter.ipt = p.OpenInPort("IN") + counter.cnt = p.OpenOutPort("COUNT") + counter.opt = p.OpenOutPortOptional("OUT") +} + +func (Counter) MustRun() {} + +func (counter *Counter) Execute(p *core.Process) { + + count := 0 + + for { + var pkt = p.Receive(counter.ipt) + if pkt == nil { + break + } + if counter.opt.IsConnected() { + p.Send(counter.opt, pkt) + } else { + p.Discard(pkt) + } + + count++ + } + + pkt := p.Create(strconv.Itoa(count)) + p.Send(counter.cnt, pkt) + +} diff --git a/components/testrtn/delayedreceiver.go b/components/testrtn/delayedreceiver.go new file mode 100644 index 0000000..92fecb7 --- /dev/null +++ b/components/testrtn/delayedreceiver.go @@ -0,0 +1,32 @@ +package testrtn + +import ( + "fmt" + "time" + + "github.com/jpaulm/gofbp/core" +) + +type DelayedReceiver struct { + ipt core.InputConn +} + +func (receiver *DelayedReceiver) Setup(p *core.Process) { + receiver.ipt = p.OpenInPort("IN") +} + +func (DelayedReceiver) MustRun() {} + +func (receiver *DelayedReceiver) Execute(p *core.Process) { + + for { + var pkt = p.Receive(receiver.ipt) + if pkt == nil { + break + } + time.Sleep(500 * time.Millisecond) + fmt.Println("Input to DelayedReceiver:", p.Name, ">", pkt.Contents) + p.Discard(pkt) + } + +} diff --git a/components/testrtn/discard.go b/components/testrtn/discard.go new file mode 100644 index 0000000..d77e585 --- /dev/null +++ b/components/testrtn/discard.go @@ -0,0 +1,32 @@ +package testrtn + +import ( + //"fmt" + + "github.com/jpaulm/gofbp/core" +) + +type Discard struct { + ipt core.InputConn +} + +func (discard *Discard) Setup(p *core.Process) { + discard.ipt = p.OpenInPort("IN") +} + +//func (Discard) MustRun() {} + +func (discard *Discard) Execute(p *core.Process) { + + for { + var pkt = p.Receive(discard.ipt) + if pkt == nil { + break + } + //fmt.Println(pkt.Contents) + + p.Discard(pkt) + + } + +} diff --git a/components/testrtn/intsender.go b/components/testrtn/intsender.go new file mode 100644 index 0000000..dd352a9 --- /dev/null +++ b/components/testrtn/intsender.go @@ -0,0 +1,37 @@ +/*Package testrtn tests gofbp code.*/ +package testrtn + +import ( + //"fmt" + "strconv" + + "github.com/jpaulm/gofbp/core" +) + +/*Sender type defines ipt and opt for process send*/ +type IntSender struct { + ipt core.InputConn + opt core.OutputConn +} + +/*Setup function initializes a source process.*/ +func (intsender *IntSender) Setup(p *core.Process) { + intsender.ipt = p.OpenInPort("COUNT") + intsender.opt = p.OpenOutPort("OUT") +} + +/*Execute function launches a source process.*/ +func (intsender *IntSender) Execute(p *core.Process) { + + icpkt := p.Receive(intsender.ipt) + j, _ := strconv.Atoi(icpkt.Contents.(string)) + p.Discard(icpkt) + p.Close(intsender.ipt) + + var pkt *core.Packet + for i := 0; i < j; i++ { + pkt = p.Create(i) + p.Send(intsender.opt, pkt) + } + +} diff --git a/components/testrtn/kick.go b/components/testrtn/kick.go new file mode 100644 index 0000000..e9db4af --- /dev/null +++ b/components/testrtn/kick.go @@ -0,0 +1,22 @@ +package testrtn + +import ( + //"fmt" + + "github.com/jpaulm/gofbp/core" +) + +type Kick struct { + opt core.OutputConn +} + +func (kick *Kick) Setup(p *core.Process) { + kick.opt = p.OpenOutPort("OUT") +} + +func (kick *Kick) Execute(p *core.Process) { + + var pkt = p.Create("Kicker IP") + p.Send(kick.opt, pkt) + +} diff --git a/components/testrtn/loadbalance.go b/components/testrtn/loadbalance.go new file mode 100644 index 0000000..da91e35 --- /dev/null +++ b/components/testrtn/loadbalance.go @@ -0,0 +1,47 @@ +package testrtn + +import ( + "github.com/jpaulm/gofbp/core" +) + +type LoadBalance struct { + ipt core.InputConn + out core.OutputArrayConn +} + +func (loadbalance *LoadBalance) Setup(p *core.Process) { + loadbalance.ipt = p.OpenInPort("IN") + loadbalance.out = p.OpenOutArrayPort("OUT") +} + +func (loadbalance *LoadBalance) Execute(p *core.Process) { + + var i int + var level int + var inSubstream bool + for { + var pkt = p.Receive(loadbalance.ipt) + if pkt == nil { + break + } + + if !inSubstream { + i = loadbalance.out.GetItemWithFewestIPs() + } + + if pkt.PktType == core.OpenBracket { + inSubstream = true + level++ + } + + if pkt.PktType == core.CloseBracket && level == 1 { + inSubstream = false + level-- + } + + opt := loadbalance.out.GetArrayItem(i) + + p.Send(opt, pkt) + } + +} diff --git a/components/testrtn/prefix.go b/components/testrtn/prefix.go new file mode 100644 index 0000000..8397f37 --- /dev/null +++ b/components/testrtn/prefix.go @@ -0,0 +1,49 @@ +package testrtn + +import ( + "fmt" + + "github.com/jpaulm/gofbp/core" +) + +type Prefix struct { + ipt core.InputConn + iptIP core.InputConn + out core.OutputConn +} + +func (prefix *Prefix) Setup(p *core.Process) { + + prefix.ipt = p.OpenInPort("IN") + + prefix.out = p.OpenOutPort("OUT") + + prefix.iptIP = p.OpenInPort("PARAM") +} + +func (prefix *Prefix) Execute(p *core.Process) { + + icpkt := p.Receive(prefix.iptIP) + param := icpkt.Contents.(string) + + p.Discard(icpkt) + + p.Close(prefix.iptIP) + + for { + var pkt = p.Receive(prefix.ipt) + if pkt == nil { + break + } + fmt.Println(pkt.Contents) + + s, ok := pkt.Contents.(string) + if !ok { + panic("IP contents must be a string") + } + s = param + s + pkt.Contents = s + p.Send(prefix.out, pkt) + + } +} diff --git a/components/testrtn/receiver.go b/components/testrtn/receiver.go new file mode 100644 index 0000000..a9335cb --- /dev/null +++ b/components/testrtn/receiver.go @@ -0,0 +1,31 @@ +package testrtn + +import ( + "fmt" + + "github.com/jpaulm/gofbp/core" +) + +type Receiver struct { + ipt core.InputConn +} + +func (receiver *Receiver) Setup(p *core.Process) { + receiver.ipt = p.OpenInPort("IN") +} + +func (Receiver) MustRun() {} + +func (receiver *Receiver) Execute(p *core.Process) { + + for { + var pkt = p.Receive(receiver.ipt) + if pkt == nil { + break + } + + fmt.Println("Input to Receiver:", p.Name, ">", pkt.Contents) + p.Discard(pkt) + } + +} diff --git a/components/testrtn/roundrobinsender.go b/components/testrtn/roundrobinsender.go new file mode 100644 index 0000000..60cdcd5 --- /dev/null +++ b/components/testrtn/roundrobinsender.go @@ -0,0 +1,36 @@ +package testrtn + +import ( + "github.com/jpaulm/gofbp/core" +) + +type RoundRobinSender struct { + ipt core.InputConn + out core.OutputArrayConn +} + +func (rrsender *RoundRobinSender) Setup(p *core.Process) { + rrsender.ipt = p.OpenInPort("IN") + rrsender.out = p.OpenOutArrayPort("OUT") +} + +func (rrsender *RoundRobinSender) Execute(p *core.Process) { + + var i = 0 + + j := rrsender.out.ArrayLength() + + for { + var pkt = p.Receive(rrsender.ipt) + if pkt == nil { + break + } + //fmt.Println("Output: ", pkt.Contents) + + opt := rrsender.out.GetArrayItem(i) + + p.Send(opt, pkt) + i = (i + 1) % j + } + +} diff --git a/components/testrtn/selector.go b/components/testrtn/selector.go new file mode 100644 index 0000000..85b2987 --- /dev/null +++ b/components/testrtn/selector.go @@ -0,0 +1,62 @@ +package testrtn + +import ( + "fmt" + "strings" + + "github.com/jpaulm/gofbp/core" +) + +type Selector struct { + ipt core.InputConn + iptIP core.InputConn + out1 core.OutputConn + out2 core.OutputConn +} + +func (selector *Selector) Setup(p *core.Process) { + + selector.ipt = p.OpenInPort("IN") + + selector.out1 = p.OpenOutPort("ACC") + + selector.out2 = p.OpenOutPortOptional("REJ") + + selector.iptIP = p.OpenInPort("PARAM") +} + +func (Selector) MustRun() {} + +func (selector *Selector) Execute(p *core.Process) { + + icpkt := p.Receive(selector.iptIP) + param := icpkt.Contents.(string) + i := len(param) + + p.Discard(icpkt) + + p.Close(selector.iptIP) + + for { + var pkt = p.Receive(selector.ipt) + if pkt == nil { + break + } + fmt.Println(pkt.Contents) + + s := pkt.Contents.(string) + if i > len(s) { + i = len(s) + } + + if 0 == strings.Compare(param[:i], s[:i]) { + p.Send(selector.out1, pkt) + } else { + if !selector.out2.IsConnected() { + p.Discard(pkt) + } else { + p.Send(selector.out2, pkt) + } + } + } +} diff --git a/components/testrtn/sender.go b/components/testrtn/sender.go new file mode 100644 index 0000000..751da1b --- /dev/null +++ b/components/testrtn/sender.go @@ -0,0 +1,37 @@ +/*Package testrtn tests gofbp code.*/ +package testrtn + +import ( + //"fmt" + "strconv" + + "github.com/jpaulm/gofbp/core" +) + +/*Sender type defines ipt and opt for process send*/ +type Sender struct { + ipt core.InputConn + opt core.OutputConn +} + +/*Setup function initializes a source process.*/ +func (sender *Sender) Setup(p *core.Process) { + sender.ipt = p.OpenInPort("COUNT") + sender.opt = p.OpenOutPort("OUT") +} + +/*Execute function launches a source process.*/ +func (sender *Sender) Execute(p *core.Process) { + + icpkt := p.Receive(sender.ipt) + j, _ := strconv.Atoi(icpkt.Contents.(string)) + p.Discard(icpkt) + p.Close(sender.ipt) + + var pkt *core.Packet + for i := 0; i < j; i++ { + pkt = p.Create("IP - # " + strconv.Itoa(i)) + p.Send(sender.opt, pkt) + } + +} diff --git a/components/testrtn/substreamsender.go b/components/testrtn/substreamsender.go new file mode 100644 index 0000000..7927bbb --- /dev/null +++ b/components/testrtn/substreamsender.go @@ -0,0 +1,55 @@ +package testrtn + +import ( + "strconv" + + "github.com/jpaulm/gofbp/core" +) + +type SubstreamSender struct { + ipt core.InputConn + opt core.OutputConn +} + +func (sender *SubstreamSender) Setup(p *core.Process) { + sender.ipt = p.OpenInPort("COUNT") + sender.opt = p.OpenOutPort("OUT") +} + +func (sender *SubstreamSender) Execute(p *core.Process) { + + icpkt := p.Receive(sender.ipt) + j, _ := strconv.Atoi(icpkt.Contents.(string)) + p.Discard(icpkt) + p.Close(sender.ipt) + + var pkt *core.Packet + pkt = p.CreateBracket(core.OpenBracket, "") + p.Send(sender.opt, pkt) + + for i := 0; i < j; i++ { + k := i % 10 + + if k == 2 { + pkt = p.CreateBracket(core.CloseBracket, "") + p.Send(sender.opt, pkt) + } + if k == 3 { + pkt = p.CreateBracket(core.OpenBracket, "") + p.Send(sender.opt, pkt) + } + + if k == 7 || k == 0 { + pkt = p.CreateBracket(core.CloseBracket, "") + p.Send(sender.opt, pkt) + pkt = p.CreateBracket(core.OpenBracket, "") + p.Send(sender.opt, pkt) + } + + pkt = p.Create("IP - # " + strconv.Itoa(i)) + p.Send(sender.opt, pkt) + } + pkt = p.CreateBracket(core.CloseBracket, "") + p.Send(sender.opt, pkt) + +} diff --git a/components/testrtn/writetoconsnl.go b/components/testrtn/writetoconsnl.go new file mode 100644 index 0000000..0d1999a --- /dev/null +++ b/components/testrtn/writetoconsnl.go @@ -0,0 +1,48 @@ +package testrtn + +import ( + "fmt" + + "github.com/jpaulm/gofbp/core" +) + +// WriteToConsole modified to be a non-looper (NL) + +type WriteToConsNL struct { + ipt core.InputConn + opt core.OutputConn +} + +func (writeToConsole *WriteToConsNL) Setup(p *core.Process) { + writeToConsole.ipt = p.OpenInPort("IN") + writeToConsole.opt = p.OpenOutPortOptional("OUT") +} + +//func (WriteToConsNL) MustRun() {} + +func (writeToConsole *WriteToConsNL) Execute(p *core.Process) { + + //for { + var pkt = p.Receive(writeToConsole.ipt) + if pkt == nil { + //break + return + } + if pkt.PktType == core.OpenBracket { + fmt.Println("Open Bracket", pkt.Contents) + } else { + if pkt.PktType == core.CloseBracket { + fmt.Println("Close Bracket", pkt.Contents) + } else { + fmt.Print(pkt.Contents) + } + } + + if writeToConsole.opt.IsConnected() { + p.Send(writeToConsole.opt, pkt) + } else { + p.Discard(pkt) + } + //} + +} diff --git a/components/testrtn/writetoconsole.go b/components/testrtn/writetoconsole.go new file mode 100644 index 0000000..8436478 --- /dev/null +++ b/components/testrtn/writetoconsole.go @@ -0,0 +1,45 @@ +package testrtn + +import ( + "fmt" + + "github.com/jpaulm/gofbp/core" +) + +type WriteToConsole struct { + ipt core.InputConn + out core.OutputConn +} + +func (writeToConsole *WriteToConsole) Setup(p *core.Process) { + writeToConsole.ipt = p.OpenInPort("IN") + writeToConsole.out = p.OpenOutPortOptional("OUT") +} + +func (WriteToConsole) MustRun() {} + +func (writeToConsole *WriteToConsole) Execute(p *core.Process) { + + for { + var pkt = p.Receive(writeToConsole.ipt) + if pkt == nil { + break + } + if pkt.PktType == core.OpenBracket { + fmt.Println("Open Bracket", pkt.Contents) + } else { + if pkt.PktType == core.CloseBracket { + fmt.Println("Close Bracket", pkt.Contents) + } else { + fmt.Print(pkt.Contents) + } + } + + if writeToConsole.out.IsConnected() { + p.Send(writeToConsole.out, pkt) + } else { + p.Discard(pkt) + } + } + +} diff --git a/components/websocket/ans/params.xml b/components/websocket/ans/params.xml new file mode 100644 index 0000000..04eba75 --- /dev/null +++ b/components/websocket/ans/params.xml @@ -0,0 +1,6 @@ + + + true + false + false + diff --git a/components/websocket/ans/ws_ans_req.go b/components/websocket/ans/ws_ans_req.go new file mode 100644 index 0000000..0c1f6d4 --- /dev/null +++ b/components/websocket/ans/ws_ans_req.go @@ -0,0 +1,45 @@ +package ans + +import ( + "github.com/jpaulm/gofbp/core" +) + +type WSAnsReq struct { + ipt core.InputConn + out core.OutputConn +} + +func (wsansreq *WSAnsReq) Setup(p *core.Process) { + wsansreq.ipt = p.OpenInPort("IN") + wsansreq.out = p.OpenOutPortOptional("OUT") +} + +func (WSAnsReq) MustRun() {} + +func (wsansreq *WSAnsReq) Execute(p *core.Process) { + + for { + pkt := p.Receive(wsansreq.ipt) // open bracket + if pkt == nil { + break + } + p.Send(wsansreq.out, pkt) + + pkt = p.Receive(wsansreq.ipt) // connection + p.Send(wsansreq.out, pkt) + + pkt = p.Receive(wsansreq.ipt) //"namelist" + p.Discard(pkt) + + pkt = p.Create("line1") + p.Send(wsansreq.out, pkt) + pkt = p.Create("line2") + p.Send(wsansreq.out, pkt) + pkt = p.Create("line3") + p.Send(wsansreq.out, pkt) + + pkt = p.Receive(wsansreq.ipt) // close bracket + p.Send(wsansreq.out, pkt) + } + +} diff --git a/components/websocket/ans/ws_ans_req_test.go b/components/websocket/ans/ws_ans_req_test.go new file mode 100644 index 0000000..253473f --- /dev/null +++ b/components/websocket/ans/ws_ans_req_test.go @@ -0,0 +1,26 @@ +package ans + +import ( + "testing" + + "github.com/jpaulm/gofbp/components/websocket" + "github.com/jpaulm/gofbp/core" +) + +func TestWebSocket(t *testing.T) { + params, err := core.LoadXMLParams("params.xml") + if err != nil { + panic(err) + } + path := "localhost:8080" + net := core.NewNetwork("TestWebSocket") + net.SetParams(params) + //proc1 := net.NewProc("WSRequest", &websocket.WSRequest{}) + proc1 := net.NewProc("WSRequest", &websocket.WSRequest{}) + proc2 := net.NewProc("AnsReq", &websocket.WSAnsReq{}) + proc3 := net.NewProc("WSRespond", &websocket.WSRespond{}) + net.Initialize(path, proc1, "ADDR") + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "OUT", proc3, "IN", 6) + net.Run() +} diff --git a/components/websocket/ws_ans_req.go b/components/websocket/ws_ans_req.go new file mode 100644 index 0000000..4df1a0c --- /dev/null +++ b/components/websocket/ws_ans_req.go @@ -0,0 +1,45 @@ +package websocket + +import ( + "github.com/jpaulm/gofbp/core" +) + +type WSAnsReq struct { + ipt core.InputConn + out core.OutputConn +} + +func (wsansreq *WSAnsReq) Setup(p *core.Process) { + wsansreq.ipt = p.OpenInPort("IN") + wsansreq.out = p.OpenOutPortOptional("OUT") +} + +func (WSAnsReq) MustRun() {} + +func (wsansreq *WSAnsReq) Execute(p *core.Process) { + + for { + pkt := p.Receive(wsansreq.ipt) // open bracket + if pkt == nil { + break + } + p.Send(wsansreq.out, pkt) + + pkt = p.Receive(wsansreq.ipt) // connection + p.Send(wsansreq.out, pkt) + + pkt = p.Receive(wsansreq.ipt) //"namelist" + p.Discard(pkt) + + pkt = p.Create("line1") + p.Send(wsansreq.out, pkt) + pkt = p.Create("line2") + p.Send(wsansreq.out, pkt) + pkt = p.Create("line3") + p.Send(wsansreq.out, pkt) + + pkt = p.Receive(wsansreq.ipt) // close bracket + p.Send(wsansreq.out, pkt) + } + +} diff --git a/components/websocket/ws_request.go b/components/websocket/ws_request.go new file mode 100644 index 0000000..b4564fd --- /dev/null +++ b/components/websocket/ws_request.go @@ -0,0 +1,180 @@ +// https://github.com/gorilla/websocket/blob/master/examples/echo/server.go + +// try https://stackoverflow.com/questions/39320025/how-to-stop-http-listenandserve + +package websocket + +import ( + "context" + "fmt" + "log" + "net/http" + "sync" + "time" + + "github.com/gorilla/websocket" + "github.com/jpaulm/gofbp/core" +) + +//var data_map map[*websocket.Conn][]*core.Packet + +type WSRequest struct { + ipt core.InputConn + opt core.OutputConn +} + +func (wsrequest *WSRequest) Setup(p *core.Process) { + wsrequest.ipt = p.OpenInPort("ADDR") + wsrequest.opt = p.OpenOutPort("OUT") +} + +var upgrader = websocket.Upgrader{} +var proc *core.Process + +func (wsrequest *WSRequest) Execute(p *core.Process) { + icpkt := p.Receive(wsrequest.ipt) + path := icpkt.Contents.(string) + p.Discard(icpkt) + p.Close(wsrequest.ipt) + proc = p + //addr = flag.String("addr", path, "http service address") + //flag.Parse() + log.SetFlags(0) + + log.Printf("main: starting HTTP server") + + httpServerExitDone := &sync.WaitGroup{} + + httpServerExitDone.Add(1) + srv := startHttpServer(httpServerExitDone, path) + + log.Printf("serving for 30 seconds") + + time.Sleep(30 * time.Second) // fudge! + + log.Printf("stopping HTTP server") + + // now close the server gracefully ("shutdown") + // timeout could be given with a proper context + // (in real world you shouldn't use TODO()). ???????? + if err := srv.Shutdown(context.TODO()); err != nil { + panic(err) // failure/timeout shutting down the server gracefully + } + + // wait for goroutine started in startHttpServer() to stop + httpServerExitDone.Wait() + + log.Printf("done. exiting") + //http.HandleFunc("/", serveHome) + //http.HandleFunc("/ws", serveWs) + + //err := http.ListenAndServe(*addr, nil) + //log.Fatal(err) +} + +func startHttpServer(wg *sync.WaitGroup, path string) *http.Server { + //srv := &http.Server{Addr: ":8080"} + srv := &http.Server{Addr: path} + + //http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + http.HandleFunc("/", serveWs) + + go func() { + defer wg.Done() // let main know we are done cleaning up + + // always returns error. ErrServerClosed on graceful close + if err := srv.ListenAndServe(); err != http.ErrServerClosed { + // unexpected error. port in use? + log.Fatalf("ListenAndServe(): %v", err) + } + }() + + // returning reference so caller can call Shutdown() + return srv +} + +func serveWs(w http.ResponseWriter, r *http.Request) { + fmt.Println("upgrade") + upgrader.CheckOrigin = func(r *http.Request) bool { return true } + c, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Print("upgrade:", err) + return + } + //conn = *c + defer c.Close() + + //if data_map == nil { + // data_map = make(map[*websocket.Conn][]*core.Packet) + //} + + var pkt_list []*core.Packet + var pkt *core.Packet + + opt := proc.OpenOutPort("OUT") + + for { + _, message, err := c.ReadMessage() + if err != nil { + log.Println("read:", err) + break + } + log.Printf("recv: %s", message) + + x := string(message) + + if x == "@{" { + + pkt_list = make([]*core.Packet, 0) + //data_map[c] = pkt_list + continue + } + + if x == "@}" { + + // send out "connection" IPs, then IPs stored in pkt_list ... surrounded by bracket IPs + + pkt = proc.CreateBracket(core.OpenBracket, "") + proc.Send(opt, pkt) + + pkt = proc.Create(c) // connection + proc.Send(opt, pkt) + + for _, pkt := range pkt_list { + proc.Send(opt, pkt) + } + + //data_map[c] = nil + pkt = proc.CreateBracket(core.CloseBracket, "") + proc.Send(opt, pkt) + continue + } + + if x == "@kill" { + //time.Sleep(10 * time.Second) + //pkt = proc.Create(x) + //proc.Send(opt, pkt) + c.Close() + //break + continue + } + + pkt = proc.Create(x) + pkt_list = append(pkt_list, pkt) + //data_map[c] = pkt_list + } +} + +/* +func serveHome(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/" { + http.Error(w, "Not found", http.StatusNotFound) + return + } + if r.Method != http.MethodGet { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + http.ServeFile(w, r, "home.html") +} +*/ diff --git a/components/websocket/ws_respond.go b/components/websocket/ws_respond.go new file mode 100644 index 0000000..a04cde1 --- /dev/null +++ b/components/websocket/ws_respond.go @@ -0,0 +1,57 @@ +// https://github.com/gorilla/websocket/blob/master/examples/echo/server.go + +package websocket + +import ( + "log" + + "github.com/gorilla/websocket" + "github.com/jpaulm/gofbp/core" +) + +type WSRespond struct { + ipt core.InputConn +} + +func (WSRespond) MustRun() {} + +func (wsrespond *WSRespond) Setup(p *core.Process) { + wsrespond.ipt = p.OpenInPort("IN") +} + +func (wsrespond *WSRespond) Execute(p *core.Process) { + pkt := p.Receive(wsrespond.ipt) // open bracket + if pkt == nil { + return + } + p.Discard(pkt) + + pkt = p.Receive(wsrespond.ipt) // connection + if pkt == nil { + return + } + conn, _ := pkt.Contents.(*websocket.Conn) + + p.Discard(pkt) + + for { + pkt = p.Receive(wsrespond.ipt) + if pkt.PktType == core.CloseBracket { + break + } + //data, ok := pkt.Contents.(string) + //if !ok { + // log.Println("write: data not string") + // break + //} + + err := conn.WriteMessage(websocket.TextMessage, []byte(pkt.Contents.(string))) + if err != nil { + log.Println("write:", err) + break + } else { + p.Discard(pkt) + } + } + p.Discard(pkt) +} diff --git a/core/component.go b/core/component.go new file mode 100644 index 0000000..0aa2e97 --- /dev/null +++ b/core/component.go @@ -0,0 +1,14 @@ +/*Package core implements gofbp's run time engine.*/ +package core + +/*The Component interface implements component Setup and Execute methods.*/ +type Component interface { + Setup(*Process) + Execute(*Process) +} + +/*The ComponentWithMustRun interface implements the MustRun method.*/ +type ComponentWithMustRun interface { + Component + MustRun() bool +} diff --git a/core/inarrayport.go b/core/inarrayport.go new file mode 100644 index 0000000..5ce1035 --- /dev/null +++ b/core/inarrayport.go @@ -0,0 +1,80 @@ +package core + +import ( + //"fmt" + "sync" +) + +type InArrayPort struct { + network *Network + + //portName string + //fullName string + array []*InPort + mtx sync.Mutex + closed bool + //downStrProc *Process +} + +func (c *InArrayPort) isDrained() bool { + for _, v := range c.array { + if !v.isDrained() { + return false + } + } + return true +} + +func (c *InArrayPort) isEmpty() bool { + for _, v := range c.array { + if !v.isEmpty() { + return false + } + } + return true +} + +func (c *InArrayPort) receive(p *Process) *Packet { + panic("receive from an array port") +} + +func (c *InArrayPort) isClosed() bool { + for _, v := range c.array { + if !v.isClosed() { + return false + } + } + return true +} + +func (c *InArrayPort) resetForNextExecution() {} + +func (c *InArrayPort) GetArrayItem(i int) *InPort { + if i >= len(c.array) { + return nil + } + return c.array[i] +} + +func (c *InArrayPort) setArrayItem(c2 *InPort, i int) { + if i >= len(c.array) { + // add to .array to fit c2 + increaseBy := make([]*InPort, i-len(c.array)+1) + c.array = append(c.array, increaseBy...) + } + c.array[i] = c2 +} + +func (c *InArrayPort) ArrayLength() int { + return len(c.array) +} + +func (c *InArrayPort) Close() { + c.mtx.Lock() + defer c.mtx.Unlock() + c.closed = true + for _, w := range c.array { + w.closed = true + BdcastTr(w.condNE, "bdcast in array NE", w.downStrProc) + } +} diff --git a/core/initializationconnection.go b/core/initializationconnection.go new file mode 100644 index 0000000..bfb6949 --- /dev/null +++ b/core/initializationconnection.go @@ -0,0 +1,74 @@ +package core + +import ( + "fmt" + "sync" +) + +type InitializationConnection struct { + network *Network + portName string + fullName string + closed bool + value interface{} + mtx sync.Mutex + downStrProc *Process +} + +func (c *InitializationConnection) isDrained() bool { + c.mtx.Lock() + defer c.mtx.Unlock() + + return c.closed +} + +func (c *InitializationConnection) isEmpty() bool { + c.mtx.Lock() + defer c.mtx.Unlock() + + return !c.closed +} + +func (c *InitializationConnection) Receive(p *Process) *Packet { + return c.receive(c.downStrProc) +} + +func (c *InitializationConnection) receive(p *Process) *Packet { + + if c.closed { + return nil + } + trace(p, " Receiving IIP") + var pkt *Packet = new(Packet) + pkt.Contents = c.value + pkt.owner = p + p.ownedPkts++ + c.Close() + trace(p, " Received IIP: ") + if tracing { + fmt.Print(" ", pkt.Contents, "\n") + } + return pkt +} + +func (c *InitializationConnection) Close() { + c.mtx.Lock() + defer c.mtx.Unlock() + + c.closed = true + +} + +func (c *InitializationConnection) isClosed() bool { + c.mtx.Lock() + defer c.mtx.Unlock() + + return c.closed +} + +func (c *InitializationConnection) resetForNextExecution() { + c.mtx.Lock() + defer c.mtx.Unlock() + + c.closed = false +} diff --git a/core/inport.go b/core/inport.go new file mode 100644 index 0000000..d246f35 --- /dev/null +++ b/core/inport.go @@ -0,0 +1,136 @@ +package core + +import ( + "fmt" + "sync" + "sync/atomic" +) + +type InPort struct { + network *Network + pktArray []*Packet + is, ir int // send index and receive index + mtx sync.Mutex + condNE *sync.Cond + condNF *sync.Cond + closed bool + upStrmCnt int + portName string + fullName string + downStrProc *Process +} + +func (c *InPort) Receive(p *Process) *Packet { + return c.receive(c.downStrProc) +} + +func (c *InPort) receive(p *Process) *Packet { + LockTr(c.condNE, "recv L", p) + defer UnlockTr(c.condNE, "recv U", p) + trace(p, " Receiving from "+c.portName) + for c.isEmptyNL() { // InPort is empty + if c.closed /* || c.upStrmCnt == 0 - check this! */ { + trace(p, " Received end of stream from "+c.portName) + return nil + } + atomic.StoreInt32(&p.status, SuspRecv) + WaitTr(c.condNE, "wait in recv", p) + atomic.StoreInt32(&p.status, Active) + } + pkt := c.pktArray[c.ir] + c.pktArray[c.ir] = nil + if pkt.PktType != NormalPacket { + trace(p, " Received from "+c.portName+" < "+ + [...]string{"", "Open", "Close"}[pkt.PktType]+" Bracket") + if tracing { + fmt.Print(" contents: ", pkt.Contents, "\n") + } + } else { + trace(p, " Received from "+c.portName+" < ") + if tracing { + fmt.Print(" ", pkt.Contents, "\n") + } + } + c.ir = (c.ir + 1) % len(c.pktArray) + pkt.owner = p + p.ownedPkts++ + //c.condNF.Broadcast() + BdcastTr(c.condNF, "bdcast recv'd", p) + + return pkt +} + +func (c *InPort) incUpstream() { + LockTr(c.condNE, "IUS L", nil) + defer UnlockTr(c.condNE, "IUS U", nil) + + c.upStrmCnt++ +} + +func (c *InPort) decUpstream() { + //LockTr(c.condNE, "DUS L", nil) + //defer UnlockTr(c.condNE, "DUS U", nil) + c.upStrmCnt-- +} + +func (c *InPort) Close() { + LockTr(c.condNE, "ClsI L", c.downStrProc) + defer UnlockTr(c.condNE, "ClsI U", c.downStrProc) + + c.closed = true + //c.condNE.Broadcast() + BdcastTr(c.condNE, "bdcast in NE", c.downStrProc) + //c.downStrProc.activate() +} + +func (c *InPort) isDrained() bool { + LockTr(c.condNE, "IDr L", c.downStrProc) + defer UnlockTr(c.condNE, "IDr U", c.downStrProc) + + return c.isDrainedNL() +} + +func (c *InPort) isDrainedNL() bool { + return c.isEmptyNL() && c.closed +} + +func (c *InPort) isEmpty() bool { + LockTr(c.condNE, "IE L", c.downStrProc) + defer UnlockTr(c.condNE, "IE U", c.downStrProc) + + return c.isEmptyNL() +} + +func (c *InPort) isEmptyNL() bool { + return c.ir == c.is && c.pktArray[c.is] == nil +} + +func (c *InPort) isClosed() bool { + LockTr(c.condNE, "IC L", c.downStrProc) + defer UnlockTr(c.condNE, "IC U", c.downStrProc) + + return c.closed +} + +func (c *InPort) isFull() bool { + return c.ir == c.is && c.pktArray[c.is] != nil +} + +func (c *InPort) resetForNextExecution() { + c.mtx.Lock() + defer c.mtx.Unlock() + + c.closed = false +} + +func (c *InPort) pktCount() int { + var i int + c.mtx.Lock() + defer c.mtx.Unlock() + for _, p := range c.pktArray { + if p != nil { + i++ + } + } + return i +} diff --git a/core/inputconn.go b/core/inputconn.go new file mode 100644 index 0000000..edfb64a --- /dev/null +++ b/core/inputconn.go @@ -0,0 +1,25 @@ +package core + +type inputCommon interface { + isDrained() bool + resetForNextExecution() + isEmpty() bool + isClosed() bool + Close() + receive(*Process) *Packet + //Name() string + //SetName(string) +} + +type InputConn interface { + inputCommon + //receive(p *Process) *Packet +} + +type InputArrayConn interface { + inputCommon + + GetArrayItem(i int) *InPort + setArrayItem(c *InPort, i int) + ArrayLength() int +} diff --git a/core/network.go b/core/network.go new file mode 100644 index 0000000..2d8eb69 --- /dev/null +++ b/core/network.go @@ -0,0 +1,453 @@ +package core + +import ( + "encoding/xml" + "errors" + "fmt" + "io/ioutil" + "regexp" + "strconv" + "sync" + "sync/atomic" +) + +var tracing bool +var tracelocks bool +var tracepkts bool +var generateGids bool + +type Network struct { + Name string + procs map[string]*Process + //conns map[string]inputCommon + wg sync.WaitGroup + mother *Process + //params *Params +} + +func NewNetwork(name string) *Network { + net := &Network{ + Name: name, + procs: make(map[string]*Process), + wg: sync.WaitGroup{}, + //params: pms, + } + + return net +} + +func NewSubnet(Name string, p *Process) *Network { + net := &Network{ + Name: Name, + procs: make(map[string]*Process), + wg: sync.WaitGroup{}, + } + + net.mother = p + return net +} + +func (n *Network) GetProc(nm string) *Process { + return n.procs[nm] +} + +func (n *Network) SetProc(p *Process, nm string) { + n.procs[nm] = p +} + +func LockTr(sc *sync.Cond, s string, p *Process) { + if tracelocks && p != nil { + fmt.Println(p.Name, s) + } + sc.L.Lock() +} + +func UnlockTr(sc *sync.Cond, s string, p *Process) { + sc.L.Unlock() + if tracelocks && p != nil { + fmt.Println(p.Name, s) + } +} + +func BdcastTr(sc *sync.Cond, s string, p *Process) { + sc.Broadcast() + if tracelocks && p != nil { + fmt.Println(p.Name, s) + } +} + +func WaitTr(sc *sync.Cond, s string, p *Process) { + if tracelocks && p != nil { + fmt.Println(p.Name, s) + } + sc.Wait() +} + +func trace(p *Process, s string) { + if tracing { + fmt.Print(p.Name, " "+s+"\n") + } +} + +func traceNet(n *Network, s string) { + if tracing { + fmt.Print(n.Name, " "+s+"\n") + } +} + +func (n *Network) NewProc(nm string, comp Component) *Process { + + proc := &Process{ + Name: nm, + logFile: "", + component: comp, + status: Notstarted, + network: n, + } + //atomic.StoreInt32(&proc.status, Notstarted) + n.SetProc(proc, nm) + proc.inPorts = make(map[string]inputCommon) + proc.outPorts = make(map[string]outputCommon) + proc.mtx = sync.Mutex{} + proc.canGo = sync.NewCond(&proc.mtx) + //if stkLevel > 0 { + // n.mother = pStack[stkLevel-1] + //} + proc.gid = getGID() + return proc +} + +func (n *Network) NewConnection(cap int) *InPort { + conn := &InPort{ + network: n, + } + conn.mtx = sync.Mutex{} + conn.condNE = sync.NewCond(&conn.mtx) + conn.condNF = sync.NewCond(&conn.mtx) + conn.pktArray = make([]*Packet, cap) + return conn +} + +func (n *Network) NewInitializationConnection() *InitializationConnection { + conn := &InitializationConnection{ + network: n, + } + conn.mtx = sync.Mutex{} + return conn +} + +func (n *Network) NewInArrayPort() *InArrayPort { + conn := &InArrayPort{ + network: n, + } + conn.mtx = sync.Mutex{} + return conn +} + +func (n *Network) NewOutArrayPort() *OutArrayPort { + port := &OutArrayPort{ + network: n, + } + + return port +} + +func (n *Network) Connect(p1 *Process, out string, p2 *Process, in string, cap int) { + + inPort := parsePort(in) + + var connxn *InPort + //var anyInConn InputConn + + if inPort.indexed { + var anyInConn = p2.inPorts[inPort.name] + if anyInConn == nil { + + anyInConn = n.NewInArrayPort() + p2.inPorts[inPort.name] = anyInConn + } + + connxn = anyInConn.(InputArrayConn).GetArrayItem(inPort.index) + + if connxn == nil { + connxn = n.NewConnection(cap) + connxn.portName = inPort.name + "[" + strconv.Itoa(inPort.index) + "]" + connxn.fullName = p2.Name + "." + connxn.portName + //n.conns[connxn.fullName] = connxn + connxn.downStrProc = p2 + connxn.network = n + if anyInConn == nil { + p2.inPorts[inPort.name] = connxn + } else { + anyInConn.(InputArrayConn).setArrayItem(connxn, inPort.index) + } + } + } else { + if p2.inPorts[inPort.name] == nil { + connxn = n.NewConnection(cap) + connxn.portName = inPort.name + connxn.fullName = p2.Name + "." + inPort.name + //n.conns[connxn.fullName] = connxn + connxn.downStrProc = p2 + connxn.network = n + p2.inPorts[inPort.name] = connxn + } else { + connxn = p2.inPorts[inPort.name].(*InPort) + } + } + + if in == "*" { + p2.autoInput = connxn + } + + // connxn built; input port array built if necessary + + outPort := parsePort(out) + + var opt *OutPort + + if outPort.indexed { + var anyOutConn = p1.outPorts[outPort.name] + if anyOutConn == nil { + anyOutConn = n.NewOutArrayPort() + p1.outPorts[outPort.name] = anyOutConn + } + + //opt := new(OutArrayPort) + outConn := anyOutConn.(*OutArrayPort) + //p1.outPorts[out] = anyOutConn + //opt.Name = out + opt = new(OutPort) + outConn.setArrayItem(opt, outPort.index) + opt.portName = out + opt.fullName = p1.Name + "." + out + //n.conns[opt.fullName] = opt.Conn + } else { + //var opt OutputConn + opt = new(OutPort) + p1.outPorts[out] = opt + opt.network = n + opt.portName = out + opt.fullName = p1.Name + "." + out + //n.conns[opt.fullName] = opt.Conn + + } + + opt.sender = p1 + opt.conn = connxn + opt.connected = true + + connxn.incUpstream() + if out == "*" { + p1.autoOutput = connxn + } +} + +type portDefinition struct { + name string + index int + indexed bool +} + +var portPattern = regexp.MustCompile(`^(.+)\[(\d+)\]$`) + +func parsePort(in string) portDefinition { + matches := portPattern.FindStringSubmatch(in) + if len(matches) == 0 { + return portDefinition{name: in} + } + root, indexStr := matches[1], matches[2] + + index, err := strconv.Atoi(indexStr) + if err != nil { + panic("Invalid index in " + in) + } + + return portDefinition{name: root, index: index, indexed: true} +} + +func (n *Network) Initialize(initValue interface{}, p2 *Process, in string) { + + conn := n.NewInitializationConnection() + p2.inPorts[in] = conn + conn.portName = in + conn.fullName = p2.Name + "." + in + //n.conns[conn.fullName] = conn + + conn.value = initValue +} + +func (n *Network) Exit() { + if n.mother == nil { + traceNet(n, "Exit network") + } else { + traceNet(n, "Exit subnet") + } +} + +type Params struct { + Tracing bool `xml:"tracing"` + TraceLocks bool `xml:"tracelocks"` + TracePkts bool `xml:"tracepkts"` + GenerateGIDs bool `xml:"generate-gIds"` +} + +func LoadXMLParams(s string) (*Params, error) { + + params := &Params{} + + xmldata, err := ioutil.ReadFile(s) + if err != nil { + return nil, errors.New("couldn't read: " + s) + } + err = xml.Unmarshal(xmldata, ¶ms) + if err != nil { + return nil, errors.New("couldn't unmarshal: " + s) + } + + return params, nil +} + +func (n *Network) SetParams(p *Params) { + if p == nil { + panic("Calling SetParams with nil parameter") + } + tracing = p.Tracing + tracelocks = p.TraceLocks + tracepkts = p.TracePkts + generateGids = p.GenerateGIDs +} + +func (n *Network) Run() { + defer n.Exit() + //if n.mother == nil { + // n.setOptions() + //} + + defer traceNet(n, " Done") + + for { + if n.mother != nil { + traceNet(n, " Starting subnet activation") + } else { + traceNet(n, " Starting network") + } + + // FBP distinguishes between execution of the process as a whole and activating the code - the code may be deactivated and then + // reactivated many times during the process "run" + + n.wg = sync.WaitGroup{} + n.wg.Add(len(n.procs)) + + //defer n.wg.Wait() + var someProcsCanRun bool = false + + for _, proc := range n.procs { + + //LockTr(proc.canGo, "test if not started L", proc) + //atomic.StoreInt32(&proc.status, Notstarted) + + selfStarting := true + if proc.inPorts != nil { + for _, conn := range proc.inPorts { + + _, b := conn.(*InitializationConnection) + if !b { + selfStarting = false + } + } + } + + if !selfStarting { + continue + } + //atomic.StoreInt32(&proc.status, Notstarted) + trace(proc, "act from start") + proc.activate() + someProcsCanRun = true + //UnlockTr(proc.canGo, "test if not started U", proc) + } + if !someProcsCanRun { + n.wg.Add(0 - len(n.procs)) + panic("No process can start") + } + n.wg.Wait() + + if n.mother == nil { + return + } + + traceNet(n, " subnet deactivated") + + for _, p := range n.procs { + for _, v := range p.inPorts { + _, b := v.(*InArrayPort) + if b { + for _, w := range v.(*InArrayPort).array { + w.resetForNextExecution() + } + } else { + v.resetForNextExecution() + } + } + } + + p := n.mother + + allDrained, _, _ := p.inputState() + if allDrained { + break + } + + for _, p := range n.procs { + atomic.StoreInt32(&p.status, Notstarted) + for _, v := range p.outPorts { + _, b := v.(*OutArrayPort) + if b { + for _, w := range v.(*OutArrayPort).array { + w.conn.upStrmCnt = 0 + } + } else { + w, b := v.(*OutPort) + if b { + w.conn.upStrmCnt = 0 + } + } + } + } + + for _, p := range n.procs { + for _, v := range p.outPorts { + _, b := v.(*OutArrayPort) + if b { + for _, w := range v.(*OutArrayPort).array { + w.conn.incUpstream() + } + } else { + w, b := v.(*OutPort) + if b { + w.conn.incUpstream() + } + } + } + } + } + + //if n.mother != nil { + p := n.mother + for _, v := range p.outPorts { + _, b := v.(*OutArrayPort) + if b { + for _, w := range v.(*OutArrayPort).array { + w.Close() + } + } else { + w, b := v.(*OutPort) + if b { + w.Close() + } + } + } +} + +//} diff --git a/core/nulloutport.go b/core/nulloutport.go new file mode 100644 index 0000000..d975644 --- /dev/null +++ b/core/nulloutport.go @@ -0,0 +1,19 @@ +package core + +type NullOutPort struct { + //sender *Process + //portName string + //fullName string +} + +// NullOutPort by default discards the packet. +func (o *NullOutPort) send(p *Process, pkt *Packet) bool { + p.Discard(pkt) + return true +} + +func (o *NullOutPort) IsConnected() bool { + return false +} + +func (o *NullOutPort) Close() {} diff --git a/core/outarrayport.go b/core/outarrayport.go new file mode 100644 index 0000000..a9cb1e0 --- /dev/null +++ b/core/outarrayport.go @@ -0,0 +1,64 @@ +package core + +import ( + //"fmt" + "math" +) + +type OutArrayPort struct { + network *Network + + portName string + fullName string + array []*OutPort + //closed bool + connected bool + //sender *Process +} + +func (o *OutArrayPort) send(p *Process, pkt *Packet) bool { panic("send on array port") } + +func (o *OutArrayPort) GetArrayItem(i int) *OutPort { + if i >= len(o.array) { + return nil + } + return o.array[i] +} + +func (o *OutArrayPort) setArrayItem(o2 *OutPort, i int) { + if i >= len(o.array) { + // add to .array to fit c2 + increaseBy := make([]*OutPort, i-len(o.array)+1) + o.array = append(o.array, increaseBy...) + } + o.array[i] = o2 +} + +func (o *OutArrayPort) ArrayLength() int { + return len(o.array) +} + +func (o *OutArrayPort) Close() { + for _, v := range o.array { + v.Close() + } +} + +func (o *OutArrayPort) IsConnected() bool { + //return o.connected + return true +} + +func (o *OutArrayPort) GetItemWithFewestIPs() int { + backlog := math.MaxInt32 + var fewestIPsIndex int + for i, v := range o.array { + j := v.conn.pktCount() + //fmt.Println(i, j) + if j <= backlog { + fewestIPsIndex = i + backlog = j + } + } + return fewestIPsIndex +} diff --git a/core/outport.go b/core/outport.go new file mode 100644 index 0000000..5399a1b --- /dev/null +++ b/core/outport.go @@ -0,0 +1,94 @@ +package core + +import ( + "fmt" + "sync/atomic" +) + +type OutPort struct { + portName string + fullName string + conn *InPort + connected bool + sender *Process + network *Network +} + +func (o *OutPort) send(p *Process, pkt *Packet) bool { + if o == nil { + return false + } + + if pkt == nil { + panic("Sending nil packet") + } + if pkt.owner != p { + panic("Sending packet not owned by this process") + } + + LockTr(o.conn.condNF, "send L", p) + defer UnlockTr(o.conn.condNF, "send U", p) + + if pkt.PktType != NormalPacket { + trace(p, " Sending to "+o.portName+" > "+ + [...]string{"", "Open", "Close"}[pkt.PktType]+" Bracket") + if tracing { + fmt.Print(" contents: ", pkt.Contents, "\n") + } + } else { + trace(p, " Sending to "+o.portName+" > ") + if tracing { + fmt.Print(" ", pkt.Contents, "\n") + } + } + + for o.conn.isFull() { // while connection is full + atomic.StoreInt32(&p.status, SuspSend) + WaitTr(o.conn.condNF, "wait in send", p) + atomic.StoreInt32(&p.status, Active) + } + + trace(p, " Sent to "+o.portName) + + trace(o.conn.downStrProc, "act from send") + o.conn.downStrProc.activate() + + o.conn.pktArray[o.conn.is] = pkt + o.conn.is = (o.conn.is + 1) % len(o.conn.pktArray) + //pkt.owner = nil + p.ownedPkts-- + pkt = nil + BdcastTr(o.conn.condNE, "bdcast sent", p) + return true +} + +func (o *OutPort) IsConnected() bool { + if o == nil { + return false + } + return o.connected +} + +func (o *OutPort) GetArrayItem(i int) *OutPort { + return nil +} + +func (o *OutPort) SetArrayItem(op *OutPort, i int) {} + +func (o *OutPort) ArrayLength() int { + return 0 +} + +func (o *OutPort) Close() { + LockTr(o.conn.condNF, "close L", o.sender) + defer UnlockTr(o.conn.condNF, "close U", o.sender) + trace(o.sender, " Close "+o.portName) + + o.conn.decUpstream() + if o.conn.upStrmCnt == 0 { + o.conn.closed = true + BdcastTr(o.conn.condNE, "bdcast out", o.sender) + trace(o.conn.downStrProc, "act from close") + o.conn.downStrProc.activate() + } +} diff --git a/core/outputconn.go b/core/outputconn.go new file mode 100644 index 0000000..3ad50d0 --- /dev/null +++ b/core/outputconn.go @@ -0,0 +1,20 @@ +package core + +type outputCommon interface { + Close() + IsConnected() bool +} + +type OutputConn interface { + outputCommon + send(*Process, *Packet) bool + // IsConnected() bool +} + +type OutputArrayConn interface { + outputCommon + GetArrayItem(i int) *OutPort + setArrayItem(c *OutPort, i int) + ArrayLength() int + GetItemWithFewestIPs() int +} diff --git a/core/packet.go b/core/packet.go new file mode 100644 index 0000000..0906ae8 --- /dev/null +++ b/core/packet.go @@ -0,0 +1,13 @@ +package core + +const ( + NormalPacket int32 = iota + OpenBracket + CloseBracket +) + +type Packet struct { + Contents interface{} + PktType int32 + owner *Process +} diff --git a/core/process.go b/core/process.go new file mode 100644 index 0000000..8ce0af3 --- /dev/null +++ b/core/process.go @@ -0,0 +1,349 @@ +package core + +import ( + "bytes" + "fmt" + "runtime" + "strconv" + "sync" + "sync/atomic" +) + +//Process type defines a gofbp process. +type Process struct { + gid uint64 + Name string + network *Network + + inPorts map[string]inputCommon + outPorts map[string]outputCommon + + logFile string + component Component + ownedPkts int + status int32 + mtx sync.Mutex + canGo *sync.Cond + autoInput inputCommon + autoOutput inputCommon +} + +//Nostarted const reflects current process status +const ( + Notstarted int32 = iota + Active + Dormant + SuspSend + SuspRecv + Terminated +) + +//OpenInPort function opens and returns InputConn +func (p *Process) OpenInPort(s string) InputConn { + var in InputConn + var b bool + if len(p.inPorts) == 0 { + panic(p.Name + ": No input ports specified") + } + in, b = p.inPorts[s].(InputConn) + + if !b { + panic(p.Name + " " + s + " InPort not connected, or found other type") + } + return in +} + +//OpenInArrayPort method opens and returns InArrayPort +func (p *Process) OpenInArrayPort(s string) *InArrayPort { + var in *InArrayPort + var b bool + if len(p.inPorts) == 0 { + panic(p.Name + ": No input ports specified") + } + in, b = p.inPorts[s].(*InArrayPort) + //if in == nil { + // panic(p.Name + ": Port Name not found (" + s + ")") + //} + if !b { + panic(p.Name + " " + s + " InArrayPort not connected, or found other type") + } + return in +} + +//OpenOutPort method opens and returns OutputConn +func (p *Process) OpenOutPort(s string) OutputConn { + var out OutputConn + var b bool + if len(p.outPorts) == 0 { + panic(p.Name + " " + s + " OutPort not connected") + } else { + out, b = p.outPorts[s].(*OutPort) + if !b { + panic(p.Name + " " + s + " OutPort not connected, or found other type") + } + out.(*OutPort).portName = s + out.(*OutPort).fullName = p.Name + "." + s + //p.network.conns[out.(*OutPort).fullName] = out.(*OutPort).Conn + } + + return out + +} + +//OpenOutPortOptional function opens and returns OutputConn +func (p *Process) OpenOutPortOptional(s string) OutputConn { + var out OutputConn + var b bool + if len(p.outPorts) == 0 { + out = new(NullOutPort) + p.outPorts[s] = out + } else { + out, b = p.outPorts[s].(*OutPort) + if b { + out.(*OutPort).portName = s + out.(*OutPort).fullName = p.Name + "." + s + //p.network.conns[out.(*OutPort).fullName] = out.(*OutPort).Conn + } else { + out := new(NullOutPort) + p.outPorts[s] = out + } + } + + return out +} + +// not sure it makes sense to allow optional for array ports! + +//OpenOutArrayPort method opens and returns OutArrayPort +func (p *Process) OpenOutArrayPort(s string) *OutArrayPort { + var out *OutArrayPort + var b bool + if len(p.outPorts) == 0 { + out = new(OutArrayPort) + p.outPorts[s] = out + out.portName = s + out.fullName = p.Name + "." + s + out.connected = false + } else { + out, b = p.outPorts[s].(*OutArrayPort) + if !b { + panic(p.Name + " " + s + " OutArrayPort not connected, or found other type") + } + } + + return out +} + +// Send sends a packet to the output connection. + +//Send method emits Packet, returning false when fails to send. +func (p *Process) Send(o OutputConn, pkt *Packet) bool { + //o.SetSender(p) + return o.send(p, pkt) +} + +//Receive method accepts InputConn and returns Packet +// Receive receives from the connection. +// Returns nil, when there's no more data. +func (p *Process) Receive(c InputConn) *Packet { + return c.receive(p) +} + +//Close method closes InputConn +func (p *Process) Close(c InputConn) { + c.Close() +} + +func (p *Process) activate() { + + // + // This function starts a goroutine if it is not started, and signal if it has been + // + + //LockTr(p.canGo, "start test L", p) + //trace(p, "test if notstarted - status: "+strconv.FormatInt(int64(p.status), 10)) + if !atomic.CompareAndSwapInt32(&p.status, Notstarted, Active) { + if atomic.CompareAndSwapInt32(&p.status, Dormant, Active) { + + BdcastTr(p.canGo, "bdcast act", p) + } + //UnlockTr(p.canGo, "start test U", p) + return + } + //UnlockTr(p.canGo, "start test U", p) + + go func() { // Process goroutine + defer p.network.wg.Done() + trace(p, "Starting goroutine "+strconv.FormatUint(getGID(), 10)) + p.Run() // <------- + }() + +} + +func (p *Process) inputState() (bool, bool, bool) { + + LockTr(p.canGo, "IS L", p) + defer UnlockTr(p.canGo, "IS U", p) + + allDrained := true + hasData := false + selfStarting := true + + for { + for _, v := range p.inPorts { + _, b := v.(*InArrayPort) + if b { + for _, w := range v.(*InArrayPort).array { + allDrained = allDrained && w.isDrained() + hasData = hasData || !w.isEmpty() + selfStarting = false + } + } else { + w, b := v.(*InPort) + if b { + allDrained = allDrained && v.isDrained() + hasData = hasData || !w.isEmpty() + selfStarting = false + } + } + } + + if allDrained || hasData || selfStarting { + return allDrained, hasData, selfStarting + } + + atomic.StoreInt32(&p.status, Dormant) + WaitTr(p.canGo, "wait in IS", p) + + } +} + +//Run method initializes and Executes Process +func (p *Process) Run() { + + defer atomic.StoreInt32(&p.status, Terminated) + defer trace(p, " terminated") + trace(p, " started") + + if generateGids { + fmt.Println("Goroutine", p.Name+":", "no.", getGID()) + } + + p.component.Setup(p) + + //if p.selfStarting { + // autoStarting = true + //} + allDrained, hasData, selfStarting := p.inputState() + + canRun := selfStarting || hasData || !allDrained || p.autoInput != nil || p.isMustRun() && allDrained + + for canRun { + + // multiple activations, if necessary! + + trace(p, " activated") + atomic.StoreInt32(&p.status, Active) + + p.component.Execute(p) // single "activation" + + atomic.StoreInt32(&p.status, Dormant) + trace(p, " deactivated") + + if p.ownedPkts > 0 { + panic(p.Name + " deactivated without disposing of all owned packets") + } + + if selfStarting { + break + } + + allDrained, _, _ := p.inputState() + + if allDrained { + if p.autoOutput != nil { + p.autoOutput.Close() + } + break + } + + for _, v := range p.inPorts { + + _, b := v.(*InitializationConnection) + if b { + v.resetForNextExecution() + } + } + } + + for _, v := range p.outPorts { + + if v.IsConnected() { + v.Close() + } + } + +} + +func (p *Process) isMustRun() bool { + _, hasMustRun := p.component.(ComponentWithMustRun) + return hasMustRun +} + +//Create method creates and interface and returns a Packet +// create packet containing anything! +func (p *Process) Create(x interface{}) *Packet { + var pkt *Packet = new(Packet) + pkt.Contents = x + pkt.owner = p + p.ownedPkts++ + if tracepkts { + fmt.Print(p.Name, " Packet created <\n") + fmt.Println(" ", pkt.Contents) + } + return pkt +} + +//CreateBracket method builds a new Packet and returns it +// create bracket +func (p *Process) CreateBracket(pktType int32, s string) *Packet { + var pkt *Packet = new(Packet) + pkt.Contents = s + pkt.PktType = pktType + pkt.owner = p + p.ownedPkts++ + if tracepkts { + fmt.Print(p.Name, " Bracket created: ", [...]string{"", "Open", "Close"}[pkt.PktType]+" Bracket") + fmt.Println(" ", pkt.Contents) + } + return pkt +} + +//Discard method sets Packet to nil +func (p *Process) Discard(pkt *Packet) { + if pkt == nil { + panic("Discarding nil packet") + } + p.ownedPkts-- + if tracepkts { + if pkt.PktType != NormalPacket { + fmt.Print(p.Name, " Bracket discarded: ", [...]string{"", "Open", "Close"}[pkt.PktType]+" Bracket") + fmt.Print(" contents: ", pkt.Contents, "\n") + } else { + fmt.Print(p.Name, " Packet discarded >") + fmt.Println(" ", pkt.Contents) + } + } + pkt = nil +} + +//https://blog.sgmansfield.com/2015/12/goroutine-ids/ + +func getGID() uint64 { + b := make([]byte, 64) + b = b[:runtime.Stack(b, false)] + b = bytes.TrimPrefix(b, []byte("goroutine ")) + b = b[:bytes.IndexByte(b, ' ')] + n, _ := strconv.ParseUint(string(b), 10, 64) + return n +} diff --git a/core/subnet_support.go b/core/subnet_support.go new file mode 100644 index 0000000..6cc982c --- /dev/null +++ b/core/subnet_support.go @@ -0,0 +1,168 @@ +package core + +import ( + //"fmt" + "strings" +) + +type SubIn struct { + //ipt InputConn + iptIP InputConn + out OutputConn + eipt InputConn +} + +type SubInSS struct { + SubIn +} + +func (subIn *SubIn) Setup(p *Process) { + + //SubIn.ipt = p.OpenInPort("IN") + + subIn.out = p.OpenOutPort("OUT") + + subIn.iptIP = p.OpenInPort("NAME") +} + +func (subIn *SubIn) Execute(p *Process) { + + icpkt := p.Receive(subIn.iptIP) + param := icpkt.Contents.(string) + + p.Discard(icpkt) + + mother := p.network.mother + subIn.eipt = mother.OpenInPort(param) + if !strings.Contains(subIn.eipt.(*InPort).portName, ".") { + subIn.eipt.(*InPort).portName = mother.Name + ":" + subIn.eipt.(*InPort).portName + } + + for { + //var pkt = mother.Receive(subIn.eipt) + var pkt = subIn.eipt.receive(p) + if pkt == nil { + //trace(p, " Received end of stream") + break + } + + pkt.owner = p + //fmt.Println(pkt.Contents) + p.Send(subIn.out, pkt) + + } + +} + +func (subIn *SubInSS) Execute(p *Process) { + + icpkt := p.Receive(subIn.iptIP) + param := icpkt.Contents.(string) + + p.Discard(icpkt) + mother := p.network.mother + subIn.eipt = mother.OpenInPort(param) + if !strings.Contains(subIn.eipt.(*InPort).portName, ":") { + subIn.eipt.(*InPort).portName = mother.Name + ":" + subIn.eipt.(*InPort).portName + } + + for { + //var pkt = mother.Receive(subIn.eipt) + var pkt = subIn.eipt.receive(p) + if pkt == nil { + //trace(p, " Received end of stream") + break + } + + if pkt.PktType == OpenBracket { + p.Discard(pkt) + } else { + if pkt.PktType != CloseBracket { + pkt.owner = p + //fmt.Println(pkt.Contents) + p.Send(subIn.out, pkt) + } else { + p.Discard(pkt) + //subIn.out.Close() + return + } + } + } +} + +type SubOut struct { + ipt InputConn + iptIP InputConn + eopt OutputConn +} + +type SubOutSS struct { + SubOut +} + +func (subOut *SubOut) Setup(p *Process) { + + subOut.ipt = p.OpenInPort("IN") + + subOut.iptIP = p.OpenInPort("NAME") +} + +//func (SubOut) MustRun() {} + +func (subOut *SubOut) Execute(p *Process) { + + icpkt := p.Receive(subOut.iptIP) + param := icpkt.Contents.(string) + + p.Discard(icpkt) + mother := p.network.mother + subOut.eopt = mother.OpenOutPort(param) + if !strings.Contains(subOut.eopt.(*OutPort).portName, ":") { + subOut.eopt.(*OutPort).portName = mother.Name + ":" + subOut.eopt.(*OutPort).portName + } + + for { + + pkt := subOut.ipt.receive(p) + if pkt == nil { + //trace(p, " Received end of stream") + break + } + pkt.owner = p + + //fmt.Println(pkt.Contents) + + subOut.eopt.send(p, pkt) + } +} +func (subOut *SubOutSS) Execute(p *Process) { + + icpkt := p.Receive(subOut.iptIP) + param := icpkt.Contents.(string) + + p.Discard(icpkt) + mother := p.network.mother + subOut.eopt = mother.OpenOutPort(param) + if !strings.Contains(subOut.eopt.(*OutPort).portName, ":") { + subOut.eopt.(*OutPort).portName = mother.Name + ":" + subOut.eopt.(*OutPort).portName + } + + pkt := p.CreateBracket(OpenBracket, "") + subOut.eopt.send(p, pkt) + + for { + pkt = subOut.ipt.receive(p) + if pkt == nil { + //trace(p, " Received end of stream") + break + } + pkt.owner = p + + //fmt.Println(pkt.Contents) + + subOut.eopt.send(p, pkt) + + } + pkt = p.CreateBracket(CloseBracket, "") + subOut.eopt.send(p, pkt) +} diff --git a/diagrams/Esses.png b/diagrams/Esses.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4772daf7879485064da1f5e6ea052cb3b423d4 GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0vp^zChf}!2~4TI~kRM6k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5?O(K&H|6fVg?4G5)fv*mnL7qz`%6V)5S5QBJS;+#In^20&bJH&zbPl=C0q_ zvJ&e@WtSX}2Vc2%L)m!3%kuwI3T`!HVaF5C3GFREb5-t_*5=u|&R6lbnX1~UbZz;e zIZkq$SZ%gm@chxSoM+*s%d5U73HV1JxGXl)_Nt#?2gqFRid#%DE6&WzD(41?YBt|G zSjGA%lRMY{e(9ZAJFg#ke6e(%b;<(P#g6yQrao3IUvX<*y@H|CyxQUe1&2(X<~{nn zZT0)_Y587qb^LycuV2c4w~8y*JL8>qzK8M6?`=hkjwOe*W@yW$EXi6PS7&Kl>h~r0 zf7|Qgg_hCps!l0d)2b(u#NH>wRT2dw1`ewn}Z; zhE)d_pKDo{%F>!A!u28M?M9f)Z_nSU-W<2lc|{kH$r%bYB> zd+lq!-f`W2{haGYU-tFEj80{RukX%xpUW8=^6%5?1HYf%*65z37rODGUcYskS?K%g zrIAr3HvCFu((xzu32_MT`7dz7f#>(B3;oA8iu128G74V(*!J!J!v!l}&$4#g;uikj z`uf#M*W52muUQ09q6-monhw+c=NL7DVshn8J-@TsS93mw>@z>M$JgtaY^oA4IjHL{ zd^po~M#~y?$!Q9nOa9m1^fvtK>8 + + + + 277 411 2 B 92 64 Sender2 sender.go C:/Users/Paul/Documents/GitHub/gofbp/components/testrtn/sender.go falsefalsefalse + + 555 316 3 B 92 64 Write + To +Console writetoconsole.go C:/Users/Paul/Documents/GitHub/gofbp/components/testrtn/writetoconsole.go falsefalsefalse + + 277 235 4 B 92 64 Sender1 sender.go C:/Users/Paul/Documents/GitHub/gofbp/components/testrtn/sender.go falsefalsefalse + + 100 234 5 I 52 30 15 falsefalsefalse + + 102 406 6 I 52 30 10 falsefalsefalse + + + 323 232 509 312 4 3 4 falseOUTIN0 424 232 + 424 312 + + 126 234 231 233 5 4 7 falseCOUNT0 + 128 403 231 402 6 2 8 falseCOUNT0 + 323 409 431 314 2 4 12 trueOUT2 430 409 + + \ No newline at end of file diff --git a/diagrams/Subnet-diagram.drw b/diagrams/Subnet-diagram.drw index 8752022..aab843b 100644 --- a/diagrams/Subnet-diagram.drw +++ b/diagrams/Subnet-diagram.drw @@ -4,28 +4,19 @@ xsi:noNamespaceSchemaLocation="https://github.com/jpaulm/drawfbp/blob/master/lib 116 192 1 B 92 64 Substream - Sender falsefalsefalse + Sender sender.go C:/Users/Paul/Documents/GitHub/gofbp/components/testrtn/sender.go falsefalsefalse 375 192 2 B 92 64 Run - Subnet falsefalsefalse + Subnet C:/Users/Paul/Documents/GitHub/gofbp/diagrams/Subnet1.drw subnet1.go C:/Users/Paul/Documents/GitHub/gofbp/subnet_tests/subnets/subnet1.go falsefalsetrue 645 192 3 B 92 64 Write To -Console falsefalsefalse +Console writetoconsole.go C:/Users/Paul/Documents/GitHub/gofbp/components/testrtn/writetoconsole.go falsefalsefalse - 179 368 4 B 92 64 SubInSS falsefalsefalse - - 375 368 5 B 92 64 Write To -Console falsefalsefalse - - 578 368 6 B 92 64 SubOutSS falsefalsefalse - - 119 64 8 I 68 30 40 falsefalsefalse + 119 64 8 I 68 30 40 falsefalsefalse 162 190 329 190 1 2 1 falseOUTIN0 421 191 599 191 2 3 2 falseOUTIN0 - 225 365 329 365 4 5 3 falseOUTIN0 - 421 366 532 366 5 6 4 falseOUTIN0 - 114 79 114 160 8 1 6 falseIN0 + 114 79 114 160 8 1 6 falseCOUNT0 \ No newline at end of file diff --git a/diagrams/Subnet-diagram.png b/diagrams/Subnet-diagram.png index 2b711544fe31aba875c0af1ef2b2d0eaf639db47..d9d475e49e30bf9b78677a64bc09376b3e465b64 100644 GIT binary patch literal 12198 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 literal 14525 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 g|MYhFsJKW5t9et(&l2;( + + + + 365 160 9 B 92 64 Write + To +Console writetoconsnl.go C:/Users/Paul/Documents/GitHub/gofbp/components/testrtn/writetoconsnl.go falsefalsefalse + + 111 154 10 C 36 28 IN truefalsefalsefalse + + 632 156 13 D 36 28 OUT truefalsefalsefalse + + + 129 156 319 156 10 9 7 falseOUTIN0 + 411 159 614 158 9 13 11 falseOUTIN0 + \ No newline at end of file diff --git a/go.mod b/go.mod index dfc619e..8f277be 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,7 @@ module github.com/jpaulm/gofbp go 1.17 + +replace github.com/jpaulm/gofbp/core => ./ + +require github.com/gorilla/websocket v1.4.2 diff --git a/go.sum b/go.sum index e69de29..85efffd 100644 --- a/go.sum +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/merge.go b/merge.go new file mode 100644 index 0000000..7e58350 --- /dev/null +++ b/merge.go @@ -0,0 +1,25 @@ +package main //change package name, or delete statement, if desired + +// Network generated by DrawFBP + +import ( + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +func main() { + params, err := core.LoadXMLParams("params.xml") + if err != nil { + panic(err) + } + net := core.NewNetwork("Merge") + net.SetParams(params) + sender2 := net.NewProc("Sender2", &testrtn.Sender{}) + write___to_console := net.NewProc("Write___To_Console", &testrtn.WriteToConsole{}) + sender1 := net.NewProc("Sender1", &testrtn.Sender{}) + net.Connect(sender1, "OUT", write___to_console, "IN", 6) + net.Initialize("15", sender1, "COUNT") + net.Initialize("10", sender2, "COUNT") + net.Connect(sender2, "OUT", write___to_console, "IN", 6) + net.Run() +} diff --git a/params.xml b/params.xml new file mode 100644 index 0000000..80244b7 --- /dev/null +++ b/params.xml @@ -0,0 +1,7 @@ + + + true + false + true + false + diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..1eb0985 --- /dev/null +++ b/renovate.json @@ -0,0 +1,9 @@ +{ + "extends": [ + "config:base", ":disableDependencyDashboard" + ] , + "automerge": true, + "major": { + "automerge": false + } +} diff --git a/scripts/chat2.html b/scripts/chat2.html new file mode 100644 index 0000000..27a263a --- /dev/null +++ b/scripts/chat2.html @@ -0,0 +1,169 @@ + + + +WebSocket Example - Chat2 + +// + + + + +

WebSockets Example - Chat2

+ +

+ Command: +

+

+ Data: +

+

+ Status: +

+ + +
    +
+ + + + diff --git a/settings.json b/settings.json new file mode 100644 index 0000000..63e4199 --- /dev/null +++ b/settings.json @@ -0,0 +1,4 @@ +{ +"go.testFlags": ["-race"] + + } \ No newline at end of file diff --git a/subnet_tests/subnet-diagram.go b/subnet_tests/subnet-diagram.go new file mode 100644 index 0000000..175453c --- /dev/null +++ b/subnet_tests/subnet-diagram.go @@ -0,0 +1,20 @@ +package main //change package name, or delete statement, if desired + +// Network generated by DrawFBP + +import ( + "github.com/jpaulm/gofbp/components/subnets" + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +func main() { + net := core.NewNetwork("Subnet-diagram") + substream___sender := net.NewProc("Substream___Sender", &testrtn.Sender{}) + run___subnet := net.NewProc("Run___Subnet", &subnets.Subnet1{}) + write___to_console := net.NewProc("Write___To_Console", &testrtn.WriteToConsole{}) + net.Connect(substream___sender, "OUT", run___subnet, "IN", 1) + net.Connect(run___subnet, "OUT", write___to_console, "IN", 1) + net.Initialize("40", substream___sender, "COUNT") + net.Run() +} diff --git a/subnet_tests/subnets/subnet1.go b/subnet_tests/subnets/subnet1.go new file mode 100644 index 0000000..9572c1d --- /dev/null +++ b/subnet_tests/subnets/subnet1.go @@ -0,0 +1,26 @@ +package subnets //change package name, or delete statement, if desired + +// Network generated by DrawFBP + +import ( + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +type Subnet1 struct { +} + +func (subnet *Subnet1) Setup(p *core.Process) { +} + +func (subnet *Subnet1) Execute(p *core.Process) { + net := core.NewSubnet("Subnet1", p) + write____to_console := net.NewProc("Write____To_Console", &testrtn.WriteToConsNL{}) + subin1 := net.NewProc("SUBIN1", &core.SubInSS{}) + net.Initialize("IN", subin1, "NAME") + subout2 := net.NewProc("SUBOUT2", &core.SubOutSS{}) + net.Initialize("OUT", subout2, "NAME") + net.Connect(subin1, "OUT", write____to_console, "IN", 6) + net.Connect(write____to_console, "OUT", subout2, "IN", 6) + net.Run() +} diff --git a/testing/force_deadlock_test.go b/testing/force_deadlock_test.go new file mode 100644 index 0000000..706f107 --- /dev/null +++ b/testing/force_deadlock_test.go @@ -0,0 +1,39 @@ +package testing + +import ( + "context" + "fmt" + "os/exec" + "path/filepath" + "strings" + "testing" + "time" +) + +func TestForceDeadlock(t *testing.T) { + exe := filepath.Join(t.TempDir(), "deadlock.exe") + + compile := exec.Command("go", "build", "-o", exe, "-v", "./testdata/deadlock") + data, err := compile.CombinedOutput() + s := string(data) + t.Log(s) + if err != nil { + t.Fatal(err) + } + + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second) + defer cancel() + + run := exec.CommandContext(ctx, exe) + out, err := run.CombinedOutput() + s = string(out) + t.Log(s) + fmt.Println(s) + if !strings.Contains(s, "deadlock") && + !strings.Contains(s, "Deadlock") { + t.Error("expected output to mention a deadlock") + } + if err == nil { + t.Error("expected process to fail") + } +} diff --git a/testing/gofbp_test.go b/testing/gofbp_test.go new file mode 100644 index 0000000..5474be3 --- /dev/null +++ b/testing/gofbp_test.go @@ -0,0 +1,139 @@ +package testing + +import ( + "testing" + + "path/filepath" + + "github.com/jpaulm/gofbp/components/io" + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +func TestMerge(t *testing.T) { + net := core.NewNetwork("Merge") + + proc1 := net.NewProc("Sender1", &testrtn.Sender{}) + proc2 := net.NewProc("Sender2", &testrtn.Sender{}) + + proc3 := net.NewProc("WriteToConsole", &testrtn.WriteToConsole{}) + + net.Initialize("15", proc1, "COUNT") + net.Initialize("10", proc2, "COUNT") + net.Connect(proc1, "OUT", proc3, "IN", 6) + net.Connect(proc2, "OUT", proc3, "IN", 6) + + net.Run() +} + +func TestConcat(t *testing.T) { + net := core.NewNetwork("Concat") + + proc1 := net.NewProc("Sender", &testrtn.Sender{}) + + proc1a := net.NewProc("Sender2", &testrtn.Sender{}) + + proc2 := net.NewProc("ConcatStr", &testrtn.ConcatStr{}) + + proc3 := net.NewProc("WriteToConsole", &testrtn.WriteToConsole{}) + + net.Initialize("15", proc1, "COUNT") + net.Initialize("10", proc1a, "COUNT") + net.Connect(proc1, "OUT", proc2, "IN[0]", 6) + net.Connect(proc1a, "OUT", proc2, "IN[1]", 6) + net.Connect(proc2, "OUT", proc3, "IN", 6) + + net.Run() +} + +func TestRRDist(t *testing.T) { + net := core.NewNetwork("RRDist") + + proc1 := net.NewProc("Sender", &testrtn.Sender{}) + + proc2 := net.NewProc("RoundRobinSender", &testrtn.RoundRobinSender{}) + + proc3a := net.NewProc("WriteToConsole", &testrtn.WriteToConsole{}) + proc3b := net.NewProc("Receiver1", &testrtn.Receiver{}) + proc3c := net.NewProc("Receiver2", &testrtn.Receiver{}) + + net.Initialize("15", proc1, "COUNT") + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "OUT[0]", proc3a, "IN", 6) + net.Connect(proc2, "OUT[1]", proc3b, "IN", 6) + net.Connect(proc2, "OUT[2]", proc3c, "IN", 6) + + net.Run() +} + +func TestCopyFile(t *testing.T) { + net := core.NewNetwork("CopyFile") + + proc1 := net.NewProc("ReadFile", &io.ReadFile{}) + + proc2 := net.NewProc("WriteFile", &io.WriteFile{}) + + net.Initialize(filepath.Join("testdata", "testdata.txt"), proc1, "FILENAME") + net.Initialize(filepath.Join("testdata", "copy-file.tmp"), proc2, "FILENAME") + net.Connect(proc1, "OUT", proc2, "IN", 6) + + net.Run() +} + +func TestDoSelect1(t *testing.T) { + + // port REJ from proc2 is connected + + net := core.NewNetwork("DoSelect1") + + proc1 := net.NewProc("ReadFile", &io.ReadFile{}) + proc2 := net.NewProc("Select", &testrtn.Selector{}) + proc3a := net.NewProc("WriteFile", &io.WriteFile{}) + proc3b := net.NewProc("WriteToConsole", &testrtn.WriteToConsole{}) + + net.Initialize(filepath.Join("testdata", "testdata.txt"), proc1, "FILENAME") + net.Initialize("X", proc2, "PARAM") + net.Initialize(filepath.Join("testdata", "do-select.tmp"), proc3a, "FILENAME") + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "ACC", proc3a, "IN", 6) + net.Connect(proc2, "REJ", proc3b, "IN", 6) + + net.Run() +} + +func TestDoSelect2(t *testing.T) { + + // port REJ from proc2 is NOT connected + + net := core.NewNetwork("DoSelect2") + + proc1 := net.NewProc("ReadFile", &io.ReadFile{}) + proc2 := net.NewProc("Select", &testrtn.Selector{}) + proc3a := net.NewProc("WriteFile", &io.WriteFile{}) + //proc3b := net.NewProc("WriteToConsole", &testrtn.WriteToConsole{}) + + net.Initialize(filepath.Join("testdata", "testdata.txt"), proc1, "FILENAME") + net.Initialize("X", proc2, "PARAM") + net.Initialize(filepath.Join("testdata", "do-select.tmp"), proc3a, "FILENAME") + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "ACC", proc3a, "IN", 6) + //net.Connect(proc2, "REJ", proc3b, "IN", 6) + + net.Run() +} +func TestWriteToConsUsingNL(t *testing.T) { + + net := core.NewNetwork("TestWriteToConsUsingNL") + + proc1 := net.NewProc("Sender1", &testrtn.Sender{}) + proc2 := net.NewProc("Sender2", &testrtn.Sender{}) + + proc3 := net.NewProc("WriteToConsNL", &testrtn.WriteToConsNL{}) + + net.Initialize("15", proc1, "COUNT") + net.Initialize("15", proc2, "COUNT") + net.Connect(proc1, "OUT", proc3, "IN", 6) + net.Connect(proc2, "OUT", proc3, "IN", 6) + + net.Run() +} diff --git a/testing/numbers.txt b/testing/numbers.txt new file mode 100644 index 0000000..e29b1db --- /dev/null +++ b/testing/numbers.txt @@ -0,0 +1,40 @@ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 diff --git a/testing/testdata/deadlock/main.go b/testing/testdata/deadlock/main.go new file mode 100644 index 0000000..2d8bb21 --- /dev/null +++ b/testing/testdata/deadlock/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +func main() { + net := core.NewNetwork("ForceDeadlock") + + proc1 := net.NewProc("Sender", &testrtn.Sender{}) + proc2 := net.NewProc("Counter", &testrtn.Counter{}) + proc3 := net.NewProc("Concat", &testrtn.ConcatStr{}) + + proc4 := net.NewProc("WriteToConsole", &testrtn.WriteToConsole{}) + + net.Initialize("15", proc1, "COUNT") + + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "OUT", proc3, "IN[1]", 6) + net.Connect(proc2, "COUNT", proc3, "IN[0]", 6) + net.Connect(proc3, "OUT", proc4, "IN", 6) + + net.Run() +} diff --git a/testing/testdata/infqueue b/testing/testdata/infqueue new file mode 100644 index 0000000..df23bfc --- /dev/null +++ b/testing/testdata/infqueue @@ -0,0 +1,40 @@ +IP - # 0 +IP - # 1 +IP - # 2 +IP - # 3 +IP - # 4 +IP - # 5 +IP - # 6 +IP - # 7 +IP - # 8 +IP - # 9 +IP - # 10 +IP - # 11 +IP - # 12 +IP - # 13 +IP - # 14 +IP - # 15 +IP - # 16 +IP - # 17 +IP - # 18 +IP - # 19 +IP - # 20 +IP - # 21 +IP - # 22 +IP - # 23 +IP - # 24 +IP - # 25 +IP - # 26 +IP - # 27 +IP - # 28 +IP - # 29 +IP - # 30 +IP - # 31 +IP - # 32 +IP - # 33 +IP - # 34 +IP - # 35 +IP - # 36 +IP - # 37 +IP - # 38 +IP - # 39 diff --git a/testing/testdata/testdata.txt b/testing/testdata/testdata.txt new file mode 100644 index 0000000..c7ff85e --- /dev/null +++ b/testing/testdata/testdata.txt @@ -0,0 +1,6 @@ +This repo holds the beginning of an FBP implementation in Go + +Features include: + +- delayed start of goroutines (FBP processes), unless `MustRun` attribute is specified or the process has no non-IIP inputs (same as JavaFBP delayed start feature) +- optional output ports - see https://github.com/jpaulm/gofbp/blob/master/components/testrtn/writetoconsole.go diff --git a/testing/testinfqueueasmain_test.go b/testing/testinfqueueasmain_test.go new file mode 100644 index 0000000..0cf9d37 --- /dev/null +++ b/testing/testinfqueueasmain_test.go @@ -0,0 +1,26 @@ +package testing + +import ( + "testing" + + "github.com/jpaulm/gofbp/components/io" + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +func TestInfQueueAsMain(t *testing.T) { + net := core.NewNetwork("InfQueueAsMain") + + proc1 := net.NewProc("Sender", &testrtn.Sender{}) + proc2 := net.NewProc("WriteFile", &io.WriteFile{}) + proc3 := net.NewProc("ReadFile", &io.ReadFile{}) + proc4 := net.NewProc("WriteToConsole", &testrtn.WriteToConsole{}) + + net.Initialize("40", proc1, "COUNT") + net.Initialize("testdata/infqueue", proc2, "FILENAME") + net.Initialize("testdata/infqueue", proc3, "FILENAME") + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "*", proc3, "*", 6) + net.Connect(proc3, "OUT", proc4, "IN", 6) + net.Run() +} diff --git a/testing/testintsender_test.go b/testing/testintsender_test.go new file mode 100644 index 0000000..b3fe0d6 --- /dev/null +++ b/testing/testintsender_test.go @@ -0,0 +1,27 @@ +package testing + +import ( + "testing" + + "github.com/jpaulm/gofbp/components/io" + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +func TestIntSender(t *testing.T) { + params, err := core.LoadXMLParams("../params.xml") + if err != nil { + panic(err) + } + net := core.NewNetwork("TestIntSender") + net.SetParams(params) + proc1 := net.NewProc("IntSender", &testrtn.IntSender{}) + proc2 := net.NewProc("WriteToFile", &io.WriteFile{}) + proc3 := net.NewProc("WriteToConsole", &testrtn.WriteToConsole{}) + + net.Initialize("40", proc1, "COUNT") + net.Initialize("numbers.txt", proc2, "FILENAME") + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "OUT", proc3, "IN", 6) + net.Run() +} diff --git a/testing/testloadbal_test.go b/testing/testloadbal_test.go new file mode 100644 index 0000000..301aafc --- /dev/null +++ b/testing/testloadbal_test.go @@ -0,0 +1,28 @@ +package testing + +import ( + "testing" + + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +func TestLoadBal(t *testing.T) { + net := core.NewNetwork("TestLoadBal") + + sender := net.NewProc("Sender", &testrtn.Sender{}) + + proc2 := net.NewProc("LoadBalance", &testrtn.LoadBalance{}) + + proc3a := net.NewProc("Receiver0", &testrtn.Receiver{}) + proc3b := net.NewProc("Receiver1", &testrtn.DelayedReceiver{}) + proc3c := net.NewProc("Receiver2", &testrtn.DelayedReceiver{}) + + net.Initialize("40", sender, "COUNT") + net.Connect(sender, "OUT", proc2, "IN", 6) + net.Connect(proc2, "OUT[0]", proc3a, "IN", 6) + net.Connect(proc2, "OUT[1]", proc3b, "IN", 6) + net.Connect(proc2, "OUT[2]", proc3c, "IN", 6) + + net.Run() +} diff --git a/testing/testsubnet1_test.go b/testing/testsubnet1_test.go new file mode 100644 index 0000000..fad21e3 --- /dev/null +++ b/testing/testsubnet1_test.go @@ -0,0 +1,25 @@ +package testing + +import ( + "testing" + + "github.com/jpaulm/gofbp/components/subnets" + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +func TestSubnet1(t *testing.T) { + net := core.NewNetwork("TestSubnet1") + + proc1 := net.NewProc("Sender1", &testrtn.Sender{}) + + proc2 := net.NewProc("RunSubnet", &subnets.Subnet1{}) + + proc3 := net.NewProc("WriteToConsole2", &testrtn.WriteToConsole{}) + + net.Initialize("15", proc1, "COUNT") + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "OUT", proc3, "IN", 6) + + net.Run() +} diff --git a/testing/testsubnet2_test.go b/testing/testsubnet2_test.go new file mode 100644 index 0000000..c72a67f --- /dev/null +++ b/testing/testsubnet2_test.go @@ -0,0 +1,27 @@ +package testing + +// Thiis differs from TestSubnet1 because it uses SSSubnet1 (SubstreamSenstive) instead of simple Subnet1... + +import ( + "testing" + + "github.com/jpaulm/gofbp/components/subnets" + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +func TestSubnet2(t *testing.T) { + net := core.NewNetwork("TestSubnet2") + + proc1 := net.NewProc("SubstreamSender", &testrtn.SubstreamSender{}) // sends multiple substreams of varying lengths + + proc2 := net.NewProc("RunSSSubnet", &subnets.SSSubnet1{}) + + proc3 := net.NewProc("WriteToConsole2", &testrtn.WriteToConsole{}) + + net.Initialize("20", proc1, "COUNT") + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "OUT", proc3, "IN", 6) + + net.Run() +} diff --git a/testing/testsubnet3_test.go b/testing/testsubnet3_test.go new file mode 100644 index 0000000..2b2e1c1 --- /dev/null +++ b/testing/testsubnet3_test.go @@ -0,0 +1,29 @@ +package testing + +// Thiis differs from TestSubnet1 because it uses SSSubnet1 (SubstreamSenstive) instead of simple Subnet1... + +import ( + "testing" + + "github.com/jpaulm/gofbp/components/subnets" + "github.com/jpaulm/gofbp/components/testrtn" + "github.com/jpaulm/gofbp/core" +) + +func TestSubnet3(t *testing.T) { + net := core.NewNetwork("TestSubnet3") + + proc1 := net.NewProc("SubstreamSender", &testrtn.SubstreamSender{}) // sends multiple substreams of varying lengths + proc1a := net.NewProc("WriteToConsole3", &testrtn.WriteToConsole{}) + + proc2 := net.NewProc("RunSSSubnet", &subnets.SSSubnet2{}) + + proc3 := net.NewProc("WriteToConsole2", &testrtn.WriteToConsole{}) + + net.Initialize("20", proc1, "COUNT") + net.Connect(proc1, "OUT", proc1a, "IN", 6) + net.Connect(proc1a, "OUT", proc2, "IN", 6) + net.Connect(proc2, "OUT", proc3, "IN", 6) + + net.Run() +} diff --git a/testing/testwebsocket_test.go b/testing/testwebsocket_test.go new file mode 100644 index 0000000..c927185 --- /dev/null +++ b/testing/testwebsocket_test.go @@ -0,0 +1,26 @@ +package testing + +import ( + "testing" + + "github.com/jpaulm/gofbp/components/websocket" + "github.com/jpaulm/gofbp/core" +) + +func TestWebSocket(t *testing.T) { + params, err := core.LoadXMLParams("../params.xml") + if err != nil { + panic(err) + } + path := "localhost:8080" + + net := core.NewNetwork("TestWebSocket") + net.SetParams(params) + proc1 := net.NewProc("WSRequest", &websocket.WSRequest{}) + proc2 := net.NewProc("AnsReq", &websocket.WSAnsReq{}) + proc3 := net.NewProc("WSRespond", &websocket.WSRespond{}) + net.Initialize(path, proc1, "ADDR") + net.Connect(proc1, "OUT", proc2, "IN", 6) + net.Connect(proc2, "OUT", proc3, "IN", 6) + net.Run() +} From 8d0b7f2ea19569f6e06f76799b967bf99e16631d Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 31 Jan 2022 10:31:06 -0500 Subject: [PATCH 19/25] clone README and .gitignore --- .gitignore | 3 +-- README.md | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 257114d..93e76c3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,4 @@ qs_*.* bak bin/ -*.exe -TWY* +*~ \ No newline at end of file diff --git a/README.md b/README.md index 3492832..3a606d8 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ Format of the tracing definitions file: false false +false (traces packet creates, createbrackets and discards) true ``` From 498eb0b1f194e41c524ee3f91e531611e5a860ef Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 31 Jan 2022 10:35:21 -0500 Subject: [PATCH 20/25] clone README and .gitignore --- outport.go | 57 ++++++++-------- ws_request.go | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++ ws_respond.go | 55 +++++++++++++++ 3 files changed, 265 insertions(+), 27 deletions(-) create mode 100644 ws_request.go create mode 100644 ws_respond.go diff --git a/outport.go b/outport.go index 19d4f8d..6be612d 100644 --- a/outport.go +++ b/outport.go @@ -1,13 +1,14 @@ -package gofbp +package core import ( + "fmt" "sync/atomic" ) type OutPort struct { portName string fullName string - Conn *InPort + conn *InPort connected bool sender *Process network *Network @@ -25,35 +26,39 @@ func (o *OutPort) send(p *Process, pkt *Packet) bool { panic("Sending packet not owned by this process") } - LockTr(o.Conn.condNF, "send L", p) - defer UnlockTr(o.Conn.condNF, "send U", p) + LockTr(o.conn.condNF, "send L", p) + defer UnlockTr(o.conn.condNF, "send U", p) - if pkt.PktType != Normal { - trace(p, " Sending to "+o.portName+" >", pkt.Contents.(string), - [...]string{"", "Open", "Close"}[pkt.PktType]) + if pkt.PktType != NormalPacket { + trace(p, " Sending to "+o.portName+" > "+ + [...]string{"", "Open", "Close"}[pkt.PktType]+" Bracket") + if tracing { + fmt.Print(" contents: ", pkt.Contents, "\n") + } } else { - trace(p, " Sending to "+o.portName+" >", pkt.Contents.(string)) + trace(p, " Sending to "+o.portName+" > ") + if tracing { + fmt.Print(" ", pkt.Contents, "\n") + } } - for o.Conn.isFull() { // while connection is full + for o.conn.isFull() { // while connection is full atomic.StoreInt32(&p.status, SuspSend) - WaitTr(o.Conn.condNF, "wait in send", p) + WaitTr(o.conn.condNF, "wait in send", p) atomic.StoreInt32(&p.status, Active) } trace(p, " Sent to "+o.portName) - trace(o.Conn.downStrProc, "act from send") - //LockTr(o.Conn.downStrProc.canGo, "start test L", o.Conn.downStrProc) - o.Conn.downStrProc.activate() - //UnlockTr(o.Conn.downStrProc.canGo, "start test U", o.Conn.downStrProc) + trace(o.conn.downStrProc, "act from send") + o.conn.downStrProc.activate() - o.Conn.pktArray[o.Conn.is] = pkt - o.Conn.is = (o.Conn.is + 1) % len(o.Conn.pktArray) + o.conn.pktArray[o.conn.is] = pkt + o.conn.is = (o.conn.is + 1) % len(o.conn.pktArray) //pkt.owner = nil p.ownedPkts-- pkt = nil - BdcastTr(o.Conn.condNE, "bdcast sent", p) + BdcastTr(o.conn.condNE, "bdcast sent", p) return true } @@ -75,17 +80,15 @@ func (o *OutPort) ArrayLength() int { } func (o *OutPort) Close() { - LockTr(o.Conn.condNF, "close L", o.sender) - defer UnlockTr(o.Conn.condNF, "close U", o.sender) + LockTr(o.conn.condNF, "close L", o.sender) + defer UnlockTr(o.conn.condNF, "close U", o.sender) trace(o.sender, " Close "+o.portName) - o.Conn.decUpstream() - if o.Conn.upStrmCnt == 0 { - o.Conn.closed = true - BdcastTr(o.Conn.condNE, "bdcast out", o.sender) - trace(o.Conn.downStrProc, "act from close") - //LockTr(o.Conn.downStrProc.canGo, "start test L", o.Conn.downStrProc) - o.Conn.downStrProc.activate() - //UnlockTr(o.Conn.downStrProc.canGo, "start test U", o.Conn.downStrProc) + o.conn.decUpstream() + if o.conn.upStrmCnt == 0 { + o.conn.closed = true + BdcastTr(o.conn.condNE, "bdcast out", o.sender) + trace(o.conn.downStrProc, "activated from close") + o.conn.downStrProc.activate() } } diff --git a/ws_request.go b/ws_request.go new file mode 100644 index 0000000..943721a --- /dev/null +++ b/ws_request.go @@ -0,0 +1,180 @@ +// https://github.com/gorilla/websocket/blob/master/examples/echo/server.go + +// try https://stackoverflow.com/questions/39320025/how-to-stop-http-listenandserve + +package websocket + +import ( + "context" + "fmt" + "log" + "net/http" + "sync" + "time" + + "github.com/gorilla/websocket" + "github.com/jpaulm/gofbp/core" +) + +//var data_map map[*websocket.Conn][]*core.Packet + +type WSRequest struct { + ipt core.InputConn + opt core.OutputConn +} + +func (wsrequest *WSRequest) Setup(p *core.Process) { + wsrequest.ipt = p.OpenInPort("ADDR") + wsrequest.opt = p.OpenOutPort("OUT") +} + +var upgrader = websocket.Upgrader{} +var proc *core.Process + +func (wsrequest *WSRequest) Execute(p *core.Process) { + icpkt := p.Receive(wsrequest.ipt) + path := icpkt.Contents.(string) + p.Discard(icpkt) + p.Close(wsrequest.ipt) + proc = p + //addr = flag.String("addr", path, "http service address") + //flag.Parse() + log.SetFlags(0) + + log.Printf("main: starting HTTP server") + + httpServerExitDone := &sync.WaitGroup{} + + httpServerExitDone.Add(1) + srv := startHttpServer(httpServerExitDone, path) + + log.Printf("serving for 20 seconds") + + time.Sleep(20 * time.Second) + + log.Printf("stopping HTTP server") + + // now close the server gracefully ("shutdown") + // timeout could be given with a proper context + // (in real world you shouldn't use TODO()). ???????? + if err := srv.Shutdown(context.TODO()); err != nil { + panic(err) // failure/timeout shutting down the server gracefully + } + + // wait for goroutine started in startHttpServer() to stop + httpServerExitDone.Wait() + + log.Printf("done. exiting") + //http.HandleFunc("/", serveHome) + //http.HandleFunc("/ws", serveWs) + + //err := http.ListenAndServe(*addr, nil) + //log.Fatal(err) +} + +func startHttpServer(wg *sync.WaitGroup, path string) *http.Server { + //srv := &http.Server{Addr: ":8080"} + srv := &http.Server{Addr: path} + + //http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + http.HandleFunc("/", serveWs) + + go func() { + defer wg.Done() // let main know we are done cleaning up + + // always returns error. ErrServerClosed on graceful close + if err := srv.ListenAndServe(); err != http.ErrServerClosed { + // unexpected error. port in use? + log.Fatalf("ListenAndServe(): %v", err) + } + }() + + // returning reference so caller can call Shutdown() + return srv +} + +func serveWs(w http.ResponseWriter, r *http.Request) { + fmt.Println("upgrade") + upgrader.CheckOrigin = func(r *http.Request) bool { return true } + c, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Print("upgrade:", err) + return + } + //conn = *c + defer c.Close() + + //if data_map == nil { + // data_map = make(map[*websocket.Conn][]*core.Packet) + //} + + var pkt_list []*core.Packet + var pkt *core.Packet + + opt := proc.OpenOutPort("OUT") + + for { + _, message, err := c.ReadMessage() + if err != nil { + log.Println("read:", err) + break + } + log.Printf("recv: %s", message) + + x := string(message) + + if x == "@{" { + + pkt_list = make([]*core.Packet, 0) + //data_map[c] = pkt_list + continue + } + + if x == "@}" { + + // send out "connection" IPs, then IPs stored in pkt_list ... surrounded by bracket IPs + + pkt = proc.CreateBracket(core.OpenBracket, "") + proc.Send(opt, pkt) + + pkt = proc.Create(c) // connection + proc.Send(opt, pkt) + + for _, pkt := range pkt_list { + proc.Send(opt, pkt) + } + + //data_map[c] = nil + pkt = proc.CreateBracket(core.CloseBracket, "") + proc.Send(opt, pkt) + continue + } + + if x == "@kill" { + //time.Sleep(10 * time.Second) + //pkt = proc.Create(x) + //proc.Send(opt, pkt) + c.Close() + //break + continue + } + + pkt = proc.Create(x) + pkt_list = append(pkt_list, pkt) + //data_map[c] = pkt_list + } +} + +/* +func serveHome(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/" { + http.Error(w, "Not found", http.StatusNotFound) + return + } + if r.Method != http.MethodGet { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + http.ServeFile(w, r, "home.html") +} +*/ diff --git a/ws_respond.go b/ws_respond.go new file mode 100644 index 0000000..e44b2d1 --- /dev/null +++ b/ws_respond.go @@ -0,0 +1,55 @@ +// https://github.com/gorilla/websocket/blob/master/examples/echo/server.go + +package websocket + +import ( + "log" + + "github.com/gorilla/websocket" + "github.com/jpaulm/gofbp/core" +) + +type WSRespond struct { + ipt core.InputConn +} + +func (WSRespond) MustRun() {} + +func (wsrespond *WSRespond) Setup(p *core.Process) { + wsrespond.ipt = p.OpenInPort("IN") +} + +func (wsrespond *WSRespond) Execute(p *core.Process) { + for { + pkt := p.Receive(wsrespond.ipt) // should be open bracket + if pkt == nil { + return + } + p.Discard(pkt) + + pkt = p.Receive(wsrespond.ipt) // connection + if pkt == nil { + return + } + conn, _ := pkt.Contents.(*websocket.Conn) + + p.Discard(pkt) + + for { + pkt = p.Receive(wsrespond.ipt) + if pkt.PktType == core.CloseBracket { + break + } + + err := conn.WriteMessage(websocket.TextMessage, []byte(pkt.Contents.(string))) + if err != nil { + log.Println("write:", err) + break + } else { + p.Discard(pkt) + } + } + p.Discard(pkt) + } + +} From 340bed586d3a47a2952dd9a3af2675441f15b3fe Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 31 Jan 2022 10:40:47 -0500 Subject: [PATCH 21/25] Clone more files to sync w/upstream --- components/websocket/ws_request.go | 4 +- components/websocket/ws_respond.go | 58 +++++----- ws_request.go | 180 ----------------------------- ws_respond.go | 55 --------- 4 files changed, 30 insertions(+), 267 deletions(-) delete mode 100644 ws_request.go delete mode 100644 ws_respond.go diff --git a/components/websocket/ws_request.go b/components/websocket/ws_request.go index b4564fd..943721a 100644 --- a/components/websocket/ws_request.go +++ b/components/websocket/ws_request.go @@ -48,9 +48,9 @@ func (wsrequest *WSRequest) Execute(p *core.Process) { httpServerExitDone.Add(1) srv := startHttpServer(httpServerExitDone, path) - log.Printf("serving for 30 seconds") + log.Printf("serving for 20 seconds") - time.Sleep(30 * time.Second) // fudge! + time.Sleep(20 * time.Second) log.Printf("stopping HTTP server") diff --git a/components/websocket/ws_respond.go b/components/websocket/ws_respond.go index a04cde1..e44b2d1 100644 --- a/components/websocket/ws_respond.go +++ b/components/websocket/ws_respond.go @@ -20,38 +20,36 @@ func (wsrespond *WSRespond) Setup(p *core.Process) { } func (wsrespond *WSRespond) Execute(p *core.Process) { - pkt := p.Receive(wsrespond.ipt) // open bracket - if pkt == nil { - return - } - p.Discard(pkt) - - pkt = p.Receive(wsrespond.ipt) // connection - if pkt == nil { - return - } - conn, _ := pkt.Contents.(*websocket.Conn) - - p.Discard(pkt) - for { - pkt = p.Receive(wsrespond.ipt) - if pkt.PktType == core.CloseBracket { - break + pkt := p.Receive(wsrespond.ipt) // should be open bracket + if pkt == nil { + return + } + p.Discard(pkt) + + pkt = p.Receive(wsrespond.ipt) // connection + if pkt == nil { + return } - //data, ok := pkt.Contents.(string) - //if !ok { - // log.Println("write: data not string") - // break - //} - - err := conn.WriteMessage(websocket.TextMessage, []byte(pkt.Contents.(string))) - if err != nil { - log.Println("write:", err) - break - } else { - p.Discard(pkt) + conn, _ := pkt.Contents.(*websocket.Conn) + + p.Discard(pkt) + + for { + pkt = p.Receive(wsrespond.ipt) + if pkt.PktType == core.CloseBracket { + break + } + + err := conn.WriteMessage(websocket.TextMessage, []byte(pkt.Contents.(string))) + if err != nil { + log.Println("write:", err) + break + } else { + p.Discard(pkt) + } } + p.Discard(pkt) } - p.Discard(pkt) + } diff --git a/ws_request.go b/ws_request.go deleted file mode 100644 index 943721a..0000000 --- a/ws_request.go +++ /dev/null @@ -1,180 +0,0 @@ -// https://github.com/gorilla/websocket/blob/master/examples/echo/server.go - -// try https://stackoverflow.com/questions/39320025/how-to-stop-http-listenandserve - -package websocket - -import ( - "context" - "fmt" - "log" - "net/http" - "sync" - "time" - - "github.com/gorilla/websocket" - "github.com/jpaulm/gofbp/core" -) - -//var data_map map[*websocket.Conn][]*core.Packet - -type WSRequest struct { - ipt core.InputConn - opt core.OutputConn -} - -func (wsrequest *WSRequest) Setup(p *core.Process) { - wsrequest.ipt = p.OpenInPort("ADDR") - wsrequest.opt = p.OpenOutPort("OUT") -} - -var upgrader = websocket.Upgrader{} -var proc *core.Process - -func (wsrequest *WSRequest) Execute(p *core.Process) { - icpkt := p.Receive(wsrequest.ipt) - path := icpkt.Contents.(string) - p.Discard(icpkt) - p.Close(wsrequest.ipt) - proc = p - //addr = flag.String("addr", path, "http service address") - //flag.Parse() - log.SetFlags(0) - - log.Printf("main: starting HTTP server") - - httpServerExitDone := &sync.WaitGroup{} - - httpServerExitDone.Add(1) - srv := startHttpServer(httpServerExitDone, path) - - log.Printf("serving for 20 seconds") - - time.Sleep(20 * time.Second) - - log.Printf("stopping HTTP server") - - // now close the server gracefully ("shutdown") - // timeout could be given with a proper context - // (in real world you shouldn't use TODO()). ???????? - if err := srv.Shutdown(context.TODO()); err != nil { - panic(err) // failure/timeout shutting down the server gracefully - } - - // wait for goroutine started in startHttpServer() to stop - httpServerExitDone.Wait() - - log.Printf("done. exiting") - //http.HandleFunc("/", serveHome) - //http.HandleFunc("/ws", serveWs) - - //err := http.ListenAndServe(*addr, nil) - //log.Fatal(err) -} - -func startHttpServer(wg *sync.WaitGroup, path string) *http.Server { - //srv := &http.Server{Addr: ":8080"} - srv := &http.Server{Addr: path} - - //http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - http.HandleFunc("/", serveWs) - - go func() { - defer wg.Done() // let main know we are done cleaning up - - // always returns error. ErrServerClosed on graceful close - if err := srv.ListenAndServe(); err != http.ErrServerClosed { - // unexpected error. port in use? - log.Fatalf("ListenAndServe(): %v", err) - } - }() - - // returning reference so caller can call Shutdown() - return srv -} - -func serveWs(w http.ResponseWriter, r *http.Request) { - fmt.Println("upgrade") - upgrader.CheckOrigin = func(r *http.Request) bool { return true } - c, err := upgrader.Upgrade(w, r, nil) - if err != nil { - log.Print("upgrade:", err) - return - } - //conn = *c - defer c.Close() - - //if data_map == nil { - // data_map = make(map[*websocket.Conn][]*core.Packet) - //} - - var pkt_list []*core.Packet - var pkt *core.Packet - - opt := proc.OpenOutPort("OUT") - - for { - _, message, err := c.ReadMessage() - if err != nil { - log.Println("read:", err) - break - } - log.Printf("recv: %s", message) - - x := string(message) - - if x == "@{" { - - pkt_list = make([]*core.Packet, 0) - //data_map[c] = pkt_list - continue - } - - if x == "@}" { - - // send out "connection" IPs, then IPs stored in pkt_list ... surrounded by bracket IPs - - pkt = proc.CreateBracket(core.OpenBracket, "") - proc.Send(opt, pkt) - - pkt = proc.Create(c) // connection - proc.Send(opt, pkt) - - for _, pkt := range pkt_list { - proc.Send(opt, pkt) - } - - //data_map[c] = nil - pkt = proc.CreateBracket(core.CloseBracket, "") - proc.Send(opt, pkt) - continue - } - - if x == "@kill" { - //time.Sleep(10 * time.Second) - //pkt = proc.Create(x) - //proc.Send(opt, pkt) - c.Close() - //break - continue - } - - pkt = proc.Create(x) - pkt_list = append(pkt_list, pkt) - //data_map[c] = pkt_list - } -} - -/* -func serveHome(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/" { - http.Error(w, "Not found", http.StatusNotFound) - return - } - if r.Method != http.MethodGet { - http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) - return - } - http.ServeFile(w, r, "home.html") -} -*/ diff --git a/ws_respond.go b/ws_respond.go deleted file mode 100644 index e44b2d1..0000000 --- a/ws_respond.go +++ /dev/null @@ -1,55 +0,0 @@ -// https://github.com/gorilla/websocket/blob/master/examples/echo/server.go - -package websocket - -import ( - "log" - - "github.com/gorilla/websocket" - "github.com/jpaulm/gofbp/core" -) - -type WSRespond struct { - ipt core.InputConn -} - -func (WSRespond) MustRun() {} - -func (wsrespond *WSRespond) Setup(p *core.Process) { - wsrespond.ipt = p.OpenInPort("IN") -} - -func (wsrespond *WSRespond) Execute(p *core.Process) { - for { - pkt := p.Receive(wsrespond.ipt) // should be open bracket - if pkt == nil { - return - } - p.Discard(pkt) - - pkt = p.Receive(wsrespond.ipt) // connection - if pkt == nil { - return - } - conn, _ := pkt.Contents.(*websocket.Conn) - - p.Discard(pkt) - - for { - pkt = p.Receive(wsrespond.ipt) - if pkt.PktType == core.CloseBracket { - break - } - - err := conn.WriteMessage(websocket.TextMessage, []byte(pkt.Contents.(string))) - if err != nil { - log.Println("write:", err) - break - } else { - p.Discard(pkt) - } - } - p.Discard(pkt) - } - -} From 55083538bc8dacb53decb774b71535231b7bd029 Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 31 Jan 2022 10:43:04 -0500 Subject: [PATCH 22/25] clone outport.go --- core/outport.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/outport.go b/core/outport.go index 5399a1b..6be612d 100644 --- a/core/outport.go +++ b/core/outport.go @@ -88,7 +88,7 @@ func (o *OutPort) Close() { if o.conn.upStrmCnt == 0 { o.conn.closed = true BdcastTr(o.conn.condNE, "bdcast out", o.sender) - trace(o.conn.downStrProc, "act from close") + trace(o.conn.downStrProc, "activated from close") o.conn.downStrProc.activate() } } From f6bcab091ad21d2a0e78afd40cf5623ec6758365 Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 31 Jan 2022 10:47:47 -0500 Subject: [PATCH 23/25] clone go.mod --- go.mod | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 8f277be..e33c830 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,5 @@ module github.com/jpaulm/gofbp go 1.17 -replace github.com/jpaulm/gofbp/core => ./ +require github.com/gorilla/websocket v1.4.2 // indirect -require github.com/gorilla/websocket v1.4.2 From e469c3230c7868c6bbc0c73976e3f75191566dfb Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 31 Jan 2022 11:45:38 -0500 Subject: [PATCH 24/25] clone ws_request.go --- components/websocket/ws_request.go | 35 +++++------------------------- 1 file changed, 5 insertions(+), 30 deletions(-) diff --git a/components/websocket/ws_request.go b/components/websocket/ws_request.go index 943721a..2316f75 100644 --- a/components/websocket/ws_request.go +++ b/components/websocket/ws_request.go @@ -37,8 +37,7 @@ func (wsrequest *WSRequest) Execute(p *core.Process) { p.Discard(icpkt) p.Close(wsrequest.ipt) proc = p - //addr = flag.String("addr", path, "http service address") - //flag.Parse() + log.SetFlags(0) log.Printf("main: starting HTTP server") @@ -46,6 +45,7 @@ func (wsrequest *WSRequest) Execute(p *core.Process) { httpServerExitDone := &sync.WaitGroup{} httpServerExitDone.Add(1) + srv := startHttpServer(httpServerExitDone, path) log.Printf("serving for 20 seconds") @@ -65,15 +65,10 @@ func (wsrequest *WSRequest) Execute(p *core.Process) { httpServerExitDone.Wait() log.Printf("done. exiting") - //http.HandleFunc("/", serveHome) - //http.HandleFunc("/ws", serveWs) - //err := http.ListenAndServe(*addr, nil) - //log.Fatal(err) } func startHttpServer(wg *sync.WaitGroup, path string) *http.Server { - //srv := &http.Server{Addr: ":8080"} srv := &http.Server{Addr: path} //http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { @@ -104,10 +99,6 @@ func serveWs(w http.ResponseWriter, r *http.Request) { //conn = *c defer c.Close() - //if data_map == nil { - // data_map = make(map[*websocket.Conn][]*core.Packet) - //} - var pkt_list []*core.Packet var pkt *core.Packet @@ -126,13 +117,13 @@ func serveWs(w http.ResponseWriter, r *http.Request) { if x == "@{" { pkt_list = make([]*core.Packet, 0) - //data_map[c] = pkt_list + continue } if x == "@}" { - // send out "connection" IPs, then IPs stored in pkt_list ... surrounded by bracket IPs + // send out "connection" IPs, then IPs stored in pkt_list ... all surrounded by bracket IPs pkt = proc.CreateBracket(core.OpenBracket, "") proc.Send(opt, pkt) @@ -151,9 +142,7 @@ func serveWs(w http.ResponseWriter, r *http.Request) { } if x == "@kill" { - //time.Sleep(10 * time.Second) - //pkt = proc.Create(x) - //proc.Send(opt, pkt) + c.Close() //break continue @@ -161,20 +150,6 @@ func serveWs(w http.ResponseWriter, r *http.Request) { pkt = proc.Create(x) pkt_list = append(pkt_list, pkt) - //data_map[c] = pkt_list - } -} -/* -func serveHome(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/" { - http.Error(w, "Not found", http.StatusNotFound) - return - } - if r.Method != http.MethodGet { - http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) - return } - http.ServeFile(w, r, "home.html") } -*/ From 03d81d5d48ba22e494fd1c3e4b9505639dcafc03 Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 31 Jan 2022 12:16:53 -0500 Subject: [PATCH 25/25] Refactor ws_ans_req. Move merge.go to cmd; to prevent package conflict --- merge.go => cmd/merge.go | 0 components/websocket/ans/ws_ans_req.go | 4 ++ components/websocket/ans/ws_ans_req_test.go | 7 ++-- components/websocket/ws_ans_req.go | 45 --------------------- testing/testwebsocket_test.go | 3 +- 5 files changed, 10 insertions(+), 49 deletions(-) rename merge.go => cmd/merge.go (100%) delete mode 100644 components/websocket/ws_ans_req.go diff --git a/merge.go b/cmd/merge.go similarity index 100% rename from merge.go rename to cmd/merge.go diff --git a/components/websocket/ans/ws_ans_req.go b/components/websocket/ans/ws_ans_req.go index 0c1f6d4..27ad48f 100644 --- a/components/websocket/ans/ws_ans_req.go +++ b/components/websocket/ans/ws_ans_req.go @@ -4,18 +4,22 @@ import ( "github.com/jpaulm/gofbp/core" ) +// WSAnsReq struct contains input and output gofbp.core socket connections type WSAnsReq struct { ipt core.InputConn out core.OutputConn } +// Setup Function defines in and out ports func (wsansreq *WSAnsReq) Setup(p *core.Process) { wsansreq.ipt = p.OpenInPort("IN") wsansreq.out = p.OpenOutPortOptional("OUT") } +// MustRun Function is defined elsewhere func (WSAnsReq) MustRun() {} +// Execute Function runs a WSAnsReq gofbp component instance process func (wsansreq *WSAnsReq) Execute(p *core.Process) { for { diff --git a/components/websocket/ans/ws_ans_req_test.go b/components/websocket/ans/ws_ans_req_test.go index 253473f..22f6a37 100644 --- a/components/websocket/ans/ws_ans_req_test.go +++ b/components/websocket/ans/ws_ans_req_test.go @@ -1,3 +1,4 @@ +// package ans (ws_ans_req.go) is a totally .... intended just to fill out the structure of a GoFBP web socket server... package ans import ( @@ -16,9 +17,9 @@ func TestWebSocket(t *testing.T) { net := core.NewNetwork("TestWebSocket") net.SetParams(params) //proc1 := net.NewProc("WSRequest", &websocket.WSRequest{}) - proc1 := net.NewProc("WSRequest", &websocket.WSRequest{}) - proc2 := net.NewProc("AnsReq", &websocket.WSAnsReq{}) - proc3 := net.NewProc("WSRespond", &websocket.WSRespond{}) + proc1 := net.NewProc("WSRequest", &websocket.WSRequest{}) // Assumed to be working + proc2 := net.NewProc("AnsReq", &WSAnsReq{}) // Testing this one. + proc3 := net.NewProc("WSRespond", &websocket.WSRespond{}) // Assumed to be working net.Initialize(path, proc1, "ADDR") net.Connect(proc1, "OUT", proc2, "IN", 6) net.Connect(proc2, "OUT", proc3, "IN", 6) diff --git a/components/websocket/ws_ans_req.go b/components/websocket/ws_ans_req.go deleted file mode 100644 index 4df1a0c..0000000 --- a/components/websocket/ws_ans_req.go +++ /dev/null @@ -1,45 +0,0 @@ -package websocket - -import ( - "github.com/jpaulm/gofbp/core" -) - -type WSAnsReq struct { - ipt core.InputConn - out core.OutputConn -} - -func (wsansreq *WSAnsReq) Setup(p *core.Process) { - wsansreq.ipt = p.OpenInPort("IN") - wsansreq.out = p.OpenOutPortOptional("OUT") -} - -func (WSAnsReq) MustRun() {} - -func (wsansreq *WSAnsReq) Execute(p *core.Process) { - - for { - pkt := p.Receive(wsansreq.ipt) // open bracket - if pkt == nil { - break - } - p.Send(wsansreq.out, pkt) - - pkt = p.Receive(wsansreq.ipt) // connection - p.Send(wsansreq.out, pkt) - - pkt = p.Receive(wsansreq.ipt) //"namelist" - p.Discard(pkt) - - pkt = p.Create("line1") - p.Send(wsansreq.out, pkt) - pkt = p.Create("line2") - p.Send(wsansreq.out, pkt) - pkt = p.Create("line3") - p.Send(wsansreq.out, pkt) - - pkt = p.Receive(wsansreq.ipt) // close bracket - p.Send(wsansreq.out, pkt) - } - -} diff --git a/testing/testwebsocket_test.go b/testing/testwebsocket_test.go index c927185..7ba5bca 100644 --- a/testing/testwebsocket_test.go +++ b/testing/testwebsocket_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/jpaulm/gofbp/components/websocket" + "github.com/jpaulm/gofbp/components/websocket/ans" "github.com/jpaulm/gofbp/core" ) @@ -17,7 +18,7 @@ func TestWebSocket(t *testing.T) { net := core.NewNetwork("TestWebSocket") net.SetParams(params) proc1 := net.NewProc("WSRequest", &websocket.WSRequest{}) - proc2 := net.NewProc("AnsReq", &websocket.WSAnsReq{}) + proc2 := net.NewProc("AnsReq", &ans.WSAnsReq{}) proc3 := net.NewProc("WSRespond", &websocket.WSRespond{}) net.Initialize(path, proc1, "ADDR") net.Connect(proc1, "OUT", proc2, "IN", 6)