Initial commit of ADSBTower mutex protection (needs testing)

pull/428/head
AvSquirrel 2016-05-24 19:39:11 +00:00
rodzic 47271df764
commit f1521d6e25
2 zmienionych plików z 12 dodań i 2 usunięć

Wyświetl plik

@ -26,6 +26,7 @@ import (
"runtime"
"strconv"
"strings"
"sync"
"syscall"
"time"
@ -125,6 +126,7 @@ type ADSBTower struct {
}
var ADSBTowers map[string]ADSBTower // Running list of all towers seen. (lat,lng) -> ADSBTower
var ADSBTowerMutex *sync.Mutex
func constructFilenames() {
var fileIndexNumber uint
@ -493,7 +495,8 @@ func makeStratuxStatus() []byte {
msg[26] = byte((v & 0xFF00) >> 8)
msg[27] = byte(v & 0xFF)
// Number of ADS-B towers.
// Number of ADS-B towers. Map structure is protected by ADSBTowerMutex.
ADSBTowerMutex.Lock()
num_towers := uint8(len(ADSBTowers))
msg[28] = byte(num_towers)
@ -510,7 +513,7 @@ func makeStratuxStatus() []byte {
msg = append(msg, tmp[1]) // Longitude.
msg = append(msg, tmp[2]) // Longitude.
}
ADSBTowerMutex.Unlock()
return prepareMessage(msg)
}
@ -628,6 +631,8 @@ func updateMessageStats() {
ES_messages_last_minute := uint(0)
products_last_minute := make(map[string]uint32)
ADSBTowerMutex.Lock()
// Clear out ADSBTowers stats.
for t, tinf := range ADSBTowers {
tinf.Messages_last_minute = 0
@ -681,6 +686,7 @@ func updateMessageStats() {
ADSBTowers[t] = tinf
}
ADSBTowerMutex.Unlock()
}
// Check if CPU temperature is valid. Assume <= 0 is invalid.
@ -1262,6 +1268,7 @@ func main() {
constructFilenames()
ADSBTowers = make(map[string]ADSBTower)
ADSBTowerMutex = &sync.Mutex{}
MsgLog = make([]msg, 0)
crcInit() // Initialize CRC16 table.

Wyświetl plik

@ -151,6 +151,8 @@ func handleSituationRequest(w http.ResponseWriter, r *http.Request) {
func handleTowersRequest(w http.ResponseWriter, r *http.Request) {
setNoCache(w)
setJSONHeaders(w)
ADSBTowerMutex.Lock()
towersJSON, err := json.Marshal(&ADSBTowers)
if err != nil {
log.Printf("Error sending tower JSON data: %s\n", err.Error())
@ -158,6 +160,7 @@ func handleTowersRequest(w http.ResponseWriter, r *http.Request) {
// for testing purposes, we can return a fixed reply
// towersJSON = []byte(`{"(38.490880,-76.135554)":{"Lat":38.49087953567505,"Lng":-76.13555431365967,"Signal_strength_last_minute":100,"Signal_strength_max":67,"Messages_last_minute":1,"Messages_total":1059},"(38.978698,-76.309276)":{"Lat":38.97869825363159,"Lng":-76.30927562713623,"Signal_strength_last_minute":495,"Signal_strength_max":32,"Messages_last_minute":45,"Messages_total":83},"(39.179285,-76.668413)":{"Lat":39.17928457260132,"Lng":-76.66841268539429,"Signal_strength_last_minute":50,"Signal_strength_max":24,"Messages_last_minute":1,"Messages_total":16},"(39.666309,-74.315300)":{"Lat":39.66630935668945,"Lng":-74.31529998779297,"Signal_strength_last_minute":9884,"Signal_strength_max":35,"Messages_last_minute":4,"Messages_total":134}}`)
fmt.Fprintf(w, "%s\n", towersJSON)
ADSBTowerMutex.Unlock()
}
// AJAX call - /getSatellites. Responds with all GNSS satellites that are being tracked, along with status information.