Browse Source

Avoid the need for another mutex in Client by moving cleanup client checks to Hub.

pull/168/head
Simon Eisenmann 11 years ago
parent
commit
eb1ecce7e0
  1. 6
      src/app/spreed-webrtc-server/channelling_api.go
  2. 10
      src/app/spreed-webrtc-server/client.go
  3. 14
      src/app/spreed-webrtc-server/hub.go

6
src/app/spreed-webrtc-server/channelling_api.go

@ -32,7 +32,7 @@ const (
type ChannellingAPI interface { type ChannellingAPI interface {
OnConnect(Client, *Session) OnConnect(Client, *Session)
OnDisconnect(string) OnDisconnect(Client, *Session)
OnIncoming(ResponseSender, *Session, *DataIncoming) OnIncoming(ResponseSender, *Session, *DataIncoming)
} }
@ -65,8 +65,8 @@ func (api *channellingAPI) OnConnect(client Client, session *Session) {
api.SendSelf(client, session) api.SendSelf(client, session)
} }
func (api *channellingAPI) OnDisconnect(sessionID string) { func (api *channellingAPI) OnDisconnect(client Client, session *Session) {
api.Unicaster.OnDisconnect(sessionID) api.Unicaster.OnDisconnect(client, session)
} }
func (api *channellingAPI) OnIncoming(c ResponseSender, session *Session, msg *DataIncoming) { func (api *channellingAPI) OnIncoming(c ResponseSender, session *Session, msg *DataIncoming) {

10
src/app/spreed-webrtc-server/client.go

@ -51,11 +51,10 @@ type client struct {
ChannellingAPI ChannellingAPI
Connection Connection
session *Session session *Session
replaced bool
} }
func NewClient(codec Codec, api ChannellingAPI, session *Session) *client { func NewClient(codec Codec, api ChannellingAPI, session *Session) *client {
return &client{codec, api, nil, session, false} return &client{codec, api, nil, session}
} }
func (client *client) OnConnect(conn Connection) { func (client *client) OnConnect(conn Connection) {
@ -65,11 +64,7 @@ func (client *client) OnConnect(conn Connection) {
func (client *client) OnDisconnect() { func (client *client) OnDisconnect() {
client.session.Close() client.session.Close()
if client.replaced { client.ChannellingAPI.OnDisconnect(client, client.session)
log.Printf("Not cleaning up session %s as client %d was replaced\n", client.session.Id, client.Index())
return
}
client.ChannellingAPI.OnDisconnect(client.session.Id)
} }
func (client *client) OnText(b Buffer) { func (client *client) OnText(b Buffer) {
@ -94,7 +89,6 @@ func (client *client) Session() *Session {
} }
func (client *client) ReplaceAndClose() { func (client *client) ReplaceAndClose() {
client.replaced = true
client.session.Close() client.session.Close()
if client.Connection != nil { if client.Connection != nil {
client.Connection.Close() client.Connection.Close()

14
src/app/spreed-webrtc-server/hub.go

@ -48,8 +48,8 @@ type SessionStore interface {
type Unicaster interface { type Unicaster interface {
SessionStore SessionStore
OnConnect(Client, *Session) OnConnect(Client, *Session)
OnDisconnect(Client, *Session)
Unicast(to string, outgoing *DataOutgoing) Unicast(to string, outgoing *DataOutgoing)
OnDisconnect(sessionID string)
} }
type ContactManager interface { type ContactManager interface {
@ -161,10 +161,16 @@ func (h *hub) OnConnect(client Client, session *Session) {
h.mutex.Unlock() h.mutex.Unlock()
} }
func (h *hub) OnDisconnect(sessionID string) { func (h *hub) OnDisconnect(client Client, session *Session) {
log.Printf("Cleaning up session id %s\n", sessionID)
h.mutex.Lock() h.mutex.Lock()
delete(h.clients, sessionID) if ec, ok := h.clients[session.Id]; ok {
if ec == client {
log.Printf("Cleaning up client %d for session id %s\n", ec.Index(), session.Id)
delete(h.clients, session.Id)
} else {
log.Printf("Not cleaning up session %s as client %d was replaced with %d\n", session.Id, client.Index(), ec.Index())
}
}
h.mutex.Unlock() h.mutex.Unlock()
} }

Loading…
Cancel
Save