<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch release-2.7
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/c983689e8341ef53f703764ff5e7dacc61299e88">https://github.com/macports/macports-base/commit/c983689e8341ef53f703764ff5e7dacc61299e88</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/release-2.7 by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new c983689e Remember previous id lower bounds in *_to_obj
</span>c983689e is described below

<span style='display:block; white-space:pre;color:#808000;'>commit c983689e8341ef53f703764ff5e7dacc61299e88
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Tue May 25 19:32:51 2021 +1000

<span style='display:block; white-space:pre;color:#404040;'>    Remember previous id lower bounds in *_to_obj
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Doing a linear search starting at 0 in unique_name gets very slow when
</span><span style='display:block; white-space:pre;color:#404040;'>    there are a lot of objects in existence.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Fixes: https://trac.macports.org/ticket/56793
</span><span style='display:block; white-space:pre;color:#404040;'>    (cherry picked from commit fc212a0b550ed961d07c261c715ca83580deac56)
</span>---
 src/registry2.0/util.c | 31 +++++++++++++++++--------------
 src/registry2.0/util.h |  8 ++++----
 2 files changed, 21 insertions(+), 18 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/util.c b/src/registry2.0/util.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 3edd752d..536774b5 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/util.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/util.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -48,11 +48,11 @@
</span>  * `interp create` command, and is intended to generate names for created
  * objects of a similar nature.
  */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-char* unique_name(Tcl_Interp* interp, char* prefix, int* lower_bound) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char* unique_name(Tcl_Interp* interp, char* prefix, unsigned int* lower_bound) {
</span>     size_t result_size = strlen(prefix) + TCL_INTEGER_SPACE + 1;
     char* result = malloc(result_size);
     Tcl_CmdInfo info;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    unsigned int i;
</span>     if (!result)
         return NULL;
     if (lower_bound == NULL) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -60,6 +60,9 @@ char* unique_name(Tcl_Interp* interp, char* prefix, int* lower_bound) {
</span>     } else {
         i = *lower_bound;
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    /* XXX Technically an infinite loop if all possible names are taken
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       - just assuming we won't use up all 4 billion, since performance
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       is going to become abysmal before we get there anyway. */
</span>     for (; ; i++) {
         snprintf(result, result_size, "%s%d", prefix, i);
         if (Tcl_GetCommandInfo(interp, result, &info) == 0) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -287,9 +290,10 @@ int recast(void* userdata, cast_function* fn, void* castcalldata,
</span> }
 
 int entry_to_obj(Tcl_Interp* interp, Tcl_Obj** obj, reg_entry* entry,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        int* lower_bound, reg_error* errPtr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        void* param UNUSED, reg_error* errPtr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    static unsigned int lower_bound = 0;
</span>     if (entry->proc == NULL) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        char* name = unique_name(interp, "::registry::entry", lower_bound);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        char* name = unique_name(interp, "::registry::entry", &lower_bound);
</span>         if (!name) {
             return 0;
         }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -304,9 +308,10 @@ int entry_to_obj(Tcl_Interp* interp, Tcl_Obj** obj, reg_entry* entry,
</span> }
 
 int file_to_obj(Tcl_Interp* interp, Tcl_Obj** obj, reg_file* file,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        int* lower_bound, reg_error* errPtr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        void* param UNUSED, reg_error* errPtr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    static unsigned int lower_bound = 0;
</span>     if (file->proc == NULL) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        char* name = unique_name(interp, "::registry::file", lower_bound);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        char* name = unique_name(interp, "::registry::file", &lower_bound);
</span>         if (!name) {
             return 0;
         }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -321,9 +326,10 @@ int file_to_obj(Tcl_Interp* interp, Tcl_Obj** obj, reg_file* file,
</span> }
 
 int portgroup_to_obj(Tcl_Interp* interp, Tcl_Obj** obj, reg_portgroup* portgroup,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        int* lower_bound, reg_error* errPtr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        void* param UNUSED, reg_error* errPtr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    static unsigned int lower_bound = 0;
</span>     if (portgroup->proc == NULL) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        char* name = unique_name(interp, "::registry::portgroup", lower_bound);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        char* name = unique_name(interp, "::registry::portgroup", &lower_bound);
</span>         if (!name) {
             return 0;
         }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -339,22 +345,19 @@ int portgroup_to_obj(Tcl_Interp* interp, Tcl_Obj** obj, reg_portgroup* portgroup
</span> 
 int list_entry_to_obj(Tcl_Interp* interp, Tcl_Obj*** objs,
         reg_entry** entries, int entry_count, reg_error* errPtr) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    int lower_bound = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return recast(interp, (cast_function*)entry_to_obj, &lower_bound, NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return recast(interp, (cast_function*)entry_to_obj, NULL, NULL,
</span>             (void***)objs, (void**)entries, entry_count, errPtr);
 }
 
 int list_file_to_obj(Tcl_Interp* interp, Tcl_Obj*** objs,
         reg_file** files, int file_count, reg_error* errPtr) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    int lower_bound = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return recast(interp, (cast_function*)file_to_obj, &lower_bound, NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return recast(interp, (cast_function*)file_to_obj, NULL, NULL,
</span>             (void***)objs, (void**)files, file_count, errPtr);
 }
 
 int list_portgroup_to_obj(Tcl_Interp* interp, Tcl_Obj*** objs,
         reg_portgroup** portgroups, int portgroup_count, reg_error* errPtr) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    int lower_bound = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return recast(interp, (cast_function*)portgroup_to_obj, &lower_bound, NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return recast(interp, (cast_function*)portgroup_to_obj, NULL, NULL,
</span>             (void***)objs, (void**)portgroups, portgroup_count, errPtr);
 }
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/util.h b/src/registry2.0/util.h
</span><span style='display:block; white-space:pre;color:#808080;'>index c9905914..07b0bc71 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/util.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/util.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -47,7 +47,7 @@ typedef struct {
</span> 
 #define END_FLAGS 0
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-char* unique_name(Tcl_Interp* interp, char* prefix, int* lower_bound);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char* unique_name(Tcl_Interp* interp, char* prefix, unsigned int* lower_bound);
</span> 
 int parse_flags(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[], int* start,
         option_spec options[], int* flags);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -72,15 +72,15 @@ int recast(void* userdata, cast_function* fn, void* castcalldata,
</span>         reg_error* errPtr);
 
 int entry_to_obj(Tcl_Interp* interp, Tcl_Obj** obj, reg_entry* entry,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        int* lower_bound, reg_error* errPtr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        void* param UNUSED, reg_error* errPtr);
</span> int list_entry_to_obj(Tcl_Interp* interp, Tcl_Obj*** objs,
         reg_entry** entries, int entry_count, reg_error* errPtr);
 int file_to_obj(Tcl_Interp* interp, Tcl_Obj** ibj, reg_file* file,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        int* lower_bound, reg_error* errPtr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        void* param UNUSED, reg_error* errPtr);
</span> int list_file_to_obj(Tcl_Interp* interp, Tcl_Obj*** objs,
         reg_file** files, int file_count, reg_error* errPtr);
 int portgroup_to_obj(Tcl_Interp* interp, Tcl_Obj** ibj, reg_portgroup* portgroup,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        int* lower_bound, reg_error* errPtr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        void* param UNUSED, reg_error* errPtr);
</span> int list_portgroup_to_obj(Tcl_Interp* interp, Tcl_Obj*** objs,
         reg_portgroup** portgroups, int portgroup_count, reg_error* errPtr);
 
</pre><pre style='margin:0'>

</pre>