<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository macports-base.
</pre>
<p><a href="https://github.com/macports/macports-base/commit/fc212a0b550ed961d07c261c715ca83580deac56">https://github.com/macports/macports-base/commit/fc212a0b550ed961d07c261c715ca83580deac56</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new fc212a0b Remember previous id lower bounds in *_to_obj
</span>fc212a0b is described below
<span style='display:block; white-space:pre;color:#808000;'>commit fc212a0b550ed961d07c261c715ca83580deac56
</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>---
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>