Show More
@@ -41,6 +41,10 b' typedef struct {' | |||||
41 | */ |
|
41 | */ | |
42 | typedef struct { |
|
42 | typedef struct { | |
43 | nodetreenode *nodes; |
|
43 | nodetreenode *nodes; | |
|
44 | unsigned ntlength; /* # nodes in use */ | |||
|
45 | unsigned ntcapacity; /* # nodes allocated */ | |||
|
46 | int ntdepth; /* maximum depth of tree */ | |||
|
47 | int ntsplits; /* # splits performed */ | |||
44 | } nodetree; |
|
48 | } nodetree; | |
45 |
|
49 | |||
46 | /* |
|
50 | /* | |
@@ -68,10 +72,6 b' typedef struct {' | |||||
68 | PyObject *headrevs; /* cache, invalidated on changes */ |
|
72 | PyObject *headrevs; /* cache, invalidated on changes */ | |
69 | PyObject *filteredrevs;/* filtered revs set */ |
|
73 | PyObject *filteredrevs;/* filtered revs set */ | |
70 | nodetree *nt; /* base-16 trie */ |
|
74 | nodetree *nt; /* base-16 trie */ | |
71 | unsigned ntlength; /* # nodes in use */ |
|
|||
72 | unsigned ntcapacity; /* # nodes allocated */ |
|
|||
73 | int ntdepth; /* maximum depth of tree */ |
|
|||
74 | int ntsplits; /* # splits performed */ |
|
|||
75 | int ntrev; /* last rev scanned */ |
|
75 | int ntrev; /* last rev scanned */ | |
76 | int ntlookups; /* # lookups */ |
|
76 | int ntlookups; /* # lookups */ | |
77 | int ntmisses; /* # lookups that miss the cache */ |
|
77 | int ntmisses; /* # lookups that miss the cache */ | |
@@ -332,8 +332,6 b' static void _index_clearcaches(indexObje' | |||||
332 | static PyObject *index_clearcaches(indexObject *self) |
|
332 | static PyObject *index_clearcaches(indexObject *self) | |
333 | { |
|
333 | { | |
334 | _index_clearcaches(self); |
|
334 | _index_clearcaches(self); | |
335 | self->ntlength = self->ntcapacity = 0; |
|
|||
336 | self->ntdepth = self->ntsplits = 0; |
|
|||
337 | self->ntrev = -1; |
|
335 | self->ntrev = -1; | |
338 | self->ntlookups = self->ntmisses = 0; |
|
336 | self->ntlookups = self->ntmisses = 0; | |
339 | Py_RETURN_NONE; |
|
337 | Py_RETURN_NONE; | |
@@ -370,13 +368,15 b' static PyObject *index_stats(indexObject' | |||||
370 | if (self->raw_length != self->length - 1) |
|
368 | if (self->raw_length != self->length - 1) | |
371 | istat(raw_length, "revs on disk"); |
|
369 | istat(raw_length, "revs on disk"); | |
372 | istat(length, "revs in memory"); |
|
370 | istat(length, "revs in memory"); | |
373 | istat(ntcapacity, "node trie capacity"); |
|
|||
374 | istat(ntdepth, "node trie depth"); |
|
|||
375 | istat(ntlength, "node trie count"); |
|
|||
376 | istat(ntlookups, "node trie lookups"); |
|
371 | istat(ntlookups, "node trie lookups"); | |
377 | istat(ntmisses, "node trie misses"); |
|
372 | istat(ntmisses, "node trie misses"); | |
378 | istat(ntrev, "node trie last rev scanned"); |
|
373 | istat(ntrev, "node trie last rev scanned"); | |
379 | istat(ntsplits, "node trie splits"); |
|
374 | if (self->nt) { | |
|
375 | istat(nt->ntcapacity, "node trie capacity"); | |||
|
376 | istat(nt->ntdepth, "node trie depth"); | |||
|
377 | istat(nt->ntlength, "node trie count"); | |||
|
378 | istat(nt->ntsplits, "node trie splits"); | |||
|
379 | } | |||
380 |
|
380 | |||
381 | #undef istat |
|
381 | #undef istat | |
382 |
|
382 | |||
@@ -1017,23 +1017,24 b' static int nt_find(indexObject *self, co' | |||||
1017 |
|
1017 | |||
1018 | static int nt_new(indexObject *self) |
|
1018 | static int nt_new(indexObject *self) | |
1019 | { |
|
1019 | { | |
1020 | if (self->ntlength == self->ntcapacity) { |
|
1020 | nodetree *nt = self->nt; | |
1021 | if (self->ntcapacity >= INT_MAX / (sizeof(nodetreenode) * 2)) { |
|
1021 | if (nt->ntlength == nt->ntcapacity) { | |
|
1022 | if (nt->ntcapacity >= INT_MAX / (sizeof(nodetreenode) * 2)) { | |||
1022 | PyErr_SetString(PyExc_MemoryError, |
|
1023 | PyErr_SetString(PyExc_MemoryError, | |
1023 | "overflow in nt_new"); |
|
1024 | "overflow in nt_new"); | |
1024 | return -1; |
|
1025 | return -1; | |
1025 | } |
|
1026 | } | |
1026 |
|
|
1027 | nt->ntcapacity *= 2; | |
1027 |
|
|
1028 | nt->nodes = realloc(nt->nodes, | |
1028 |
|
|
1029 | nt->ntcapacity * sizeof(nodetreenode)); | |
1029 |
if ( |
|
1030 | if (nt->nodes == NULL) { | |
1030 | PyErr_SetString(PyExc_MemoryError, "out of memory"); |
|
1031 | PyErr_SetString(PyExc_MemoryError, "out of memory"); | |
1031 | return -1; |
|
1032 | return -1; | |
1032 | } |
|
1033 | } | |
1033 |
memset(& |
|
1034 | memset(&nt->nodes[nt->ntlength], 0, | |
1034 |
sizeof(nodetreenode) * ( |
|
1035 | sizeof(nodetreenode) * (nt->ntcapacity - nt->ntlength)); | |
1035 | } |
|
1036 | } | |
1036 |
return |
|
1037 | return nt->ntlength++; | |
1037 | } |
|
1038 | } | |
1038 |
|
1039 | |||
1039 | static int nt_insert(indexObject *self, const char *node, int rev) |
|
1040 | static int nt_insert(indexObject *self, const char *node, int rev) | |
@@ -1071,9 +1072,9 b' static int nt_insert(indexObject *self, ' | |||||
1071 | off = noff; |
|
1072 | off = noff; | |
1072 | n = &self->nt->nodes[off]; |
|
1073 | n = &self->nt->nodes[off]; | |
1073 | n->children[nt_level(oldnode, ++level)] = v; |
|
1074 | n->children[nt_level(oldnode, ++level)] = v; | |
1074 | if (level > self->ntdepth) |
|
1075 | if (level > self->nt->ntdepth) | |
1075 | self->ntdepth = level; |
|
1076 | self->nt->ntdepth = level; | |
1076 | self->ntsplits += 1; |
|
1077 | self->nt->ntsplits += 1; | |
1077 | } else { |
|
1078 | } else { | |
1078 | level += 1; |
|
1079 | level += 1; | |
1079 | off = v; |
|
1080 | off = v; | |
@@ -1101,20 +1102,22 b' static int nt_init(indexObject *self)' | |||||
1101 | PyErr_SetString(PyExc_ValueError, "overflow in nt_init"); |
|
1102 | PyErr_SetString(PyExc_ValueError, "overflow in nt_init"); | |
1102 | return -1; |
|
1103 | return -1; | |
1103 | } |
|
1104 | } | |
1104 | self->ntcapacity = self->raw_length < 4 |
|
1105 | self->nt->ntcapacity = self->raw_length < 4 | |
1105 | ? 4 : (int)self->raw_length / 2; |
|
1106 | ? 4 : (int)self->raw_length / 2; | |
1106 |
|
1107 | |||
1107 | self->nt->nodes = calloc(self->ntcapacity, sizeof(nodetreenode)); |
|
1108 | self->nt->nodes = calloc(self->nt->ntcapacity, sizeof(nodetreenode)); | |
1108 | if (self->nt->nodes == NULL) { |
|
1109 | if (self->nt->nodes == NULL) { | |
1109 | free(self->nt); |
|
1110 | free(self->nt); | |
1110 | self->nt = NULL; |
|
1111 | self->nt = NULL; | |
1111 | PyErr_NoMemory(); |
|
1112 | PyErr_NoMemory(); | |
1112 | return -1; |
|
1113 | return -1; | |
1113 | } |
|
1114 | } | |
1114 | self->ntlength = 1; |
|
|||
1115 | self->ntrev = (int)index_length(self); |
|
1115 | self->ntrev = (int)index_length(self); | |
1116 | self->ntlookups = 1; |
|
1116 | self->ntlookups = 1; | |
1117 | self->ntmisses = 0; |
|
1117 | self->ntmisses = 0; | |
|
1118 | self->nt->ntdepth = 0; | |||
|
1119 | self->nt->ntsplits = 0; | |||
|
1120 | self->nt->ntlength = 1; | |||
1118 | if (nt_insert(self, nullid, -1) == -1) { |
|
1121 | if (nt_insert(self, nullid, -1) == -1) { | |
1119 | free(self->nt->nodes); |
|
1122 | free(self->nt->nodes); | |
1120 | free(self->nt); |
|
1123 | free(self->nt); | |
@@ -1981,8 +1984,6 b' static int index_init(indexObject *self,' | |||||
1981 | self->inlined = inlined_obj && PyObject_IsTrue(inlined_obj); |
|
1984 | self->inlined = inlined_obj && PyObject_IsTrue(inlined_obj); | |
1982 | self->data = data_obj; |
|
1985 | self->data = data_obj; | |
1983 |
|
1986 | |||
1984 | self->ntlength = self->ntcapacity = 0; |
|
|||
1985 | self->ntdepth = self->ntsplits = 0; |
|
|||
1986 | self->ntlookups = self->ntmisses = 0; |
|
1987 | self->ntlookups = self->ntmisses = 0; | |
1987 | self->ntrev = -1; |
|
1988 | self->ntrev = -1; | |
1988 | Py_INCREF(self->data); |
|
1989 | Py_INCREF(self->data); |
General Comments 0
You need to be logged in to leave comments.
Login now