Browse Source

GrazeStatusChannel added

master
Klaus Wendel 9 months ago
parent
commit
1edea11b04
  1. 49
      channels/channels.go

49
channels/channels.go

@ -0,0 +1,49 @@
package channels
import (
"fmt"
"runtime"
"strings"
"sync"
//wrap7 "git.archium.org/archium_Kunden/Wrap7"
wrap7 "git.archium.org/archium_public/ebkTools/bitmask"
)
type StatusChannelType = uint
// grazeStatusChannel liest einen Wert aus dem StatusChannel, setzt, löscht oder liest ihn. Danach wird der Channel wieder neu geschrieben, damit alle anderen Jobs, die am Channel lauschen, nicht ins Stocken geraten.
func GrazeStatusChannel(sc *chan StatusChannelType, mode string, offset StatusChannelType, mtxStatusChannelLock *sync.Mutex) bool {
defer (*mtxStatusChannelLock).Unlock()
(*mtxStatusChannelLock).Lock()
cvalue, cstatus := <-*sc
if cstatus {
switch strings.ToLower(mode) {
case "set":
*sc <- StatusChannelType(wrap7.SetBit(int(cvalue), uint(offset)))
return true // Eigentlich wurscht, was ich hier zurückgebe, aber im Zweifel "true" = gesetzt
case "clear":
*sc <- StatusChannelType(wrap7.ClearBit(int(cvalue), uint(offset)))
return false // Eigentlich wurscht, was ich hier zurückgebe, aber im Zweifel "false" = nicht gesetzt
default: //case "has":
*sc <- cvalue
return wrap7.HasBit(int(cvalue), uint(offset))
}
} else {
_, fn, line, _ := runtime.Caller(2)
panic(fmt.Sprintf("Kein statusChannel? Eigentlich hätte der Programmzeiger niemals hier sein dürfen. %s:%d\n", fn, line))
}
}
func GetStatusChannel(sc *chan StatusChannelType, mtxStatusChannelLock *sync.Mutex) StatusChannelType {
defer (*mtxStatusChannelLock).Unlock()
(*mtxStatusChannelLock).Lock()
cvalue, cstatus := <-*sc
if cstatus {
*sc <- cvalue
return cvalue
} else {
_, fn, line, _ := runtime.Caller(2)
panic(fmt.Sprintf("Kein statusChannel? Eigentlich hätte der Programmzeiger niemals hier sein dürfen. %s:%d\n", fn, line))
}
}
Loading…
Cancel
Save