mirror of https://github.com/poanetwork/gecko.git
79 lines
2.0 KiB
Go
79 lines
2.0 KiB
Go
// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package main
|
|
|
|
// #include "salticidae/network.h"
|
|
// void onTerm(int sig, void *);
|
|
// void decidedTx(msg_t *, msgnetwork_conn_t *, void *);
|
|
import "C"
|
|
|
|
import (
|
|
"fmt"
|
|
"unsafe"
|
|
|
|
"github.com/ava-labs/salticidae-go"
|
|
|
|
"github.com/ava-labs/gecko/ids"
|
|
"github.com/ava-labs/gecko/networking"
|
|
"github.com/ava-labs/gecko/utils/logging"
|
|
)
|
|
|
|
// network stores the persistent data needed when running the test.
|
|
type network struct {
|
|
ec salticidae.EventContext
|
|
build networking.Builder
|
|
|
|
net salticidae.MsgNetwork
|
|
conn salticidae.MsgNetworkConn
|
|
|
|
log logging.Logger
|
|
decided chan ids.ID
|
|
|
|
networkID uint32
|
|
}
|
|
|
|
var net = network{}
|
|
|
|
func (n *network) Initialize() error {
|
|
n.ec = salticidae.NewEventContext()
|
|
evInt := salticidae.NewSigEvent(n.ec, salticidae.SigEventCallback(C.onTerm), nil)
|
|
evInt.Add(salticidae.SIGINT)
|
|
evTerm := salticidae.NewSigEvent(n.ec, salticidae.SigEventCallback(C.onTerm), nil)
|
|
evTerm.Add(salticidae.SIGTERM)
|
|
|
|
serr := salticidae.NewError()
|
|
netconfig := salticidae.NewMsgNetworkConfig()
|
|
n.net = salticidae.NewMsgNetwork(n.ec, netconfig, &serr)
|
|
if serr.GetCode() != 0 {
|
|
return fmt.Errorf("sync error %s", salticidae.StrError(serr.GetCode()))
|
|
}
|
|
|
|
n.net.RegHandler(networking.DecidedTx, salticidae.MsgNetworkMsgCallback(C.decidedTx), nil)
|
|
return nil
|
|
}
|
|
|
|
//export onTerm
|
|
func onTerm(C.int, unsafe.Pointer) {
|
|
net.log.Info("Terminate signal received")
|
|
net.ec.Stop()
|
|
}
|
|
|
|
// decidedTx handles the recept of a decidedTx message
|
|
//export decidedTx
|
|
func decidedTx(_msg *C.struct_msg_t, _conn *C.struct_msgnetwork_conn_t, _ unsafe.Pointer) {
|
|
msg := salticidae.MsgFromC(salticidae.CMsg(_msg))
|
|
|
|
pMsg, err := net.build.Parse(networking.DecidedTx, msg.GetPayloadByMove())
|
|
if err != nil {
|
|
net.log.Warn("Failed to parse DecidedTx message")
|
|
return
|
|
}
|
|
|
|
txID, err := ids.ToID(pMsg.Get(networking.TxID).([]byte))
|
|
net.log.AssertNoError(err) // Length is checked in message parsing
|
|
|
|
net.log.Debug("Decided %s", txID)
|
|
net.decided <- txID
|
|
}
|