Compare commits

..

5 Commits

Author SHA1 Message Date
Fusl 2f2825976d use a reusable slice for storing args in readcommands functions 2024-05-19 08:23:38 +00:00
Josh Baker 9f71787fcd
Create README.md 2023-01-29 16:34:09 -07:00
Josh Baker d05da895e5
Merge pull request #62 from tomarrell/master
fix: race condition in initialisation of server
2023-01-20 09:11:59 -07:00
Tom Arrell c746dbc05b
fix: race condition in initialisation of server 2023-01-20 15:12:37 +01:00
tidwall 8b671291b8 Fix race condition on server close
closes #61
2023-01-12 09:18:56 -07:00
2 changed files with 26 additions and 15 deletions

View File

@ -18,6 +18,8 @@ Features
- Compatible pub/sub support
- Multithreaded
*This library is also avaliable for [Rust](https://github.com/tidwall/redcon.rs) and [C](https://github.com/tidwall/redcon.c).*
Installing
----------

View File

@ -236,12 +236,14 @@ func Serve(ln net.Listener,
closed func(conn Conn, err error),
) error {
s := newServer()
s.mu.Lock()
s.net = ln.Addr().Network()
s.laddr = ln.Addr().String()
s.ln = ln
s.handler = handler
s.accept = accept
s.closed = closed
s.mu.Unlock()
return serve(s)
}
@ -297,7 +299,9 @@ func (s *Server) ListenServeAndSignal(signal chan error) error {
}
return err
}
s.mu.Lock()
s.ln = ln
s.mu.Unlock()
if signal != nil {
signal <- nil
}
@ -306,9 +310,11 @@ func (s *Server) ListenServeAndSignal(signal chan error) error {
// Serve serves incoming connections with the given net.Listener.
func (s *Server) Serve(ln net.Listener) error {
s.mu.Lock()
s.ln = ln
s.net = ln.Addr().Network()
s.laddr = ln.Addr().String()
s.mu.Unlock()
return serve(s)
}
@ -322,7 +328,9 @@ func (s *TLSServer) ListenServeAndSignal(signal chan error) error {
}
return err
}
s.mu.Lock()
s.ln = ln
s.mu.Unlock()
if signal != nil {
signal <- nil
}
@ -336,7 +344,7 @@ func serve(s *Server) error {
s.mu.Lock()
defer s.mu.Unlock()
for c := range s.conns {
c.Close()
c.conn.Close()
}
s.conns = nil
}()
@ -603,9 +611,9 @@ func (w *Writer) WriteNull() {
// sub-responses to the client to complete the response.
// For example to write two strings:
//
// c.WriteArray(2)
// c.WriteBulkString("item 1")
// c.WriteBulkString("item 2")
// c.WriteArray(2)
// c.WriteBulkString("item 1")
// c.WriteBulkString("item 2")
func (w *Writer) WriteArray(count int) {
if w.err != nil {
return
@ -710,17 +718,18 @@ func (w *Writer) WriteRaw(data []byte) {
}
// WriteAny writes any type to client.
// nil -> null
// error -> error (adds "ERR " when first word is not uppercase)
// string -> bulk-string
// numbers -> bulk-string
// []byte -> bulk-string
// bool -> bulk-string ("0" or "1")
// slice -> array
// map -> array with key/value pairs
// SimpleString -> string
// SimpleInt -> integer
// everything-else -> bulk-string representation using fmt.Sprint()
//
// nil -> null
// error -> error (adds "ERR " when first word is not uppercase)
// string -> bulk-string
// numbers -> bulk-string
// []byte -> bulk-string
// bool -> bulk-string ("0" or "1")
// slice -> array
// map -> array with key/value pairs
// SimpleString -> string
// SimpleInt -> integer
// everything-else -> bulk-string representation using fmt.Sprint()
func (w *Writer) WriteAny(v interface{}) {
if w.err != nil {
return