package main // will this help things? // this is a hack for testing for now // cram a mutex in the pb.go file import ( "fmt" "io" "os" "strings" "go.wit.com/log" ) func (pf *File) syncLock(w io.Writer) { var LOCK string = pf.Base.Lockname // if the Marshall code changes, this will have to change fmt.Fprintln(w, "// a simple global lock") fmt.Fprintln(w, "") fmt.Fprintln(w, "// this is needed because it seems Marshal() fails if locks are in the structs (?)") fmt.Fprintln(w, "// this might just be a syntactical runtime error. notsure.") fmt.Fprintln(w, "// maybe this autogen tool will help someone that actually knows what is going on inside") fmt.Fprintln(w, "// go/src/google.golang.org/protobuf/proto/proto_methods.go") fmt.Fprintln(w, "// go/src/google.golang.org/protobuf/proto/encode.go") fmt.Fprintln(w, "// my guess is that Marshal() needs to be told to ignore sync.RWMutex as it ephemeral and can't be stored") fmt.Fprintln(w, "") fmt.Fprintln(w, "var "+LOCK+" sync.RWMutex") fmt.Fprintln(w, "") } func (pb *Files) addMutex(f *File) error { fullname := f.Pbfilename log.Info("pb filename:", fullname) data, err := os.ReadFile(fullname) if err != nil { log.Info("pb filename failed to read:", err) return err } // check if autogenpb has already looked at this file for _, line := range strings.Split(string(data), "\n") { if strings.Contains(line, "autogenpb DO NOT EDIT") { log.Info("autogenpb has already been run on", fullname) return nil } } w, _ := os.OpenFile(f.Pbfilename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) pbHeaderComment(w) lines := strings.Split(string(data), "\n") for _, line := range lines { if strings.HasPrefix(line, "package ") { log.Info("CHANGING package:", line, "to package:", f.Package) fmt.Fprintln(w, "package "+f.Package) // log.Info("CHANGING package:", line, "to package:main") // fmt.Fprintln(w, "package "+"main") continue } if f.structMatch(line) { if argv.Mutex { log.Info("Adding Mutex to:", line) fmt.Fprintln(w, line) fmt.Fprintln(w, "\tLock sync.RWMutex // auto-added by go.wit.com/apps/autogenpb") // this must be 'Lock' or Marshal() panics? // fmt.Fprintln(w, "\t// auto-added by go.wit.com/apps/autogenpb") // fmt.Fprintln(w, "\tsync.RWMutex") fmt.Fprintln(w, "") } else { log.Info("Skipping. Mutex = false for:", line) fmt.Fprintln(w, line) fmt.Fprintln(w, "\t// Lock sync.RWMutex // autogenpb skipped this. needs --mutex command line arg") fmt.Fprintln(w, "") } } else { fmt.Fprintln(w, line) } } for _, msg := range f.MsgNames { if !msg.MutexFound && msg.DoMutex { return fmt.Errorf("addMutex() parse didn't work for %s", msg.Name) } } return nil } // is this struct supposed to have a Mutex added? func (pf *File) structMatch(line string) bool { var msg *MsgName var start string msg = pf.Bases start = "type " + msg.Name + " struct {" if strings.HasPrefix(line, start) { msg.MutexFound = true msg.Lockname = "x.Lock" return true } // ONLY PASS THIS IF YOU DO NOT WANT TO USE MARSHAL() msg = pf.Base start = "type " + msg.Name + " struct {" if strings.HasPrefix(line, start) { msg.MutexFound = true // msg.Lockname = "x.Lock" return true } for _, msg = range pf.MsgNames { start = "type " + msg.Name + " struct {" if strings.HasPrefix(line, start) { msg.MutexFound = true // msg.Lockname = "x.Lock" return true } } return false }