… | |
… | |
2 | * shstr.C |
2 | * shstr.C |
3 | */ |
3 | */ |
4 | |
4 | |
5 | #include <cstring> |
5 | #include <cstring> |
6 | #include <cstdlib> |
6 | #include <cstdlib> |
|
|
7 | |
|
|
8 | #include <glib.h> |
7 | |
9 | |
8 | #include <tr1/unordered_set> |
10 | #include <tr1/unordered_set> |
9 | |
11 | |
10 | #include "shstr.h" |
12 | #include "shstr.h" |
11 | #include "util.h" |
13 | #include "util.h" |
… | |
… | |
16 | |
18 | |
17 | static const char *makevec (const char *s) |
19 | static const char *makevec (const char *s) |
18 | { |
20 | { |
19 | int len = strlen (s); |
21 | int len = strlen (s); |
20 | |
22 | |
21 | const char *v = (const char *)(2 + (int *)malloc (sizeof (int) * 2 + len + 1)); |
23 | const char *v = (const char *)(2 + (int *)g_slice_alloc (sizeof (int) * 2 + len + 1)); |
22 | |
24 | |
23 | shstr::length (v) = len; |
25 | shstr::length (v) = len; |
24 | shstr::refcnt (v) = 1; |
26 | shstr::refcnt (v) = 1; |
25 | |
27 | |
26 | memcpy ((char *)v, s, len + 1); |
28 | memcpy ((char *)v, s, len + 1); |
… | |
… | |
74 | |
76 | |
75 | if (i == ht.end ()) |
77 | if (i == ht.end ()) |
76 | i = ht.begin (); |
78 | i = ht.begin (); |
77 | |
79 | |
78 | // go through all strings roughly once every 4 minutes |
80 | // go through all strings roughly once every 4 minutes |
79 | int n = ht.size () / 256 + 16; |
81 | int n = ht.size () / 256 + 16000; |
80 | |
82 | |
81 | for (;;) |
83 | for (;;) |
82 | { |
84 | { |
83 | if (i == ht.end ()) |
85 | if (i == ht.end ()) |
84 | { |
86 | { |
… | |
… | |
91 | { |
93 | { |
92 | HT::iterator o = i++; |
94 | HT::iterator o = i++; |
93 | const char *s = *o; |
95 | const char *s = *o; |
94 | ht.erase (o); |
96 | ht.erase (o); |
95 | |
97 | |
|
|
98 | int len = length (s); |
|
|
99 | |
96 | //printf ("GC %4d %3d %d >%s<%d\n", (int)ht.size (), n, shstr::refcnt (s), s, shstr::length (s)); |
100 | //printf ("GC %4d %3d %d >%s<%d\n", (int)ht.size (), n, shstr::refcnt (s), s, shstr::length (s)); |
97 | free (-2 + (int *)s); |
101 | g_slice_free1 (sizeof (int) * 2 + length (s) + 1, -2 + (int *)s); |
98 | } |
102 | } |
99 | else |
103 | else |
100 | ++i; |
104 | ++i; |
101 | } |
105 | } |
102 | |
106 | |