1
1
package jdk .jfr .internal .context ;
2
2
3
- import java .lang .invoke .MethodHandles .Lookup ;
4
3
import java .nio .LongBuffer ;
5
- import java .lang .invoke .MethodType ;
6
- import java .lang .invoke .VarHandle ;
7
- import java .util .ArrayList ;
8
4
import java .util .Collections ;
9
- import java .util .List ;
5
+ import java .util .Map ;
6
+ import java .util .Set ;
7
+ import java .util .stream .Collectors ;
10
8
11
9
import jdk .jfr .ContextType ;
12
- import jdk .jfr .FlightRecorder ;
13
10
import jdk .jfr .internal .JVM ;
14
11
import jdk .jfr .internal .StringPool ;
15
12
16
- public final class ContextWriter {
13
+ public final class ContextWriter implements ContextType . Setter {
17
14
static final ContextWriter NULL = new ContextWriter (-1 , null );
18
15
private final int offset ;
19
- private final List <ContextDescriptor > descriptors ;
16
+ private final Set <ContextDescriptor > descriptors ;
17
+ private final Map <String , ContextDescriptor > attributeIndexMap ;
20
18
21
- ContextWriter (int offset , List <ContextDescriptor > descriptors ) {
19
+ ContextWriter (int offset , Set <ContextDescriptor > descriptors ) {
22
20
this .offset = offset ;
23
- this .descriptors = offset > -1 ? Collections .unmodifiableList (descriptors ) : null ;
21
+ this .descriptors = offset > -1 ? Collections .unmodifiableSet (descriptors ) : null ;
22
+ this .attributeIndexMap = this .descriptors != null ? this .descriptors .stream ().collect (Collectors .toUnmodifiableMap (ContextDescriptor ::name , cd -> cd )) : null ;
24
23
}
25
24
26
25
public boolean isActive () {
@@ -35,12 +34,10 @@ void write(BaseContextType target) {
35
34
if (context == null ) {
36
35
return ;
37
36
}
38
- int cntr = offset ;
39
37
for (ContextDescriptor cd : descriptors ) {
40
- String value = (String ) cd .access ().get (target );
41
- context .put (cntr ++, value != null ? StringPool .addString (value , false ) : 0 );
42
- if (cntr >= 8 ) {
43
- break ;
38
+ if (cd .order () < 8 ) {
39
+ String value = (String ) cd .access ().get (target );
40
+ context .put (offset + cd .order (), value != null ? StringPool .addString (value , false ) : 0 );
44
41
}
45
42
}
46
43
}
@@ -53,10 +50,64 @@ void clear(BaseContextType target) {
53
50
if (context == null ) {
54
51
return ;
55
52
}
56
- int cntr = 0 ;
57
53
for (ContextDescriptor cd : descriptors ) {
58
- context .put (offset + (cntr ++), 0L );
59
- cd .access ().set (target , null );
54
+ if (cd .order () < 8 ) {
55
+ context .put (offset + cd .order (), 0L );
56
+ cd .access ().set (target , null );
57
+ }
58
+ }
59
+ }
60
+
61
+ @ Override
62
+ public void clearAll () {
63
+ if (offset == -1 || descriptors == null ) {
64
+ return ;
65
+ }
66
+ LongBuffer context = JVM .getThreadContextBuffer ();
67
+ if (context == null ) {
68
+ return ;
69
+ }
70
+ for (ContextDescriptor cd : descriptors ) {
71
+ context .put (offset + cd .order (), 0L );
72
+ }
73
+ }
74
+
75
+ @ Override
76
+ public void setAttribute (String name , String value ) {
77
+ LongBuffer context = JVM .getThreadContextBuffer ();
78
+ if (context == null ) {
79
+ return ;
80
+ }
81
+ int pos = getContextIndex (name , String .class );
82
+ if (pos < 0 ) {
83
+ System .err .println ("===> set err: " + name + ": " + pos );
84
+ return ;
85
+ }
86
+ context .put (pos , StringPool .addString (value , false ));
87
+ }
88
+
89
+ @ Override
90
+ public void clearAttribute (String name ) {
91
+ LongBuffer context = JVM .getThreadContextBuffer ();
92
+ if (context == null ) {
93
+ return ;
94
+ }
95
+ int pos = getContextIndex (name , String .class );
96
+ if (pos < 0 ) {
97
+ System .err .println ("===> clear err: " + name + ": " + pos );
98
+ return ;
99
+ }
100
+ context .put (pos , 0 );
101
+ }
102
+
103
+ private int getContextIndex (String name , Class <?> type ) {
104
+ ContextDescriptor cd = attributeIndexMap .get (name );
105
+ if (cd == null ) {
106
+ return -1 ;
107
+ }
108
+ if (cd .access ().varType () != type ) {
109
+ return -2 ;
60
110
}
111
+ return offset + cd .order ();
61
112
}
62
113
}
0 commit comments