func StartChannelSenderStage0(channel_name string, stage0_channel, stage1_channel chan *lib.PostMessage) chan bool { close_chan := make(chan bool) go func() { defer func() { if err := recover(); err != nil { utils.Log.Println(err) debug.PrintStack() } }() var post_message *lib.PostMessage var new_post_message *lib.PostMessage channel := GetChannel(channel_name) for { select { case <-close_chan: utils.Log.Printf("Channel [%s] SenderStage0 has quit...\n", channel_name) close_chan <- true return case post_message = <-stage0_channel: post_message.Lock = new(isync.SpinLock) stage1_channel <- post_message channel.LastPostUpdate = time.Now().Unix() if channel.MQTTMessageChan != nil { new_post_message = CopyMessage(channel, post_message) channel.MQTTMessageChan <- new_post_message } if ServerDebug { utils.Log.Println("ChannelSenderStage0: send post_message to stage1_channel", post_message) } } } }() return close_chan }