mirror of https://github.com/q191201771/lal.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.2 KiB
Go
101 lines
2.2 KiB
Go
6 years ago
|
package main
|
||
6 years ago
|
|
||
|
import (
|
||
6 years ago
|
"github.com/q191201771/lal/httpflv"
|
||
6 years ago
|
"github.com/q191201771/lal/log"
|
||
6 years ago
|
"sync"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type Manager struct {
|
||
6 years ago
|
config *Config
|
||
6 years ago
|
|
||
6 years ago
|
server *httpflv.Server
|
||
6 years ago
|
groups map[string]*Group // TODO chef: with appName
|
||
|
mutex sync.Mutex
|
||
|
exitChan chan bool
|
||
|
}
|
||
|
|
||
6 years ago
|
func NewManager(config *Config) *Manager {
|
||
|
m := &Manager{
|
||
|
config: config,
|
||
6 years ago
|
groups: make(map[string]*Group),
|
||
|
exitChan: make(chan bool),
|
||
|
}
|
||
6 years ago
|
s := httpflv.NewServer(m, config.HTTPFlv.SubListenAddr, config.SubIdleTimeout)
|
||
|
m.server = s
|
||
|
return m
|
||
6 years ago
|
}
|
||
|
|
||
|
func (manager *Manager) RunLoop() {
|
||
|
go func() {
|
||
|
if err := manager.server.RunLoop(); err != nil {
|
||
6 years ago
|
log.Error(err)
|
||
6 years ago
|
}
|
||
|
}()
|
||
|
|
||
|
t := time.NewTicker(1 * time.Second)
|
||
|
defer t.Stop()
|
||
6 years ago
|
// TODO chef: erase me, just for debug
|
||
6 years ago
|
tmpT := time.NewTicker(10 * time.Second)
|
||
6 years ago
|
defer tmpT.Stop()
|
||
6 years ago
|
for {
|
||
|
select {
|
||
|
case <-manager.exitChan:
|
||
|
return
|
||
|
case <-t.C:
|
||
|
manager.check()
|
||
6 years ago
|
case <-tmpT.C:
|
||
6 years ago
|
// TODO chef: lock
|
||
|
log.Infof("group size:%d", len(manager.groups))
|
||
6 years ago
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (manager *Manager) Dispose() {
|
||
6 years ago
|
log.Debug("Dispose manager.")
|
||
6 years ago
|
manager.server.Dispose()
|
||
|
manager.exitChan <- true
|
||
|
manager.mutex.Lock()
|
||
|
defer manager.mutex.Unlock()
|
||
|
for _, group := range manager.groups {
|
||
6 years ago
|
group.Dispose(lalErr)
|
||
6 years ago
|
}
|
||
|
manager.groups = nil
|
||
|
}
|
||
|
|
||
6 years ago
|
func (manager *Manager) NewHTTPFlvSubSessionCB(session *httpflv.SubSession) {
|
||
|
group := manager.getOrCreateGroup(session.AppName, session.StreamName)
|
||
|
group.AddSubSession(session)
|
||
|
switch manager.config.Pull.Type {
|
||
|
case "httpflv":
|
||
|
group.PullIfNeeded(manager.config.Pull.Addr)
|
||
|
default:
|
||
|
log.Errorf("unknown pull type. type=%s", manager.config.Pull.Type)
|
||
|
}
|
||
|
}
|
||
|
|
||
6 years ago
|
func (manager *Manager) check() {
|
||
|
manager.mutex.Lock()
|
||
|
defer manager.mutex.Unlock()
|
||
|
for k, group := range manager.groups {
|
||
|
if group.IsTotalEmpty() {
|
||
6 years ago
|
log.Infof("erase empty group. [%s]", group.UniqueKey)
|
||
6 years ago
|
group.Dispose(lalErr)
|
||
6 years ago
|
delete(manager.groups, k)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (manager *Manager) getOrCreateGroup(appName string, streamName string) *Group {
|
||
|
manager.mutex.Lock()
|
||
|
defer manager.mutex.Unlock()
|
||
|
group, exist := manager.groups[streamName]
|
||
|
if !exist {
|
||
6 years ago
|
group = NewGroup(appName, streamName, manager.config)
|
||
6 years ago
|
manager.groups[streamName] = group
|
||
|
}
|
||
|
go group.RunLoop()
|
||
|
return group
|
||
|
}
|