From f54203d54f2dca991a83e30e89edaaf816baf873 Mon Sep 17 00:00:00 2001 From: Azareal Date: Mon, 10 May 2021 17:53:52 +1000 Subject: [PATCH] Eliminate zone and prescript allocs in userCheck2(). --- common/routes_common.go | 95 ++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 38 deletions(-) diff --git a/common/routes_common.go b/common/routes_common.go index 167b9f32..30ef3f49 100644 --- a/common/routes_common.go +++ b/common/routes_common.go @@ -24,7 +24,7 @@ var PreRoute func(http.ResponseWriter, *http.Request) (User, bool) = preRoute var PanelUserCheck func(http.ResponseWriter, *http.Request, *User) (*Header, PanelStats, RouteError) = panelUserCheck var SimplePanelUserCheck func(http.ResponseWriter, *http.Request, *User) (*HeaderLite, RouteError) = simplePanelUserCheck var SimpleForumUserCheck func(w http.ResponseWriter, r *http.Request, u *User, fid int) (headerLite *HeaderLite, err RouteError) = simpleForumUserCheck -var ForumUserCheck func(header *Header, w http.ResponseWriter, r *http.Request, u *User, fid int) (err RouteError) = forumUserCheck +var ForumUserCheck func(h *Header, w http.ResponseWriter, r *http.Request, u *User, fid int) (err RouteError) = forumUserCheck var SimpleUserCheck func(w http.ResponseWriter, r *http.Request, u *User) (headerLite *HeaderLite, err RouteError) = simpleUserCheck var UserCheck func(w http.ResponseWriter, r *http.Request, u *User) (h *Header, err RouteError) = userCheck var UserCheckNano func(w http.ResponseWriter, r *http.Request, u *User, nano int64) (h *Header, err RouteError) = userCheck2 @@ -222,7 +222,7 @@ func userCheck2(w http.ResponseWriter, r *http.Request, u *User, nano int64) (h Theme: theme, CurrentUser: u, // ! Some things rely on this being a pointer downstream from this function Hooks: GetHookTable(), - Zone: "frontend", + Zone: ucstrs[0], Writer: w, IsoCode: phrases.GetLangPack().IsoCode, StartedAt: nano, @@ -280,31 +280,50 @@ func PrepResources(u *User, h *Header, theme *Theme) { } } - addPreScript := func(name string) { + addPreScript := func(name string, i int) { // TODO: Optimise this by removing a superfluous string alloc var tname string if theme.OverridenMap != nil { //fmt.Printf("name %+v\n", name) //fmt.Printf("theme.OverridenMap %+v\n", theme.OverridenMap) - _, ok := theme.OverridenMap[name] - if ok { + if _, ok := theme.OverridenMap[name]; ok { tname = "_" + theme.Name } + //fmt.Printf("tname %+v\n", tname) + h.AddPreScriptAsync("tmpl_" + name + tname + ".js") + return } //fmt.Printf("tname %+v\n", tname) - h.AddPreScriptAsync("tmpl_" + name + tname + ".js") + h.AddPreScriptAsync(ucstrs[i]) } - addPreScript("topics_topic") - addPreScript("paginator") - addPreScript("alert") - addPreScript("notice") + addPreScript("topics_topic", 1) + addPreScript("paginator", 2) + addPreScript("alert", 3) + addPreScript("notice", 4) if u.Loggedin { - addPreScript("topic_c_edit_post") - addPreScript("topic_c_attach_item") - addPreScript("topic_c_poll_input") + addPreScript("topic_c_edit_post", 5) + addPreScript("topic_c_attach_item", 6) + addPreScript("topic_c_poll_input", 7) } } +func pstr(name string) string { + return "tmpl_" + name + ".js" +} + +var ucstrs = [...]string{ + "frontend", + + pstr("topics_topic"), + pstr("paginator"), + pstr("alert"), + pstr("notice"), + + pstr("topic_c_edit_post"), + pstr("topic_c_attach_item"), + pstr("topic_c_poll_input"), +} + func preRoute(w http.ResponseWriter, r *http.Request) (User, bool) { userptr, halt := Auth.SessionCheck(w, r) if halt { @@ -324,7 +343,7 @@ func preRoute(w http.ResponseWriter, r *http.Request) (User, bool) { // TODO: Better take proxies into consideration host, _, err := net.SplitHostPort(r.RemoteAddr) if err != nil { - PreError("Bad IP", w, r) + _ = PreError("Bad IP", w, r) return *usercpy, false } @@ -343,7 +362,7 @@ func preRoute(w http.ResponseWriter, r *http.Request) (User, bool) { mon := time.Now().Month() err = usercpy.UpdateIP(strconv.Itoa(int(mon)) + "-" + host) if err != nil { - InternalError(err, w, r) + _ = InternalError(err, w, r) return *usercpy, false } } @@ -352,7 +371,7 @@ func preRoute(w http.ResponseWriter, r *http.Request) (User, bool) { return *usercpy, true } -func UploadAvatar(w http.ResponseWriter, r *http.Request, user *User, tuid int) (ext string, ferr RouteError) { +func UploadAvatar(w http.ResponseWriter, r *http.Request, u *User, tuid int) (ext string, ferr RouteError) { // We don't want multiple files // TODO: Are we doing this correctly? filenameMap := make(map[string]bool) @@ -365,7 +384,7 @@ func UploadAvatar(w http.ResponseWriter, r *http.Request, user *User, tuid int) } } if len(filenameMap) > 1 { - return "", LocalError("You may only upload one avatar", w, r, user) + return "", LocalError("You may only upload one avatar", w, r, u) } for _, fheaders := range r.MultipartForm.File { @@ -375,67 +394,67 @@ func UploadAvatar(w http.ResponseWriter, r *http.Request, user *User, tuid int) } inFile, err := hdr.Open() if err != nil { - return "", LocalError("Upload failed", w, r, user) + return "", LocalError("Upload failed", w, r, u) } defer inFile.Close() if ext == "" { extarr := strings.Split(hdr.Filename, ".") if len(extarr) < 2 { - return "", LocalError("Bad file", w, r, user) + return "", LocalError("Bad file", w, r, u) } ext = extarr[len(extarr)-1] // TODO: Can we do this without a regex? reg, err := regexp.Compile("[^A-Za-z0-9]+") if err != nil { - return "", LocalError("Bad file extension", w, r, user) + return "", LocalError("Bad file extension", w, r, u) } ext = reg.ReplaceAllString(ext, "") ext = strings.ToLower(ext) if !ImageFileExts.Contains(ext) { - return "", LocalError("You can only use an image for your avatar", w, r, user) + return "", LocalError("You can only use an image for your avatar", w, r, u) } } // TODO: Centralise this string, so we don't have to change it in two different places when it changes outFile, err := os.Create("./uploads/avatar_" + strconv.Itoa(tuid) + "." + ext) if err != nil { - return "", LocalError("Upload failed [File Creation Failed]", w, r, user) + return "", LocalError("Upload failed [File Creation Failed]", w, r, u) } defer outFile.Close() _, err = io.Copy(outFile, inFile) if err != nil { - return "", LocalError("Upload failed [Copy Failed]", w, r, user) + return "", LocalError("Upload failed [Copy Failed]", w, r, u) } } } if ext == "" { - return "", LocalError("No file", w, r, user) + return "", LocalError("No file", w, r, u) } return ext, nil } -func ChangeAvatar(path string, w http.ResponseWriter, r *http.Request, user *User) RouteError { - err := user.ChangeAvatar(path) - if err != nil { - return InternalError(err, w, r) +func ChangeAvatar(path string, w http.ResponseWriter, r *http.Request, u *User) RouteError { + e := u.ChangeAvatar(path) + if e != nil { + return InternalError(e, w, r) } // Clean up the old avatar data, so we don't end up with too many dead files in /uploads/ - if len(user.RawAvatar) > 2 { - if user.RawAvatar[0] == '.' && user.RawAvatar[1] == '.' { - err := os.Remove("./uploads/avatar_" + strconv.Itoa(user.ID) + "_tmp" + user.RawAvatar[1:]) - if err != nil && !os.IsNotExist(err) { - LogWarning(err) - return LocalError("Something went wrong", w, r, user) + if len(u.RawAvatar) > 2 { + if u.RawAvatar[0] == '.' && u.RawAvatar[1] == '.' { + e := os.Remove("./uploads/avatar_" + strconv.Itoa(u.ID) + "_tmp" + u.RawAvatar[1:]) + if e != nil && !os.IsNotExist(e) { + LogWarning(e) + return LocalError("Something went wrong", w, r, u) } - err = os.Remove("./uploads/avatar_" + strconv.Itoa(user.ID) + "_w48" + user.RawAvatar[1:]) - if err != nil && !os.IsNotExist(err) { - LogWarning(err) - return LocalError("Something went wrong", w, r, user) + e = os.Remove("./uploads/avatar_" + strconv.Itoa(u.ID) + "_w48" + u.RawAvatar[1:]) + if e != nil && !os.IsNotExist(e) { + LogWarning(e) + return LocalError("Something went wrong", w, r, u) } } }