summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2017-01-10 22:35:34 (GMT)
committersebres <sebres@users.sourceforge.net>2017-01-10 22:35:34 (GMT)
commitca7dcb3b5163da655a13b5935c987b3a38067996 (patch)
treea43c7133284e35e54e5da976673905338d688d29
parent24889011ab71db02d158f21843b71cc3767859fd (diff)
downloadtcl-ca7dcb3b5163da655a13b5935c987b3a38067996.zip
tcl-ca7dcb3b5163da655a13b5935c987b3a38067996.tar.gz
tcl-ca7dcb3b5163da655a13b5935c987b3a38067996.tar.bz2
estimate token count by % char and format length (don't use fix TOK_CHAIN_BLOCK_SIZE by creation, minimized memory usage)
-rw-r--r--generic/tclClockFmt.c26
-rw-r--r--generic/tclDate.h2
2 files changed, 22 insertions, 6 deletions
diff --git a/generic/tclClockFmt.c b/generic/tclClockFmt.c
index 2873ff7..ac34e68 100644
--- a/generic/tclClockFmt.c
+++ b/generic/tclClockFmt.c
@@ -1080,14 +1080,30 @@ ClockGetOrParseScanFormat(
const char *strFmt;
register const char *p, *e, *cp;
+ e = strFmt = HashEntry4FmtScn(fss)->key.string;
+ e += strlen(strFmt);
+
+ /* estimate token count by % char and format length */
+ fss->scnTokC = 0;
+ p = strFmt;
+ while (p != e) {
+ if (*p++ == '%') fss->scnTokC++;
+ }
+ p = strFmt + fss->scnTokC * 2;
+ if (p < e) {
+ if ((e - p) < fss->scnTokC) {
+ fss->scnTokC += (e - p);
+ } else {
+ fss->scnTokC += fss->scnTokC;
+ }
+ }
+ fss->scnTokC++;
+
Tcl_MutexLock(&ClockFmtMutex);
- fss->scnTokC = CLOCK_MIN_TOK_CHAIN_BLOCK_SIZE;
- fss->scnTok =
- tok = ckalloc(sizeof(*tok) * CLOCK_MIN_TOK_CHAIN_BLOCK_SIZE);
+ fss->scnTok = tok = ckalloc(sizeof(*tok) * fss->scnTokC);
memset(tok, 0, sizeof(*(tok)));
- strFmt = HashEntry4FmtScn(fss)->key.string;
- for (e = p = strFmt, e += strlen(strFmt); p != e; p++) {
+ for (p = strFmt; p != e; p++) {
switch (*p) {
case '%':
if (1) {
diff --git a/generic/tclDate.h b/generic/tclDate.h
index 00bd234..9e1c506 100644
--- a/generic/tclDate.h
+++ b/generic/tclDate.h
@@ -355,7 +355,7 @@ typedef enum _MERIDIAN {
#define CLOCK_FMT_SCN_STORAGE_GC_SIZE 32
-#define CLOCK_MIN_TOK_CHAIN_BLOCK_SIZE 12
+#define CLOCK_MIN_TOK_CHAIN_BLOCK_SIZE 2
typedef struct ClockScanToken ClockScanToken;