From 8a4e29a3ceea4a7d23e833b1ff02cba76ea4ac93 Mon Sep 17 00:00:00 2001 From: Verox007 Date: Sun, 17 Dec 2023 01:03:49 +0100 Subject: [PATCH] Added Ctrl+C handler --- pkg/net/network.go | 7 +++--- pkg/utils/queue.go | 53 ---------------------------------------------- steel.go | 20 ++++++++++++++++- 3 files changed, 22 insertions(+), 58 deletions(-) delete mode 100644 pkg/utils/queue.go diff --git a/pkg/net/network.go b/pkg/net/network.go index 9663f7f..e86e27e 100644 --- a/pkg/net/network.go +++ b/pkg/net/network.go @@ -28,9 +28,6 @@ func Run(baseCtx context.Context, addr string) { // var wg sync.WaitGroup go func() { - go func() { - <-ctx.Done() - }() for { // Print test every second select { @@ -44,10 +41,12 @@ func Run(baseCtx context.Context, addr string) { }() // Listen for an incoming connection in a goroutine. - // wg.Add(1) go func() { go func() { + // Waiting for the context to be done <-ctx.Done() + + // Waiting for the listener to be closed, so the port is safely released listener.Close() }() for { diff --git a/pkg/utils/queue.go b/pkg/utils/queue.go deleted file mode 100644 index 1ea6cea..0000000 --- a/pkg/utils/queue.go +++ /dev/null @@ -1,53 +0,0 @@ -package utils - -// Queue implementation - -type Node struct { - Value interface{} - Next *Node -} - -type Queue struct { - Head *Node - Tail *Node -} - -func (q *Queue) Enqueue(value interface{}) { - node := &Node{Value: value} - - if q.Head == nil { - q.Head = node - q.Tail = node - return - } - - q.Tail.Next = node - q.Tail = node -} - -func (q *Queue) Dequeue() interface{} { - if q.Head == nil { - return nil - } - - node := q.Head - q.Head = node.Next - - if q.Head == nil { - q.Tail = nil - } - - return node.Value -} - -func (q *Queue) Peek() interface{} { - if q.Head == nil { - return nil - } - - return q.Head.Value -} - -func (q *Queue) IsEmpty() bool { - return q.Head == nil -} diff --git a/steel.go b/steel.go index 576a970..668b76c 100644 --- a/steel.go +++ b/steel.go @@ -4,7 +4,11 @@ import ( "cimeyclust.com/steel/pkg/cmd" "cimeyclust.com/steel/pkg/net" "context" + "fmt" + "os" + "os/signal" "sync" + "syscall" ) func main() { @@ -12,6 +16,9 @@ func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + var wg sync.WaitGroup // Start the console handler @@ -32,8 +39,19 @@ func main() { net.Run(ctx, "localhost:8080") }() - cmd.Logger.Info("Started") + // Handles Ctrl+C + go func() { + defer cancel() + + select { + case <-sigChan: + cmd.Logger.Info("Received stop command via Ctrl+C") + cancel() + } + }() // Wait for all components to finish + cmd.Logger.Info("Server started successfully") wg.Wait() + fmt.Println("Server stopped successfully") }