From 1edea11b047c3fb1754bc77b9aa1b503928b0dab Mon Sep 17 00:00:00 2001 From: Barpfotenbaer Date: Thu, 7 Oct 2021 10:35:40 +0200 Subject: [PATCH] GrazeStatusChannel added --- channels/channels.go | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 channels/channels.go diff --git a/channels/channels.go b/channels/channels.go new file mode 100644 index 0000000..cf3d01c --- /dev/null +++ b/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)) + } +}