Closed
Bug 563345
Opened 15 years ago
Closed 15 years ago
using js::HashMap for JSRuntime::threads
Categories
(Core :: JavaScript Engine, enhancement)
Tracking
()
RESOLVED
FIXED
People
(Reporter: igor, Assigned: igor)
References
Details
(Whiteboard: fixed-in-tracemonkey)
Attachments
(1 file, 1 obsolete file)
|
18.40 KB,
patch
|
luke
:
review+
|
Details | Diff | Splinter Review |
The attached patch replaces JSDHashTable with js::HasmMap for JSRuntime::threads. The patch also adds a special iterator to loop over all JSThreadData instances that also works in the !JS_THREADSAFE case to have less ifdef #JS_THREADSAFE in the code. Currently there is only one such case, but for the bug 516832 I will one or two extra threaddata iterations.
The patch assumes that it is safe to use the range iterator on a hashmap where the init method has failed. If this is accidental and not by design, then I will update the patch to add HashMap::isInitialized method.
| Assignee | ||
Comment 1•15 years ago
|
||
Attachment #443104 -
Flags: review?(lw)
Updated•15 years ago
|
Attachment #443104 -
Flags: review?(lw) → review+
Comment 2•15 years ago
|
||
Comment on attachment 443104 [details] [diff] [review]
v1
Mmmm, so much simpler! Those _destroyer/_purger/_marker callbacks have been annoying me for a while; down with inversion of control!
>+ unsigned generation = rt->threads.generation();
> JS_UNLOCK_GC(rt);
> thread = NewThread(id);
> if (!thread)
> return NULL;
> JS_LOCK_GC(rt);
> js_WaitForGC(rt);
>- entry = (JSThreadsHashEntry *)
>- JS_DHashTableOperate(&rt->threads, (const void *) id,
>- JS_DHASH_ADD);
>- if (!entry) {
>+ if (generation != rt->threads.generation()) {
>+ p = rt->threads.lookupForAdd(id);
>+
>+ /* Another thread cannot add an entry for id. */
>+ JS_ASSERT(!p);
>+ }
>+ if (!rt->threads.add(p, id, thread)) {
This review assumes a satisfactory resolution of bug 563326.
>+ for (JSThread::Map::Range i = rt->threads.all(); !i.empty(); i.popFront()) {
>+ JSThread *thread = i.front().value;
>+ JS_ASSERT(JS_CLIST_IS_EMPTY(&thread->contextList));
>+ DestroyThread(thread);
>+ }
Perhaps (here and in the other loops) 'r' (or 'e' for enums) instead of 'i'; 'i' makes me think 'iterator' and 'iterator.front' is confusing.
>+ for (JSThread::Map::Enum i(cx->runtime->threads);
>+ !i.empty();
>+ i.popFront()) {
This looks good, but I just noticed that Enum's constructor was not made 'explicit' in bug 515812. Could you add that in this patch?
>+/* Default hashing policies. */
Perhaps a newline between this and the next?
>+template <class Key, size_t shift = tl::FloorLog2<sizeof(void *)>::result>
Nice
>+ static uint32 hash(const Lookup &l) {
>+ /* Hash if can implicitly cast to hash number type. */
>+ return uint32((size_t) l >> shift);
>+ }
Here you are casting l to size_t, even if l is not implicitly convertible. For the comment to be correct, you need something more like:
static uint32 hash(const Lookup &l) {
/* Hash if can implicitly cast to hash number type. */
size_t tmp = l;
return uint32(tmp >> shift);
}
Alternatively, several times I've wanted to add the following to jstl.h, but have been too lazy:
template <class T, class U>
static inline T
implicit_cast(const U &u)
{
T t = u;
return t;
}
which would allow:
return uint32(implicit_cast<size_t>(l) >> shift);
Either way.
| Assignee | ||
Comment 3•15 years ago
|
||
The new patch updates for the changes in the proposed patch from the bug 563326. I replaced the thread id from jsword to void *. This avoids the need to have DefaultShiftHasher since the pointer specialization of DEfaultHasher would do the job of shifting out zero bits just as well. I also added initialized() method to check is the table was successfully initialized. This way js_FinishThreads does not need to rely on range enumeration working for the not initialized map.
Attachment #443104 -
Attachment is obsolete: true
Attachment #444048 -
Flags: review?(lw)
Comment 4•15 years ago
|
||
Comment on attachment 444048 [details] [diff] [review]
v2
Looks good.
Attachment #444048 -
Flags: review?(lw) → review+
| Assignee | ||
Comment 5•15 years ago
|
||
Whiteboard: fixed-in-tracemonkey
| Assignee | ||
Comment 6•15 years ago
|
||
Robert Sayre - this has been backed out. What was the reason for that?
Whiteboard: fixed-in-tracemonkey
| Assignee | ||
Comment 7•15 years ago
|
||
Repeating the question since I forgot to CC Rob:
> this has been backed out. What was the reason for that?
Comment 8•15 years ago
|
||
(In reply to comment #7)
> Repeating the question since I forgot to CC Rob:
>
> > this has been backed out. What was the reason for that?
Rats, I forgot to write this note.
Something regressed our tp4 nubmers, and I'm trying to find it.
Comment 9•15 years ago
|
||
here is XP Tp4 private bytes increasing by 100% or so:
http://bit.ly/9zdHmS
| Assignee | ||
Comment 10•15 years ago
|
||
(In reply to comment #9)
> here is XP Tp4 private bytes increasing by 100% or so:
>
> http://bit.ly/9zdHmS
As far as I can see from the numbers the increase happens before the bug 563326. Yet that bug is still in the tree.
Comment 11•15 years ago
|
||
(In reply to comment #10)
> (In reply to comment #9)
> > here is XP Tp4 private bytes increasing by 100% or so:
> >
> > http://bit.ly/9zdHmS
>
> As far as I can see from the numbers the increase happens before the bug
> 563326. Yet that bug is still in the tree.
The numbers seem to have gone back down, so I think either backing out this bug, or bug 559408 did the trick. It's hard to tell, because the tree was burning on all debug builds when you checked this in.
| Assignee | ||
Comment 12•15 years ago
|
||
I will try to reland this than.
| Assignee | ||
Comment 13•15 years ago
|
||
Whiteboard: fixed-in-tracemonkey
Comment 14•15 years ago
|
||
Status: NEW → RESOLVED
Closed: 15 years ago
Resolution: --- → FIXED
You need to log in
before you can comment on or make changes to this bug.
Description
•