11package jdk .jfr .internal .context ;
22
3- import java .lang .invoke .MethodHandles .Lookup ;
43import java .nio .LongBuffer ;
5- import java .lang .invoke .MethodType ;
6- import java .lang .invoke .VarHandle ;
7- import java .util .ArrayList ;
84import java .util .Collections ;
9- import java .util .List ;
5+ import java .util .Map ;
6+ import java .util .Set ;
7+ import java .util .stream .Collectors ;
108
119import jdk .jfr .ContextType ;
12- import jdk .jfr .FlightRecorder ;
1310import jdk .jfr .internal .JVM ;
1411import jdk .jfr .internal .StringPool ;
1512
16- public final class ContextWriter {
13+ public final class ContextWriter implements ContextType . Setter {
1714 static final ContextWriter NULL = new ContextWriter (-1 , null );
1815 private final int offset ;
19- private final List <ContextDescriptor > descriptors ;
16+ private final Set <ContextDescriptor > descriptors ;
17+ private final Map <String , ContextDescriptor > attributeIndexMap ;
2018
21- ContextWriter (int offset , List <ContextDescriptor > descriptors ) {
19+ ContextWriter (int offset , Set <ContextDescriptor > descriptors ) {
2220 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 ;
2423 }
2524
2625 public boolean isActive () {
@@ -35,12 +34,10 @@ void write(BaseContextType target) {
3534 if (context == null ) {
3635 return ;
3736 }
38- int cntr = offset ;
3937 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 );
4441 }
4542 }
4643 }
@@ -53,10 +50,64 @@ void clear(BaseContextType target) {
5350 if (context == null ) {
5451 return ;
5552 }
56- int cntr = 0 ;
5753 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 ;
60110 }
111+ return offset + cd .order ();
61112 }
62113}
0 commit comments