author | mr |
Tue, 29 Oct 2019 13:52:04 -0700 | |
changeset 58850 | f4290bf1cc21 |
parent 58579 | 05dd6144d434 |
child 58679 | 9c3209ff7550 |
child 59156 | 14fa9e70ae71 |
permissions | -rw-r--r-- |
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
1 |
/* |
54517
c201ca660afd
8222034: Thread-SMR functions should be updated to remove work around
dcubed
parents:
52877
diff
changeset
|
2 |
* Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. |
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
4 |
* |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
8 |
* |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
13 |
* accompanied this code). |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
14 |
* |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
15 |
* You should have received a copy of the GNU General Public License version |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation, |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
18 |
* |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
21 |
* questions. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
22 |
* |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
23 |
*/ |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
24 |
|
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
25 |
#include "precompiled.hpp" |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
26 |
#include "logging/logStream.hpp" |
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
27 |
#include "memory/allocation.inline.hpp" |
49192
6734eeef4283
8198474: Move JNIHandles::resolve into jniHandles.inline.hpp
kbarrett
parents:
48382
diff
changeset
|
28 |
#include "runtime/jniHandles.inline.hpp" |
58340
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
29 |
#include "runtime/sharedRuntime.hpp" |
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
30 |
#include "runtime/thread.inline.hpp" |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
31 |
#include "runtime/threadSMR.inline.hpp" |
52877
9e041366c764
8214850: Rename vm_operations.?pp files to vmOperations.?pp files
tschatzl
parents:
52452
diff
changeset
|
32 |
#include "runtime/vmOperations.hpp" |
58340
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
33 |
#include "services/threadIdTable.hpp" |
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
34 |
#include "services/threadService.hpp" |
49476
1f904e305a05
8195109: ServiceUtil::visible_oop is not needed anymore
cjplummer
parents:
49192
diff
changeset
|
35 |
#include "utilities/copy.hpp" |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
36 |
#include "utilities/globalDefinitions.hpp" |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
37 |
#include "utilities/ostream.hpp" |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
38 |
#include "utilities/resourceHash.hpp" |
49476
1f904e305a05
8195109: ServiceUtil::visible_oop is not needed anymore
cjplummer
parents:
49192
diff
changeset
|
39 |
#include "utilities/vmError.hpp" |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
40 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
41 |
// The '_cnt', '_max' and '_times" fields are enabled via |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
42 |
// -XX:+EnableThreadSMRStatistics: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
43 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
44 |
// # of parallel threads in _delete_lock->wait(). |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
45 |
// Impl note: Hard to imagine > 64K waiting threads so this could be 16-bit, |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
46 |
// but there is no nice 16-bit _FORMAT support. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
47 |
uint ThreadsSMRSupport::_delete_lock_wait_cnt = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
48 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
49 |
// Max # of parallel threads in _delete_lock->wait(). |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
50 |
// Impl note: See _delete_lock_wait_cnt note. |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
51 |
uint ThreadsSMRSupport::_delete_lock_wait_max = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
52 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
53 |
// Flag to indicate when an _delete_lock->notify() is needed. |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
54 |
// Impl note: See _delete_lock_wait_cnt note. |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
55 |
volatile uint ThreadsSMRSupport::_delete_notify = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
56 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
57 |
// # of threads deleted over VM lifetime. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
58 |
// Impl note: Atomically incremented over VM lifetime so use unsigned for more |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
59 |
// range. Unsigned 64-bit would be more future proof, but 64-bit atomic inc |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
60 |
// isn't available everywhere (or is it?). |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
61 |
volatile uint ThreadsSMRSupport::_deleted_thread_cnt = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
62 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
63 |
// Max time in millis to delete a thread. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
64 |
// Impl note: 16-bit might be too small on an overloaded machine. Use |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
65 |
// unsigned since this is a time value. Set via Atomic::cmpxchg() in a |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
66 |
// loop for correctness. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
67 |
volatile uint ThreadsSMRSupport::_deleted_thread_time_max = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
68 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
69 |
// Cumulative time in millis to delete threads. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
70 |
// Impl note: Atomically added to over VM lifetime so use unsigned for more |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
71 |
// range. Unsigned 64-bit would be more future proof, but 64-bit atomic inc |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
72 |
// isn't available everywhere (or is it?). |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
73 |
volatile uint ThreadsSMRSupport::_deleted_thread_times = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
74 |
|
52452 | 75 |
// The bootstrap list is empty and cannot be freed. |
76 |
ThreadsList ThreadsSMRSupport::_bootstrap_list = ThreadsList(0); |
|
77 |
||
78 |
// This is the VM's current "threads list" and it contains all of |
|
79 |
// the JavaThreads the VM considers to be alive at this moment in |
|
80 |
// time. The other ThreadsList objects in the VM contain past |
|
81 |
// snapshots of the "threads list". _java_thread_list is initially |
|
82 |
// set to _bootstrap_list so that we can detect when we have a very |
|
83 |
// early use of a ThreadsListHandle. |
|
84 |
ThreadsList* volatile ThreadsSMRSupport::_java_thread_list = &_bootstrap_list; |
|
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
85 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
86 |
// # of ThreadsLists allocated over VM lifetime. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
87 |
// Impl note: We allocate a new ThreadsList for every thread create and |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
88 |
// every thread delete so we need a bigger type than the |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
89 |
// _deleted_thread_cnt field. |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
90 |
uint64_t ThreadsSMRSupport::_java_thread_list_alloc_cnt = 1; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
91 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
92 |
// # of ThreadsLists freed over VM lifetime. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
93 |
// Impl note: See _java_thread_list_alloc_cnt note. |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
94 |
uint64_t ThreadsSMRSupport::_java_thread_list_free_cnt = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
95 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
96 |
// Max size ThreadsList allocated. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
97 |
// Impl note: Max # of threads alive at one time should fit in unsigned 32-bit. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
98 |
uint ThreadsSMRSupport::_java_thread_list_max = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
99 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
100 |
// Max # of nested ThreadsLists for a thread. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
101 |
// Impl note: Hard to imagine > 64K nested ThreadsLists so this could be |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
102 |
// 16-bit, but there is no nice 16-bit _FORMAT support. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
103 |
uint ThreadsSMRSupport::_nested_thread_list_max = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
104 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
105 |
// # of ThreadsListHandles deleted over VM lifetime. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
106 |
// Impl note: Atomically incremented over VM lifetime so use unsigned for |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
107 |
// more range. There will be fewer ThreadsListHandles than threads so |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
108 |
// unsigned 32-bit should be fine. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
109 |
volatile uint ThreadsSMRSupport::_tlh_cnt = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
110 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
111 |
// Max time in millis to delete a ThreadsListHandle. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
112 |
// Impl note: 16-bit might be too small on an overloaded machine. Use |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
113 |
// unsigned since this is a time value. Set via Atomic::cmpxchg() in a |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
114 |
// loop for correctness. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
115 |
volatile uint ThreadsSMRSupport::_tlh_time_max = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
116 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
117 |
// Cumulative time in millis to delete ThreadsListHandles. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
118 |
// Impl note: Atomically added to over VM lifetime so use unsigned for more |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
119 |
// range. Unsigned 64-bit would be more future proof, but 64-bit atomic inc |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
120 |
// isn't available everywhere (or is it?). |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
121 |
volatile uint ThreadsSMRSupport::_tlh_times = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
122 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
123 |
ThreadsList* ThreadsSMRSupport::_to_delete_list = NULL; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
124 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
125 |
// # of parallel ThreadsLists on the to-delete list. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
126 |
// Impl note: Hard to imagine > 64K ThreadsLists needing to be deleted so |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
127 |
// this could be 16-bit, but there is no nice 16-bit _FORMAT support. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
128 |
uint ThreadsSMRSupport::_to_delete_list_cnt = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
129 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
130 |
// Max # of parallel ThreadsLists on the to-delete list. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
131 |
// Impl note: See _to_delete_list_cnt note. |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
132 |
uint ThreadsSMRSupport::_to_delete_list_max = 0; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
133 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
134 |
// 'inline' functions first so the definitions are before first use: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
135 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
136 |
inline void ThreadsSMRSupport::add_deleted_thread_times(uint add_value) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
137 |
Atomic::add(add_value, &_deleted_thread_times); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
138 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
139 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
140 |
inline void ThreadsSMRSupport::inc_deleted_thread_cnt() { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
141 |
Atomic::inc(&_deleted_thread_cnt); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
142 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
143 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
144 |
inline void ThreadsSMRSupport::inc_java_thread_list_alloc_cnt() { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
145 |
_java_thread_list_alloc_cnt++; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
146 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
147 |
|
52452 | 148 |
inline bool ThreadsSMRSupport::is_bootstrap_list(ThreadsList* list) { |
149 |
return list == &_bootstrap_list; |
|
150 |
} |
|
151 |
||
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
152 |
inline void ThreadsSMRSupport::update_deleted_thread_time_max(uint new_value) { |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
153 |
while (true) { |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
154 |
uint cur_value = _deleted_thread_time_max; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
155 |
if (new_value <= cur_value) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
156 |
// No need to update max value so we're done. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
157 |
break; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
158 |
} |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
159 |
if (Atomic::cmpxchg(new_value, &_deleted_thread_time_max, cur_value) == cur_value) { |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
160 |
// Updated max value so we're done. Otherwise try it all again. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
161 |
break; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
162 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
163 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
164 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
165 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
166 |
inline void ThreadsSMRSupport::update_java_thread_list_max(uint new_value) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
167 |
if (new_value > _java_thread_list_max) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
168 |
_java_thread_list_max = new_value; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
169 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
170 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
171 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
172 |
inline ThreadsList* ThreadsSMRSupport::xchg_java_thread_list(ThreadsList* new_list) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
173 |
return (ThreadsList*)Atomic::xchg(new_list, &_java_thread_list); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
174 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
175 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
176 |
// Hash table of pointers found by a scan. Used for collecting hazard |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
177 |
// pointers (ThreadsList references). Also used for collecting JavaThreads |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
178 |
// that are indirectly referenced by hazard ptrs. An instance of this |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
179 |
// class only contains one type of pointer. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
180 |
// |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
181 |
class ThreadScanHashtable : public CHeapObj<mtThread> { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
182 |
private: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
183 |
static bool ptr_equals(void * const& s1, void * const& s2) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
184 |
return s1 == s2; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
185 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
186 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
187 |
static unsigned int ptr_hash(void * const& s1) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
188 |
// 2654435761 = 2^32 * Phi (golden ratio) |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
189 |
return (unsigned int)(((uint32_t)(uintptr_t)s1) * 2654435761u); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
190 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
191 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
192 |
int _table_size; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
193 |
// ResourceHashtable SIZE is specified at compile time so our |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
194 |
// dynamic _table_size is unused for now; 1031 is the first prime |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
195 |
// after 1024. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
196 |
typedef ResourceHashtable<void *, int, &ThreadScanHashtable::ptr_hash, |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
197 |
&ThreadScanHashtable::ptr_equals, 1031, |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
198 |
ResourceObj::C_HEAP, mtThread> PtrTable; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
199 |
PtrTable * _ptrs; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
200 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
201 |
public: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
202 |
// ResourceHashtable is passed to various functions and populated in |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
203 |
// different places so we allocate it using C_HEAP to make it immune |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
204 |
// from any ResourceMarks that happen to be in the code paths. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
205 |
ThreadScanHashtable(int table_size) : _table_size(table_size), _ptrs(new (ResourceObj::C_HEAP, mtThread) PtrTable()) {} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
206 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
207 |
~ThreadScanHashtable() { delete _ptrs; } |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
208 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
209 |
bool has_entry(void *pointer) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
210 |
int *val_ptr = _ptrs->get(pointer); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
211 |
return val_ptr != NULL && *val_ptr == 1; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
212 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
213 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
214 |
void add_entry(void *pointer) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
215 |
_ptrs->put(pointer, 1); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
216 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
217 |
}; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
218 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
219 |
// Closure to gather JavaThreads indirectly referenced by hazard ptrs |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
220 |
// (ThreadsList references) into a hash table. This closure handles part 2 |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
221 |
// of the dance - adding all the JavaThreads referenced by the hazard |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
222 |
// pointer (ThreadsList reference) to the hash table. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
223 |
// |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
224 |
class AddThreadHazardPointerThreadClosure : public ThreadClosure { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
225 |
private: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
226 |
ThreadScanHashtable *_table; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
227 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
228 |
public: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
229 |
AddThreadHazardPointerThreadClosure(ThreadScanHashtable *table) : _table(table) {} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
230 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
231 |
virtual void do_thread(Thread *thread) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
232 |
if (!_table->has_entry((void*)thread)) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
233 |
// The same JavaThread might be on more than one ThreadsList or |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
234 |
// more than one thread might be using the same ThreadsList. In |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
235 |
// either case, we only need a single entry for a JavaThread. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
236 |
_table->add_entry((void*)thread); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
237 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
238 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
239 |
}; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
240 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
241 |
// Closure to gather JavaThreads indirectly referenced by hazard ptrs |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
242 |
// (ThreadsList references) into a hash table. This closure handles part 1 |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
243 |
// of the dance - hazard ptr chain walking and dispatch to another |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
244 |
// closure. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
245 |
// |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
246 |
class ScanHazardPtrGatherProtectedThreadsClosure : public ThreadClosure { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
247 |
private: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
248 |
ThreadScanHashtable *_table; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
249 |
public: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
250 |
ScanHazardPtrGatherProtectedThreadsClosure(ThreadScanHashtable *table) : _table(table) {} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
251 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
252 |
virtual void do_thread(Thread *thread) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
253 |
assert_locked_or_safepoint(Threads_lock); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
254 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
255 |
if (thread == NULL) return; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
256 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
257 |
// This code races with ThreadsSMRSupport::acquire_stable_list() which |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
258 |
// is lock-free so we have to handle some special situations. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
259 |
// |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
260 |
ThreadsList *current_list = NULL; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
261 |
while (true) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
262 |
current_list = thread->get_threads_hazard_ptr(); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
263 |
// No hazard ptr so nothing more to do. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
264 |
if (current_list == NULL) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
265 |
return; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
266 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
267 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
268 |
// If the hazard ptr is verified as stable (since it is not tagged), |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
269 |
// then it is safe to use. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
270 |
if (!Thread::is_hazard_ptr_tagged(current_list)) break; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
271 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
272 |
// The hazard ptr is tagged as not yet verified as being stable |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
273 |
// so we are racing with acquire_stable_list(). This exchange |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
274 |
// attempts to invalidate the hazard ptr. If we win the race, |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
275 |
// then we can ignore this unstable hazard ptr and the other |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
276 |
// thread will retry the attempt to publish a stable hazard ptr. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
277 |
// If we lose the race, then we retry our attempt to look at the |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
278 |
// hazard ptr. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
279 |
if (thread->cmpxchg_threads_hazard_ptr(NULL, current_list) == current_list) return; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
280 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
281 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
282 |
// The current JavaThread has a hazard ptr (ThreadsList reference) |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
283 |
// which might be _java_thread_list or it might be an older |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
284 |
// ThreadsList that has been removed but not freed. In either case, |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
285 |
// the hazard ptr is protecting all the JavaThreads on that |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
286 |
// ThreadsList. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
287 |
AddThreadHazardPointerThreadClosure add_cl(_table); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
288 |
current_list->threads_do(&add_cl); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
289 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
290 |
}; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
291 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
292 |
// Closure to gather hazard ptrs (ThreadsList references) into a hash table. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
293 |
// |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
294 |
class ScanHazardPtrGatherThreadsListClosure : public ThreadClosure { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
295 |
private: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
296 |
ThreadScanHashtable *_table; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
297 |
public: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
298 |
ScanHazardPtrGatherThreadsListClosure(ThreadScanHashtable *table) : _table(table) {} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
299 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
300 |
virtual void do_thread(Thread* thread) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
301 |
assert_locked_or_safepoint(Threads_lock); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
302 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
303 |
if (thread == NULL) return; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
304 |
ThreadsList *threads = thread->get_threads_hazard_ptr(); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
305 |
if (threads == NULL) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
306 |
return; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
307 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
308 |
// In this closure we always ignore the tag that might mark this |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
309 |
// hazard ptr as not yet verified. If we happen to catch an |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
310 |
// unverified hazard ptr that is subsequently discarded (not |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
311 |
// published), then the only side effect is that we might keep a |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
312 |
// to-be-deleted ThreadsList alive a little longer. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
313 |
threads = Thread::untag_hazard_ptr(threads); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
314 |
if (!_table->has_entry((void*)threads)) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
315 |
_table->add_entry((void*)threads); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
316 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
317 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
318 |
}; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
319 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
320 |
// Closure to print JavaThreads that have a hazard ptr (ThreadsList |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
321 |
// reference) that contains an indirect reference to a specific JavaThread. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
322 |
// |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
323 |
class ScanHazardPtrPrintMatchingThreadsClosure : public ThreadClosure { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
324 |
private: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
325 |
JavaThread *_thread; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
326 |
public: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
327 |
ScanHazardPtrPrintMatchingThreadsClosure(JavaThread *thread) : _thread(thread) {} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
328 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
329 |
virtual void do_thread(Thread *thread) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
330 |
assert_locked_or_safepoint(Threads_lock); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
331 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
332 |
if (thread == NULL) return; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
333 |
ThreadsList *current_list = thread->get_threads_hazard_ptr(); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
334 |
if (current_list == NULL) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
335 |
return; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
336 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
337 |
// If the hazard ptr is unverified, then ignore it. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
338 |
if (Thread::is_hazard_ptr_tagged(current_list)) return; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
339 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
340 |
// The current JavaThread has a hazard ptr (ThreadsList reference) |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
341 |
// which might be _java_thread_list or it might be an older |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
342 |
// ThreadsList that has been removed but not freed. In either case, |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
343 |
// the hazard ptr is protecting all the JavaThreads on that |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
344 |
// ThreadsList, but we only care about matching a specific JavaThread. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
345 |
JavaThreadIterator jti(current_list); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
346 |
for (JavaThread *p = jti.first(); p != NULL; p = jti.next()) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
347 |
if (p == _thread) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
348 |
log_debug(thread, smr)("tid=" UINTX_FORMAT ": ThreadsSMRSupport::smr_delete: thread1=" INTPTR_FORMAT " has a hazard pointer for thread2=" INTPTR_FORMAT, os::current_thread_id(), p2i(thread), p2i(_thread)); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
349 |
break; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
350 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
351 |
} |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
352 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
353 |
}; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
354 |
|
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
355 |
// Closure to determine if the specified JavaThread is found by |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
356 |
// threads_do(). |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
357 |
// |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
358 |
class VerifyHazardPtrThreadClosure : public ThreadClosure { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
359 |
private: |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
360 |
bool _found; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
361 |
Thread *_self; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
362 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
363 |
public: |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
364 |
VerifyHazardPtrThreadClosure(Thread *self) : _found(false), _self(self) {} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
365 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
366 |
bool found() const { return _found; } |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
367 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
368 |
virtual void do_thread(Thread *thread) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
369 |
if (thread == _self) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
370 |
_found = true; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
371 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
372 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
373 |
}; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
374 |
|
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
375 |
|
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
376 |
// Acquire a stable ThreadsList. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
377 |
// |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
378 |
void SafeThreadsListPtr::acquire_stable_list() { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
379 |
assert(_thread != NULL, "sanity check"); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
380 |
_needs_release = true; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
381 |
_previous = _thread->_threads_list_ptr; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
382 |
_thread->_threads_list_ptr = this; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
383 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
384 |
if (_thread->get_threads_hazard_ptr() == NULL) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
385 |
// The typical case is first. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
386 |
acquire_stable_list_fast_path(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
387 |
return; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
388 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
389 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
390 |
// The nested case is rare. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
391 |
acquire_stable_list_nested_path(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
392 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
393 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
394 |
// Fast path way to acquire a stable ThreadsList. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
395 |
// |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
396 |
void SafeThreadsListPtr::acquire_stable_list_fast_path() { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
397 |
assert(_thread != NULL, "sanity check"); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
398 |
assert(_thread->get_threads_hazard_ptr() == NULL, "sanity check"); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
399 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
400 |
ThreadsList* threads; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
401 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
402 |
// Stable recording of a hazard ptr for SMR. This code does not use |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
403 |
// locks so its use of the _smr_java_thread_list & _threads_hazard_ptr |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
404 |
// fields is racy relative to code that uses those fields with locks. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
405 |
// OrderAccess and Atomic functions are used to deal with those races. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
406 |
// |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
407 |
while (true) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
408 |
threads = ThreadsSMRSupport::get_java_thread_list(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
409 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
410 |
// Publish a tagged hazard ptr to denote that the hazard ptr is not |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
411 |
// yet verified as being stable. Due to the fence after the hazard |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
412 |
// ptr write, it will be sequentially consistent w.r.t. the |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
413 |
// sequentially consistent writes of the ThreadsList, even on |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
414 |
// non-multiple copy atomic machines where stores can be observed |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
415 |
// in different order from different observer threads. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
416 |
ThreadsList* unverified_threads = Thread::tag_hazard_ptr(threads); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
417 |
_thread->set_threads_hazard_ptr(unverified_threads); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
418 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
419 |
// If _smr_java_thread_list has changed, we have lost a race with |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
420 |
// Threads::add() or Threads::remove() and have to try again. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
421 |
if (ThreadsSMRSupport::get_java_thread_list() != threads) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
422 |
continue; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
423 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
424 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
425 |
// We try to remove the tag which will verify the hazard ptr as |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
426 |
// being stable. This exchange can race with a scanning thread |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
427 |
// which might invalidate the tagged hazard ptr to keep it from |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
428 |
// being followed to access JavaThread ptrs. If we lose the race, |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
429 |
// we simply retry. If we win the race, then the stable hazard |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
430 |
// ptr is officially published. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
431 |
if (_thread->cmpxchg_threads_hazard_ptr(threads, unverified_threads) == unverified_threads) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
432 |
break; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
433 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
434 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
435 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
436 |
// A stable hazard ptr has been published letting other threads know |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
437 |
// that the ThreadsList and the JavaThreads reachable from this list |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
438 |
// are protected and hence they should not be deleted until everyone |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
439 |
// agrees it is safe to do so. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
440 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
441 |
_list = threads; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
442 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
443 |
verify_hazard_ptr_scanned(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
444 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
445 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
446 |
// Acquire a nested stable ThreadsList; this is rare so it uses |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
447 |
// reference counting. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
448 |
// |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
449 |
void SafeThreadsListPtr::acquire_stable_list_nested_path() { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
450 |
assert(_thread != NULL, "sanity check"); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
451 |
assert(_thread->get_threads_hazard_ptr() != NULL, |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
452 |
"cannot have a NULL regular hazard ptr when acquiring a nested hazard ptr"); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
453 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
454 |
// The thread already has a hazard ptr (ThreadsList ref) so we need |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
455 |
// to create a nested ThreadsListHandle with the current ThreadsList |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
456 |
// since it might be different than our current hazard ptr. To remedy |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
457 |
// the situation, the ThreadsList pointed to by the pre-existing |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
458 |
// stable hazard ptr is reference counted before the hazard ptr may |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
459 |
// be released and moved to a new ThreadsList. The old ThreadsList |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
460 |
// is remembered in the ThreadsListHandle. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
461 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
462 |
ThreadsList* current_list = _previous->_list; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
463 |
if (EnableThreadSMRStatistics) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
464 |
_thread->inc_nested_threads_hazard_ptr_cnt(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
465 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
466 |
current_list->inc_nested_handle_cnt(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
467 |
_previous->_has_ref_count = true; // promote SafeThreadsListPtr to be reference counted |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
468 |
_thread->_threads_hazard_ptr = NULL; // clear the hazard ptr so we can go through the fast path below |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
469 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
470 |
if (EnableThreadSMRStatistics && _thread->nested_threads_hazard_ptr_cnt() > ThreadsSMRSupport::_nested_thread_list_max) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
471 |
ThreadsSMRSupport::_nested_thread_list_max = _thread->nested_threads_hazard_ptr_cnt(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
472 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
473 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
474 |
acquire_stable_list_fast_path(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
475 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
476 |
verify_hazard_ptr_scanned(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
477 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
478 |
log_debug(thread, smr)("tid=" UINTX_FORMAT ": SafeThreadsListPtr::acquire_stable_list: add nested list pointer to ThreadsList=" INTPTR_FORMAT, os::current_thread_id(), p2i(_list)); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
479 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
480 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
481 |
// Release a stable ThreadsList. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
482 |
// |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
483 |
void SafeThreadsListPtr::release_stable_list() { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
484 |
assert(_thread != NULL, "sanity check"); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
485 |
assert(_thread->_threads_list_ptr == this, "sanity check"); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
486 |
_thread->_threads_list_ptr = _previous; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
487 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
488 |
if (_has_ref_count) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
489 |
// If a SafeThreadsListPtr has been promoted to use reference counting |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
490 |
// due to nesting of ThreadsListHandles, then the reference count must be |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
491 |
// decremented, at which point it may be freed. The forgotten value of |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
492 |
// the list no longer matters at this point and should already be NULL. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
493 |
assert(_thread->get_threads_hazard_ptr() == NULL, "sanity check"); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
494 |
if (EnableThreadSMRStatistics) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
495 |
_thread->dec_nested_threads_hazard_ptr_cnt(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
496 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
497 |
_list->dec_nested_handle_cnt(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
498 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
499 |
log_debug(thread, smr)("tid=" UINTX_FORMAT ": SafeThreadsListPtr::release_stable_list: delete nested list pointer to ThreadsList=" INTPTR_FORMAT, os::current_thread_id(), p2i(_list)); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
500 |
} else { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
501 |
// The normal case: a leaf ThreadsListHandle. This merely requires setting |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
502 |
// the thread hazard ptr back to NULL. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
503 |
assert(_thread->get_threads_hazard_ptr() != NULL, "sanity check"); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
504 |
_thread->set_threads_hazard_ptr(NULL); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
505 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
506 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
507 |
// After releasing the hazard ptr, other threads may go ahead and |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
508 |
// free up some memory temporarily used by a ThreadsList snapshot. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
509 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
510 |
// We use double-check locking to reduce traffic on the system |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
511 |
// wide Thread-SMR delete_lock. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
512 |
if (ThreadsSMRSupport::delete_notify()) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
513 |
// An exiting thread might be waiting in smr_delete(); we need to |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
514 |
// check with delete_lock to be sure. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
515 |
ThreadsSMRSupport::release_stable_list_wake_up(_has_ref_count); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
516 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
517 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
518 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
519 |
// Verify that the stable hazard ptr used to safely keep threads |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
520 |
// alive is scanned by threads_do() which is a key piece of honoring |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
521 |
// the Thread-SMR protocol. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
522 |
void SafeThreadsListPtr::verify_hazard_ptr_scanned() { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
523 |
#ifdef ASSERT |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
524 |
assert(_list != NULL, "_list must not be NULL"); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
525 |
|
52452 | 526 |
if (ThreadsSMRSupport::is_bootstrap_list(_list)) { |
527 |
// We are early in VM bootstrapping so nothing to do here. |
|
528 |
return; |
|
529 |
} |
|
530 |
||
58579
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
531 |
if ( _thread == VM_Exit::shutdown_thread()) { |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
532 |
// The shutdown thread has removed itself from the Threads |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
533 |
// list and is safe to have a waiver from this check because |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
534 |
// VM_Exit::_shutdown_thread is not set until after the VMThread |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
535 |
// has started the final safepoint which holds the Threads_lock |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
536 |
// for the remainder of the VM's life. |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
537 |
return; |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
538 |
} |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
539 |
|
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
540 |
if (VMError::is_error_reported() && |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
541 |
VMError::get_first_error_tid() == os::current_thread_id()) { |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
542 |
// If there is an error reported by this thread it may use ThreadsList even |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
543 |
// if it's unsafe. |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
544 |
return; |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
545 |
} |
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
546 |
|
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
547 |
// The closure will attempt to verify that the calling thread can |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
548 |
// be found by threads_do() on the specified ThreadsList. If it |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
549 |
// is successful, then the specified ThreadsList was acquired as |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
550 |
// a stable hazard ptr by the calling thread in a way that honored |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
551 |
// the Thread-SMR protocol. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
552 |
// |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
553 |
// If the calling thread cannot be found by threads_do() and if |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
554 |
// it is not the shutdown thread, then the calling thread is not |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
555 |
// honoring the Thread-SMR ptotocol. This means that the specified |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
556 |
// ThreadsList is not a stable hazard ptr and can be freed by |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
557 |
// another thread from the to-be-deleted list at any time. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
558 |
// |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
559 |
VerifyHazardPtrThreadClosure cl(_thread); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
560 |
ThreadsSMRSupport::threads_do(&cl, _list); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
561 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
562 |
// If the calling thread is not honoring the Thread-SMR protocol, |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
563 |
// then we will either crash in threads_do() above because 'threads' |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
564 |
// was freed by another thread or we will fail the assert() below. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
565 |
// In either case, we won't get past this point with a badly placed |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
566 |
// ThreadsListHandle. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
567 |
|
58579
05dd6144d434
8218543: ThreadsList handling during error reporting can crash
rehn
parents:
58340
diff
changeset
|
568 |
assert(cl.found(), "Acquired a ThreadsList snapshot from a thread not recognized by the Thread-SMR protocol."); |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
569 |
#endif |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
570 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
571 |
|
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
572 |
// 'entries + 1' so we always have at least one entry. |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
573 |
ThreadsList::ThreadsList(int entries) : |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
574 |
_length(entries), |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
575 |
_next_list(NULL), |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
576 |
_threads(NEW_C_HEAP_ARRAY(JavaThread*, entries + 1, mtThread)), |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
577 |
_nested_handle_cnt(0) |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
578 |
{ |
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
579 |
*(JavaThread**)(_threads + entries) = NULL; // Make sure the extra entry is NULL. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
580 |
} |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
581 |
|
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
582 |
ThreadsList::~ThreadsList() { |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
583 |
FREE_C_HEAP_ARRAY(JavaThread*, _threads); |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
584 |
} |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
585 |
|
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
586 |
// Add a JavaThread to a ThreadsList. The returned ThreadsList is a |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
587 |
// new copy of the specified ThreadsList with the specified JavaThread |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
588 |
// appended to the end. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
589 |
ThreadsList *ThreadsList::add_thread(ThreadsList *list, JavaThread *java_thread) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
590 |
const uint index = list->_length; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
591 |
const uint new_length = index + 1; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
592 |
const uint head_length = index; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
593 |
ThreadsList *const new_list = new ThreadsList(new_length); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
594 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
595 |
if (head_length > 0) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
596 |
Copy::disjoint_words((HeapWord*)list->_threads, (HeapWord*)new_list->_threads, head_length); |
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
597 |
} |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
598 |
*(JavaThread**)(new_list->_threads + index) = java_thread; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
599 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
600 |
return new_list; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
601 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
602 |
|
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
603 |
void ThreadsList::dec_nested_handle_cnt() { |
54517
c201ca660afd
8222034: Thread-SMR functions should be updated to remove work around
dcubed
parents:
52877
diff
changeset
|
604 |
// The decrement only needs to be MO_ACQ_REL since the reference |
c201ca660afd
8222034: Thread-SMR functions should be updated to remove work around
dcubed
parents:
52877
diff
changeset
|
605 |
// counter is volatile (and the hazard ptr is already NULL). |
c201ca660afd
8222034: Thread-SMR functions should be updated to remove work around
dcubed
parents:
52877
diff
changeset
|
606 |
Atomic::dec(&_nested_handle_cnt); |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
607 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
608 |
|
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
609 |
int ThreadsList::find_index_of_JavaThread(JavaThread *target) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
610 |
if (target == NULL) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
611 |
return -1; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
612 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
613 |
for (uint i = 0; i < length(); i++) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
614 |
if (target == thread_at(i)) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
615 |
return (int)i; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
616 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
617 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
618 |
return -1; |
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
619 |
} |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
620 |
|
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
621 |
JavaThread* ThreadsList::find_JavaThread_from_java_tid(jlong java_tid) const { |
58340
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
622 |
ThreadIdTable::lazy_initialize(this); |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
623 |
JavaThread* thread = ThreadIdTable::find_thread_by_tid(java_tid); |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
624 |
if (thread == NULL) { |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
625 |
// If the thread is not found in the table find it |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
626 |
// with a linear search and add to the table. |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
627 |
for (uint i = 0; i < length(); i++) { |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
628 |
thread = thread_at(i); |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
629 |
oop tobj = thread->threadObj(); |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
630 |
// Ignore the thread if it hasn't run yet, has exited |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
631 |
// or is starting to exit. |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
632 |
if (tobj != NULL && java_tid == java_lang_Thread::thread_id(tobj)) { |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
633 |
MutexLocker ml(Threads_lock); |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
634 |
// Must be inside the lock to ensure that we don't add a thread to the table |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
635 |
// that has just passed the removal point in ThreadsSMRSupport::remove_thread() |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
636 |
if (!thread->is_exiting()) { |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
637 |
ThreadIdTable::add_thread(java_tid, thread); |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
638 |
return thread; |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
639 |
} |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
640 |
} |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
641 |
} |
58340
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
642 |
} else if (!thread->is_exiting()) { |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
643 |
return thread; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
644 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
645 |
return NULL; |
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
646 |
} |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
647 |
|
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
648 |
void ThreadsList::inc_nested_handle_cnt() { |
54517
c201ca660afd
8222034: Thread-SMR functions should be updated to remove work around
dcubed
parents:
52877
diff
changeset
|
649 |
// The increment needs to be MO_SEQ_CST so that the reference counter |
c201ca660afd
8222034: Thread-SMR functions should be updated to remove work around
dcubed
parents:
52877
diff
changeset
|
650 |
// update is seen before the subsequent hazard ptr update. |
c201ca660afd
8222034: Thread-SMR functions should be updated to remove work around
dcubed
parents:
52877
diff
changeset
|
651 |
Atomic::inc(&_nested_handle_cnt); |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
652 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
653 |
|
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
654 |
bool ThreadsList::includes(const JavaThread * const p) const { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
655 |
if (p == NULL) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
656 |
return false; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
657 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
658 |
for (uint i = 0; i < length(); i++) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
659 |
if (thread_at(i) == p) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
660 |
return true; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
661 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
662 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
663 |
return false; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
664 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
665 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
666 |
// Remove a JavaThread from a ThreadsList. The returned ThreadsList is a |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
667 |
// new copy of the specified ThreadsList with the specified JavaThread |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
668 |
// removed. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
669 |
ThreadsList *ThreadsList::remove_thread(ThreadsList* list, JavaThread* java_thread) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
670 |
assert(list->_length > 0, "sanity"); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
671 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
672 |
uint i = (uint)list->find_index_of_JavaThread(java_thread); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
673 |
assert(i < list->_length, "did not find JavaThread on the list"); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
674 |
const uint index = i; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
675 |
const uint new_length = list->_length - 1; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
676 |
const uint head_length = index; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
677 |
const uint tail_length = (new_length >= index) ? (new_length - index) : 0; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
678 |
ThreadsList *const new_list = new ThreadsList(new_length); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
679 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
680 |
if (head_length > 0) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
681 |
Copy::disjoint_words((HeapWord*)list->_threads, (HeapWord*)new_list->_threads, head_length); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
682 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
683 |
if (tail_length > 0) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
684 |
Copy::disjoint_words((HeapWord*)list->_threads + index + 1, (HeapWord*)new_list->_threads + index, tail_length); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
685 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
686 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
687 |
return new_list; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
688 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
689 |
|
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
690 |
ThreadsListHandle::ThreadsListHandle(Thread *self) : _list_ptr(self, /* acquire */ true) { |
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
691 |
assert(self == Thread::current(), "sanity check"); |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
692 |
if (EnableThreadSMRStatistics) { |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
693 |
_timer.start(); |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
694 |
} |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
695 |
} |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
696 |
|
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
697 |
ThreadsListHandle::~ThreadsListHandle() { |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
698 |
if (EnableThreadSMRStatistics) { |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
699 |
_timer.stop(); |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
700 |
uint millis = (uint)_timer.milliseconds(); |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
701 |
ThreadsSMRSupport::update_tlh_stats(millis); |
48105
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
702 |
} |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
703 |
} |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
704 |
|
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
705 |
// Convert an internal thread reference to a JavaThread found on the |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
706 |
// associated ThreadsList. This ThreadsListHandle "protects" the |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
707 |
// returned JavaThread *. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
708 |
// |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
709 |
// If thread_oop_p is not NULL, then the caller wants to use the oop |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
710 |
// after this call so the oop is returned. On success, *jt_pp is set |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
711 |
// to the converted JavaThread * and true is returned. On error, |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
712 |
// returns false. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
713 |
// |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
714 |
bool ThreadsListHandle::cv_internal_thread_to_JavaThread(jobject jthread, |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
715 |
JavaThread ** jt_pp, |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
716 |
oop * thread_oop_p) { |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
717 |
assert(this->list() != NULL, "must have a ThreadsList"); |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
718 |
assert(jt_pp != NULL, "must have a return JavaThread pointer"); |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
719 |
// thread_oop_p is optional so no assert() |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
720 |
|
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
721 |
// The JVM_* interfaces don't allow a NULL thread parameter; JVM/TI |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
722 |
// allows a NULL thread parameter to signify "current thread" which |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
723 |
// allows us to avoid calling cv_external_thread_to_JavaThread(). |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
724 |
// The JVM_* interfaces have no such leeway. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
725 |
|
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
726 |
oop thread_oop = JNIHandles::resolve_non_null(jthread); |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
727 |
// Looks like an oop at this point. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
728 |
if (thread_oop_p != NULL) { |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
729 |
// Return the oop to the caller; the caller may still want |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
730 |
// the oop even if this function returns false. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
731 |
*thread_oop_p = thread_oop; |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
732 |
} |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
733 |
|
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
734 |
JavaThread *java_thread = java_lang_Thread::thread(thread_oop); |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
735 |
if (java_thread == NULL) { |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
736 |
// The java.lang.Thread does not contain a JavaThread * so it has |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
737 |
// not yet run or it has died. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
738 |
return false; |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
739 |
} |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
740 |
// Looks like a live JavaThread at this point. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
741 |
|
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
742 |
if (java_thread != JavaThread::current()) { |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
743 |
// jthread is not for the current JavaThread so have to verify |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
744 |
// the JavaThread * against the ThreadsList. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
745 |
if (EnableThreadSMRExtraValidityChecks && !includes(java_thread)) { |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
746 |
// Not on the JavaThreads list so it is not alive. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
747 |
return false; |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
748 |
} |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
749 |
} |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
750 |
|
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
751 |
// Return a live JavaThread that is "protected" by the |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
752 |
// ThreadsListHandle in the caller. |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
753 |
*jt_pp = java_thread; |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
754 |
return true; |
8d15b1369c7a
8167108: inconsistent handling of SR_lock can lead to crashes
dcubed
parents:
diff
changeset
|
755 |
} |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
756 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
757 |
void ThreadsSMRSupport::add_thread(JavaThread *thread){ |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
758 |
ThreadsList *new_list = ThreadsList::add_thread(get_java_thread_list(), thread); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
759 |
if (EnableThreadSMRStatistics) { |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
760 |
inc_java_thread_list_alloc_cnt(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
761 |
update_java_thread_list_max(new_list->length()); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
762 |
} |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
763 |
// Initial _java_thread_list will not generate a "Threads::add" mesg. |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
764 |
log_debug(thread, smr)("tid=" UINTX_FORMAT ": Threads::add: new ThreadsList=" INTPTR_FORMAT, os::current_thread_id(), p2i(new_list)); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
765 |
|
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
766 |
ThreadsList *old_list = xchg_java_thread_list(new_list); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
767 |
free_list(old_list); |
58340
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
768 |
if (ThreadIdTable::is_initialized()) { |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
769 |
jlong tid = SharedRuntime::get_java_tid(thread); |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
770 |
ThreadIdTable::add_thread(tid, thread); |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
771 |
} |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
772 |
} |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
773 |
|
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
774 |
// set_delete_notify() and clear_delete_notify() are called |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
775 |
// under the protection of the delete_lock, but we also use an |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
776 |
// Atomic operation to ensure the memory update is seen earlier than |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
777 |
// when the delete_lock is dropped. |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
778 |
// |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
779 |
void ThreadsSMRSupport::clear_delete_notify() { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
780 |
Atomic::dec(&_delete_notify); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
781 |
} |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
782 |
|
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
783 |
bool ThreadsSMRSupport::delete_notify() { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
784 |
// Use load_acquire() in order to see any updates to _delete_notify |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
785 |
// earlier than when delete_lock is grabbed. |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
786 |
return (OrderAccess::load_acquire(&_delete_notify) != 0); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
787 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
788 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
789 |
// Safely free a ThreadsList after a Threads::add() or Threads::remove(). |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
790 |
// The specified ThreadsList may not get deleted during this call if it |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
791 |
// is still in-use (referenced by a hazard ptr). Other ThreadsLists |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
792 |
// in the chain may get deleted by this call if they are no longer in-use. |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
793 |
void ThreadsSMRSupport::free_list(ThreadsList* threads) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
794 |
assert_locked_or_safepoint(Threads_lock); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
795 |
|
52452 | 796 |
if (is_bootstrap_list(threads)) { |
797 |
// The bootstrap list cannot be freed and is empty so |
|
798 |
// it does not need to be scanned. Nothing to do here. |
|
799 |
log_debug(thread, smr)("tid=" UINTX_FORMAT ": ThreadsSMRSupport::free_list: bootstrap ThreadsList=" INTPTR_FORMAT " is no longer in use.", os::current_thread_id(), p2i(threads)); |
|
800 |
return; |
|
801 |
} |
|
802 |
||
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
803 |
threads->set_next_list(_to_delete_list); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
804 |
_to_delete_list = threads; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
805 |
if (EnableThreadSMRStatistics) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
806 |
_to_delete_list_cnt++; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
807 |
if (_to_delete_list_cnt > _to_delete_list_max) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
808 |
_to_delete_list_max = _to_delete_list_cnt; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
809 |
} |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
810 |
} |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
811 |
|
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
812 |
// Hash table size should be first power of two higher than twice the length of the ThreadsList |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
813 |
int hash_table_size = MIN2((int)get_java_thread_list()->length(), 32) << 1; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
814 |
hash_table_size--; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
815 |
hash_table_size |= hash_table_size >> 1; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
816 |
hash_table_size |= hash_table_size >> 2; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
817 |
hash_table_size |= hash_table_size >> 4; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
818 |
hash_table_size |= hash_table_size >> 8; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
819 |
hash_table_size |= hash_table_size >> 16; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
820 |
hash_table_size++; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
821 |
|
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
822 |
// Gather a hash table of the current hazard ptrs: |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
823 |
ThreadScanHashtable *scan_table = new ThreadScanHashtable(hash_table_size); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
824 |
ScanHazardPtrGatherThreadsListClosure scan_cl(scan_table); |
49756
129d60b5dac7
8200374: Add ThreadsSMRSupport::verify_hazard_pointer_scanned() to verify threads_do().
dcubed
parents:
49636
diff
changeset
|
825 |
threads_do(&scan_cl); |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
826 |
OrderAccess::acquire(); // Must order reads of hazard ptr before reads of |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
827 |
// nested reference counters |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
828 |
|
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
829 |
// Walk through the linked list of pending freeable ThreadsLists |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
830 |
// and free the ones that are not referenced from hazard ptrs. |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
831 |
ThreadsList* current = _to_delete_list; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
832 |
ThreadsList* prev = NULL; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
833 |
ThreadsList* next = NULL; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
834 |
bool threads_is_freed = false; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
835 |
while (current != NULL) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
836 |
next = current->next_list(); |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
837 |
if (!scan_table->has_entry((void*)current) && current->_nested_handle_cnt == 0) { |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
838 |
// This ThreadsList is not referenced by a hazard ptr. |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
839 |
if (prev != NULL) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
840 |
prev->set_next_list(next); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
841 |
} |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
842 |
if (_to_delete_list == current) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
843 |
_to_delete_list = next; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
844 |
} |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
845 |
|
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
846 |
log_debug(thread, smr)("tid=" UINTX_FORMAT ": ThreadsSMRSupport::free_list: threads=" INTPTR_FORMAT " is freed.", os::current_thread_id(), p2i(current)); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
847 |
if (current == threads) threads_is_freed = true; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
848 |
delete current; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
849 |
if (EnableThreadSMRStatistics) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
850 |
_java_thread_list_free_cnt++; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
851 |
_to_delete_list_cnt--; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
852 |
} |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
853 |
} else { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
854 |
prev = current; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
855 |
} |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
856 |
current = next; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
857 |
} |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
858 |
|
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
859 |
if (!threads_is_freed) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
860 |
// Only report "is not freed" on the original call to |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
861 |
// free_list() for this ThreadsList. |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
862 |
log_debug(thread, smr)("tid=" UINTX_FORMAT ": ThreadsSMRSupport::free_list: threads=" INTPTR_FORMAT " is not freed.", os::current_thread_id(), p2i(threads)); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
863 |
} |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
864 |
|
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
865 |
delete scan_table; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
866 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
867 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
868 |
// Return true if the specified JavaThread is protected by a hazard |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
869 |
// pointer (ThreadsList reference). Otherwise, returns false. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
870 |
// |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
871 |
bool ThreadsSMRSupport::is_a_protected_JavaThread(JavaThread *thread) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
872 |
assert_locked_or_safepoint(Threads_lock); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
873 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
874 |
// Hash table size should be first power of two higher than twice |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
875 |
// the length of the Threads list. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
876 |
int hash_table_size = MIN2((int)get_java_thread_list()->length(), 32) << 1; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
877 |
hash_table_size--; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
878 |
hash_table_size |= hash_table_size >> 1; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
879 |
hash_table_size |= hash_table_size >> 2; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
880 |
hash_table_size |= hash_table_size >> 4; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
881 |
hash_table_size |= hash_table_size >> 8; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
882 |
hash_table_size |= hash_table_size >> 16; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
883 |
hash_table_size++; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
884 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
885 |
// Gather a hash table of the JavaThreads indirectly referenced by |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
886 |
// hazard ptrs. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
887 |
ThreadScanHashtable *scan_table = new ThreadScanHashtable(hash_table_size); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
888 |
ScanHazardPtrGatherProtectedThreadsClosure scan_cl(scan_table); |
49756
129d60b5dac7
8200374: Add ThreadsSMRSupport::verify_hazard_pointer_scanned() to verify threads_do().
dcubed
parents:
49636
diff
changeset
|
889 |
threads_do(&scan_cl); |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
890 |
OrderAccess::acquire(); // Must order reads of hazard ptr before reads of |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
891 |
// nested reference counters |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
892 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
893 |
// Walk through the linked list of pending freeable ThreadsLists |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
894 |
// and include the ones that are currently in use by a nested |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
895 |
// ThreadsListHandle in the search set. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
896 |
ThreadsList* current = _to_delete_list; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
897 |
while (current != NULL) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
898 |
if (current->_nested_handle_cnt != 0) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
899 |
// 'current' is in use by a nested ThreadsListHandle so the hazard |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
900 |
// ptr is protecting all the JavaThreads on that ThreadsList. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
901 |
AddThreadHazardPointerThreadClosure add_cl(scan_table); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
902 |
current->threads_do(&add_cl); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
903 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
904 |
current = current->next_list(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
905 |
} |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
906 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
907 |
bool thread_is_protected = false; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
908 |
if (scan_table->has_entry((void*)thread)) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
909 |
thread_is_protected = true; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
910 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
911 |
delete scan_table; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
912 |
return thread_is_protected; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
913 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
914 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
915 |
// Wake up portion of the release stable ThreadsList protocol; |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
916 |
// uses the delete_lock(). |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
917 |
// |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
918 |
void ThreadsSMRSupport::release_stable_list_wake_up(bool is_nested) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
919 |
const char* log_str = is_nested ? "nested hazard ptr" : "regular hazard ptr"; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
920 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
921 |
// Note: delete_lock is held in smr_delete() for the entire |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
922 |
// hazard ptr search so that we do not lose this notify() if |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
923 |
// the exiting thread has to wait. That code path also holds |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
924 |
// Threads_lock (which was grabbed before delete_lock) so that |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
925 |
// threads_do() can be called. This means the system can't start a |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
926 |
// safepoint which means this thread can't take too long to get to |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
927 |
// a safepoint because of being blocked on delete_lock. |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
928 |
// |
54623
1126f0607c70
8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents:
54517
diff
changeset
|
929 |
MonitorLocker ml(ThreadsSMRSupport::delete_lock(), Monitor::_no_safepoint_check_flag); |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
930 |
if (ThreadsSMRSupport::delete_notify()) { |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
931 |
// Notify any exiting JavaThreads that are waiting in smr_delete() |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
932 |
// that we've released a ThreadsList. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
933 |
ml.notify_all(); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
934 |
log_debug(thread, smr)("tid=" UINTX_FORMAT ": ThreadsSMRSupport::release_stable_list notified %s", os::current_thread_id(), log_str); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
935 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
936 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
937 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
938 |
void ThreadsSMRSupport::remove_thread(JavaThread *thread) { |
58340
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
939 |
if (ThreadIdTable::is_initialized()) { |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
940 |
jlong tid = SharedRuntime::get_java_tid(thread); |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
941 |
ThreadIdTable::remove_thread(tid); |
f4abe950c3b0
8185005: Improve performance of ThreadMXBean.getThreadInfo(long ids[], int maxDepth)
dtitov
parents:
57699
diff
changeset
|
942 |
} |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
943 |
ThreadsList *new_list = ThreadsList::remove_thread(ThreadsSMRSupport::get_java_thread_list(), thread); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
944 |
if (EnableThreadSMRStatistics) { |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
945 |
ThreadsSMRSupport::inc_java_thread_list_alloc_cnt(); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
946 |
// This list is smaller so no need to check for a "longest" update. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
947 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
948 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
949 |
// Final _java_thread_list will not generate a "Threads::remove" mesg. |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
950 |
log_debug(thread, smr)("tid=" UINTX_FORMAT ": Threads::remove: new ThreadsList=" INTPTR_FORMAT, os::current_thread_id(), p2i(new_list)); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
951 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
952 |
ThreadsList *old_list = ThreadsSMRSupport::xchg_java_thread_list(new_list); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
953 |
ThreadsSMRSupport::free_list(old_list); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
954 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
955 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
956 |
// See note for clear_delete_notify(). |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
957 |
// |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
958 |
void ThreadsSMRSupport::set_delete_notify() { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
959 |
Atomic::inc(&_delete_notify); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
960 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
961 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
962 |
// Safely delete a JavaThread when it is no longer in use by a |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
963 |
// ThreadsListHandle. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
964 |
// |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
965 |
void ThreadsSMRSupport::smr_delete(JavaThread *thread) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
966 |
assert(!Threads_lock->owned_by_self(), "sanity"); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
967 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
968 |
bool has_logged_once = false; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
969 |
elapsedTimer timer; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
970 |
if (EnableThreadSMRStatistics) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
971 |
timer.start(); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
972 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
973 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
974 |
while (true) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
975 |
{ |
57699
4aea554692aa
8226228: Make Threads_lock an always safepoint checked lock.
rehn
parents:
54623
diff
changeset
|
976 |
// Will not make a safepoint check because this JavaThread |
4aea554692aa
8226228: Make Threads_lock an always safepoint checked lock.
rehn
parents:
54623
diff
changeset
|
977 |
// is not on the current ThreadsList. |
4aea554692aa
8226228: Make Threads_lock an always safepoint checked lock.
rehn
parents:
54623
diff
changeset
|
978 |
MutexLocker ml(Threads_lock); |
54623
1126f0607c70
8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents:
54517
diff
changeset
|
979 |
// Cannot use a MonitorLocker helper here because we have |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
980 |
// to drop the Threads_lock first if we wait. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
981 |
ThreadsSMRSupport::delete_lock()->lock_without_safepoint_check(); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
982 |
// Set the delete_notify flag after we grab delete_lock |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
983 |
// and before we scan hazard ptrs because we're doing |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
984 |
// double-check locking in release_stable_list(). |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
985 |
ThreadsSMRSupport::set_delete_notify(); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
986 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
987 |
if (!is_a_protected_JavaThread(thread)) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
988 |
// This is the common case. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
989 |
ThreadsSMRSupport::clear_delete_notify(); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
990 |
ThreadsSMRSupport::delete_lock()->unlock(); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
991 |
break; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
992 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
993 |
if (!has_logged_once) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
994 |
has_logged_once = true; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
995 |
log_debug(thread, smr)("tid=" UINTX_FORMAT ": ThreadsSMRSupport::smr_delete: thread=" INTPTR_FORMAT " is not deleted.", os::current_thread_id(), p2i(thread)); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
996 |
if (log_is_enabled(Debug, os, thread)) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
997 |
ScanHazardPtrPrintMatchingThreadsClosure scan_cl(thread); |
49756
129d60b5dac7
8200374: Add ThreadsSMRSupport::verify_hazard_pointer_scanned() to verify threads_do().
dcubed
parents:
49636
diff
changeset
|
998 |
threads_do(&scan_cl); |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
999 |
ThreadsList* current = _to_delete_list; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1000 |
while (current != NULL) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1001 |
if (current->_nested_handle_cnt != 0 && current->includes(thread)) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1002 |
log_debug(thread, smr)("tid=" UINTX_FORMAT ": ThreadsSMRSupport::smr_delete: found nested hazard pointer to thread=" INTPTR_FORMAT, os::current_thread_id(), p2i(thread)); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1003 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1004 |
current = current->next_list(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1005 |
} |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1006 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1007 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1008 |
} // We have to drop the Threads_lock to wait or delete the thread |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1009 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1010 |
if (EnableThreadSMRStatistics) { |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1011 |
_delete_lock_wait_cnt++; |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1012 |
if (_delete_lock_wait_cnt > _delete_lock_wait_max) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1013 |
_delete_lock_wait_max = _delete_lock_wait_cnt; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1014 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1015 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1016 |
// Wait for a release_stable_list() call before we check again. No |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1017 |
// safepoint check, no timeout, and not as suspend equivalent flag |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1018 |
// because this JavaThread is not on the Threads list. |
54623
1126f0607c70
8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents:
54517
diff
changeset
|
1019 |
ThreadsSMRSupport::delete_lock()->wait_without_safepoint_check(); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1020 |
if (EnableThreadSMRStatistics) { |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1021 |
_delete_lock_wait_cnt--; |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1022 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1023 |
|
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1024 |
ThreadsSMRSupport::clear_delete_notify(); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1025 |
ThreadsSMRSupport::delete_lock()->unlock(); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1026 |
// Retry the whole scenario. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1027 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1028 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1029 |
delete thread; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1030 |
if (EnableThreadSMRStatistics) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1031 |
timer.stop(); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1032 |
uint millis = (uint)timer.milliseconds(); |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1033 |
ThreadsSMRSupport::inc_deleted_thread_cnt(); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1034 |
ThreadsSMRSupport::add_deleted_thread_times(millis); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1035 |
ThreadsSMRSupport::update_deleted_thread_time_max(millis); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1036 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1037 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1038 |
log_debug(thread, smr)("tid=" UINTX_FORMAT ": ThreadsSMRSupport::smr_delete: thread=" INTPTR_FORMAT " is deleted.", os::current_thread_id(), p2i(thread)); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1039 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1040 |
|
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1041 |
// Apply the closure to all threads in the system, with a snapshot of |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1042 |
// all JavaThreads provided by the list parameter. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1043 |
void ThreadsSMRSupport::threads_do(ThreadClosure *tc, ThreadsList *list) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1044 |
list->threads_do(tc); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1045 |
Threads::non_java_threads_do(tc); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1046 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1047 |
|
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1048 |
// Apply the closure to all threads in the system. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1049 |
void ThreadsSMRSupport::threads_do(ThreadClosure *tc) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1050 |
threads_do(tc, _java_thread_list); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1051 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1052 |
|
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1053 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1054 |
// Debug, logging, and printing stuff at the end: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1055 |
|
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1056 |
// Print SMR info for a SafeThreadsListPtr to a given output stream. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1057 |
void SafeThreadsListPtr::print_on(outputStream* st) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1058 |
if (this == _thread->_threads_list_ptr) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1059 |
// The top level hazard ptr. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1060 |
st->print(" _threads_hazard_ptr=" INTPTR_FORMAT, p2i(_list)); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1061 |
} else { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1062 |
// Nested hazard ptrs. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1063 |
st->print(", _nested_threads_hazard_ptr=" INTPTR_FORMAT, p2i(_list)); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1064 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1065 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1066 |
|
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1067 |
// Log Threads class SMR info. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1068 |
void ThreadsSMRSupport::log_statistics() { |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1069 |
LogTarget(Info, thread, smr) log; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1070 |
if (log.is_enabled()) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1071 |
LogStream out(log); |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1072 |
print_info_on(&out); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1073 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1074 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1075 |
|
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1076 |
// Print SMR info for a thread to a given output stream. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1077 |
void ThreadsSMRSupport::print_info_on(const Thread* thread, outputStream* st) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1078 |
if (thread->_threads_hazard_ptr != NULL) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1079 |
st->print(" _threads_hazard_ptr=" INTPTR_FORMAT, p2i(thread->_threads_hazard_ptr)); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1080 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1081 |
if (EnableThreadSMRStatistics && thread->_threads_list_ptr != NULL) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1082 |
// The count is only interesting if we have a _threads_list_ptr. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1083 |
st->print(", _nested_threads_hazard_ptr_cnt=%u", thread->_nested_threads_hazard_ptr_cnt); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1084 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1085 |
if (SafepointSynchronize::is_at_safepoint() || Thread::current() == thread) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1086 |
// It is only safe to walk the list if we're at a safepoint or the |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1087 |
// calling thread is walking its own list. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1088 |
SafeThreadsListPtr* current = thread->_threads_list_ptr; |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1089 |
if (current != NULL) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1090 |
// Skip the top nesting level as it is always printed above. |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1091 |
current = current->previous(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1092 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1093 |
while (current != NULL) { |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1094 |
current->print_on(st); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1095 |
current = current->previous(); |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1096 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1097 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1098 |
} |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1099 |
|
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1100 |
// Print Threads class SMR info. |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1101 |
void ThreadsSMRSupport::print_info_on(outputStream* st) { |
50718
5698cf4e50f1
8205195: NestedThreadsListHandleInErrorHandlingTest fails because hs_err doesn't contain _nested_thread_list_max
dcubed
parents:
49956
diff
changeset
|
1102 |
// Only grab the Threads_lock if we don't already own it and if we |
5698cf4e50f1
8205195: NestedThreadsListHandleInErrorHandlingTest fails because hs_err doesn't contain _nested_thread_list_max
dcubed
parents:
49956
diff
changeset
|
1103 |
// are not reporting an error. |
5698cf4e50f1
8205195: NestedThreadsListHandleInErrorHandlingTest fails because hs_err doesn't contain _nested_thread_list_max
dcubed
parents:
49956
diff
changeset
|
1104 |
// Note: Not grabbing the Threads_lock during error reporting is |
5698cf4e50f1
8205195: NestedThreadsListHandleInErrorHandlingTest fails because hs_err doesn't contain _nested_thread_list_max
dcubed
parents:
49956
diff
changeset
|
1105 |
// dangerous because the data structures we want to print can be |
5698cf4e50f1
8205195: NestedThreadsListHandleInErrorHandlingTest fails because hs_err doesn't contain _nested_thread_list_max
dcubed
parents:
49956
diff
changeset
|
1106 |
// freed concurrently. However, grabbing the Threads_lock during |
5698cf4e50f1
8205195: NestedThreadsListHandleInErrorHandlingTest fails because hs_err doesn't contain _nested_thread_list_max
dcubed
parents:
49956
diff
changeset
|
1107 |
// error reporting can be equally dangerous since this thread might |
5698cf4e50f1
8205195: NestedThreadsListHandleInErrorHandlingTest fails because hs_err doesn't contain _nested_thread_list_max
dcubed
parents:
49956
diff
changeset
|
1108 |
// block during error reporting or a nested error could leave the |
5698cf4e50f1
8205195: NestedThreadsListHandleInErrorHandlingTest fails because hs_err doesn't contain _nested_thread_list_max
dcubed
parents:
49956
diff
changeset
|
1109 |
// Threads_lock held. The classic no win scenario. |
5698cf4e50f1
8205195: NestedThreadsListHandleInErrorHandlingTest fails because hs_err doesn't contain _nested_thread_list_max
dcubed
parents:
49956
diff
changeset
|
1110 |
// |
54623
1126f0607c70
8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents:
54517
diff
changeset
|
1111 |
MutexLocker ml((Threads_lock->owned_by_self() || VMError::is_error_reported()) ? NULL : Threads_lock); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1112 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1113 |
st->print_cr("Threads class SMR info:"); |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1114 |
st->print_cr("_java_thread_list=" INTPTR_FORMAT ", length=%u, " |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1115 |
"elements={", p2i(_java_thread_list), |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1116 |
_java_thread_list->length()); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1117 |
print_info_elements_on(st, _java_thread_list); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1118 |
st->print_cr("}"); |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1119 |
if (_to_delete_list != NULL) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1120 |
st->print_cr("_to_delete_list=" INTPTR_FORMAT ", length=%u, " |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1121 |
"elements={", p2i(_to_delete_list), |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1122 |
_to_delete_list->length()); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1123 |
print_info_elements_on(st, _to_delete_list); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1124 |
st->print_cr("}"); |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1125 |
for (ThreadsList *t_list = _to_delete_list->next_list(); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1126 |
t_list != NULL; t_list = t_list->next_list()) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1127 |
st->print("next-> " INTPTR_FORMAT ", length=%u, " |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1128 |
"elements={", p2i(t_list), t_list->length()); |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1129 |
print_info_elements_on(st, t_list); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1130 |
st->print_cr("}"); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1131 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1132 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1133 |
if (!EnableThreadSMRStatistics) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1134 |
return; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1135 |
} |
49956
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1136 |
st->print_cr("_java_thread_list_alloc_cnt=" UINT64_FORMAT ", " |
a87f2e7a527c
8191798: redo nested ThreadsListHandle to drop Threads_lock
dcubed
parents:
49756
diff
changeset
|
1137 |
"_java_thread_list_free_cnt=" UINT64_FORMAT ", " |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1138 |
"_java_thread_list_max=%u, " |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1139 |
"_nested_thread_list_max=%u", |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1140 |
_java_thread_list_alloc_cnt, |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1141 |
_java_thread_list_free_cnt, |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1142 |
_java_thread_list_max, |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1143 |
_nested_thread_list_max); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1144 |
if (_tlh_cnt > 0) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1145 |
st->print_cr("_tlh_cnt=%u" |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1146 |
", _tlh_times=%u" |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1147 |
", avg_tlh_time=%0.2f" |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1148 |
", _tlh_time_max=%u", |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1149 |
_tlh_cnt, _tlh_times, |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1150 |
((double) _tlh_times / _tlh_cnt), |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1151 |
_tlh_time_max); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1152 |
} |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1153 |
if (_deleted_thread_cnt > 0) { |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1154 |
st->print_cr("_deleted_thread_cnt=%u" |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1155 |
", _deleted_thread_times=%u" |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1156 |
", avg_deleted_thread_time=%0.2f" |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1157 |
", _deleted_thread_time_max=%u", |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1158 |
_deleted_thread_cnt, _deleted_thread_times, |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1159 |
((double) _deleted_thread_times / _deleted_thread_cnt), |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1160 |
_deleted_thread_time_max); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1161 |
} |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1162 |
st->print_cr("_delete_lock_wait_cnt=%u, _delete_lock_wait_max=%u", |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1163 |
_delete_lock_wait_cnt, _delete_lock_wait_max); |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1164 |
st->print_cr("_to_delete_list_cnt=%u, _to_delete_list_max=%u", |
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1165 |
_to_delete_list_cnt, _to_delete_list_max); |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1166 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1167 |
|
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1168 |
// Print ThreadsList elements (4 per line). |
48382
0997d6959851
8193135: get rid of redundant _smr_ prefix/infix in ThreadSMRSupport stuff
dcubed
parents:
48312
diff
changeset
|
1169 |
void ThreadsSMRSupport::print_info_elements_on(outputStream* st, ThreadsList* t_list) { |
48312
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1170 |
uint cnt = 0; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1171 |
JavaThreadIterator jti(t_list); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1172 |
for (JavaThread *jt = jti.first(); jt != NULL; jt = jti.next()) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1173 |
st->print(INTPTR_FORMAT, p2i(jt)); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1174 |
if (cnt < t_list->length() - 1) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1175 |
// Separate with comma or comma-space except for the last one. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1176 |
if (((cnt + 1) % 4) == 0) { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1177 |
// Four INTPTR_FORMAT fit on an 80 column line so end the |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1178 |
// current line with just a comma. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1179 |
st->print_cr(","); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1180 |
} else { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1181 |
// Not the last one on the current line so use comma-space: |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1182 |
st->print(", "); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1183 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1184 |
} else { |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1185 |
// Last one so just end the current line. |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1186 |
st->cr(); |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1187 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1188 |
cnt++; |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1189 |
} |
2a1413298af0
8191789: migrate more Thread-SMR stuff from thread.[ch]pp -> threadSMR.[ch]pp
dcubed
parents:
48105
diff
changeset
|
1190 |
} |