Skip to content

Commit

Permalink
Add new exit handler
Browse files Browse the repository at this point in the history
  • Loading branch information
patapancakes committed Apr 17, 2024
1 parent 5916c9e commit dbcc0d0
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 9 deletions.
6 changes: 6 additions & 0 deletions api/endpoints.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"log"
"net/http"
"strconv"
"sync"

"github.com/pagefaultgames/pokerogue-server/api/account"
"github.com/pagefaultgames/pokerogue-server/api/daily"
Expand All @@ -17,6 +18,7 @@ import (

type Server struct {
Debug bool
Exit *sync.RWMutex
}

/*
Expand All @@ -26,6 +28,10 @@ type Server struct {
*/

func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// kind of misusing the RWMutex but it doesn't matter
s.Exit.RLock()
defer s.Exit.RUnlock()

gob.Register([]interface{}{})
gob.Register(map[string]interface{}{})

Expand Down
55 changes: 46 additions & 9 deletions pokerogue-server.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@ import (
"net"
"net/http"
"os"
"os/signal"
"sync"
"syscall"

"github.com/pagefaultgames/pokerogue-server/api"
"github.com/pagefaultgames/pokerogue-server/db"
)

func main() {
// flag stuff
debug := flag.Bool("debug", false, "debug mode")

proto := flag.String("proto", "tcp", "protocol for api to use (tcp, unix)")
Expand All @@ -25,28 +29,61 @@ func main() {

flag.Parse()

// get database connection
err := db.Init(*dbuser, *dbpass, *dbproto, *dbaddr, *dbname)
if err != nil {
log.Fatalf("failed to initialize database: %s", err)
}

if *proto == "unix" {
os.Remove(*addr)
}

listener, err := net.Listen(*proto, *addr)
// create listener
listener, err := createListener(*proto, *addr)
if err != nil {
log.Fatalf("failed to create net listener: %s", err)
}

if *proto == "unix" {
os.Chmod(*addr, 0777)
}
// create exit handler
var exit sync.RWMutex
createExitHandler(&exit)

// init api
api.Init()

err = http.Serve(listener, &api.Server{Debug: *debug})
// start web server
err = http.Serve(listener, &api.Server{Debug: *debug, Exit: &exit})
if err != nil {
log.Fatalf("failed to create http server or server errored: %s", err)
}
}

func createListener(proto, addr string) (net.Listener, error) {
if proto == "unix" {
os.Remove(addr)
}

listener, err := net.Listen(proto, addr)
if err != nil {
return nil, err
}

if proto == "unix" {
os.Chmod(addr, 0777)
}

return listener, nil
}

func createExitHandler(mtx *sync.RWMutex) {
s := make(chan os.Signal, 1)
signal.Notify(s, syscall.SIGINT, syscall.SIGTERM)

go func() {
// wait for exit signal of some kind
<-s

// block new requests and wait for existing ones to finish
mtx.Lock()

// bail
os.Exit(0)
}()
}

0 comments on commit dbcc0d0

Please sign in to comment.