19
19
import static io .rsocket .frame .FrameHeaderFlyweight .FLAGS_M ;
20
20
21
21
import io .netty .buffer .*;
22
+ import io .netty .util .AbstractReferenceCounted ;
22
23
import io .netty .util .IllegalReferenceCountException ;
23
24
import io .netty .util .Recycler ;
24
25
import io .netty .util .Recycler .Handle ;
33
34
import io .rsocket .frame .VersionFlyweight ;
34
35
import io .rsocket .framing .FrameType ;
35
36
import java .nio .charset .StandardCharsets ;
36
- import java .util .Objects ;
37
37
import javax .annotation .Nullable ;
38
38
import org .slf4j .Logger ;
39
39
import org .slf4j .LoggerFactory ;
43
43
*
44
44
* <p>This provides encoding, decoding and field accessors.
45
45
*/
46
- public class Frame implements Payload , ByteBufHolder {
46
+ public class Frame extends AbstractReferenceCounted implements Payload , ByteBufHolder {
47
47
private static final Recycler <Frame > RECYCLER =
48
48
new Recycler <Frame >() {
49
49
protected Frame newObject (Handle <Frame > handle ) {
@@ -58,12 +58,6 @@ private Frame(final Handle<Frame> handle) {
58
58
this .handle = handle ;
59
59
}
60
60
61
- /** Clear and recycle this instance. */
62
- private void recycle () {
63
- content = null ;
64
- handle .recycle (this );
65
- }
66
-
67
61
/** Return the content which is held by this {@link Frame}. */
68
62
@ Override
69
63
public ByteBuf content () {
@@ -105,26 +99,17 @@ public Frame replace(ByteBuf content) {
105
99
return from (content );
106
100
}
107
101
108
- /**
109
- * Returns the reference count of this object. If {@code 0}, it means this object has been
110
- * deallocated.
111
- */
112
- @ Override
113
- public int refCnt () {
114
- return content .refCnt ();
115
- }
116
-
117
102
/** Increases the reference count by {@code 1}. */
118
103
@ Override
119
104
public Frame retain () {
120
- content .retain ();
105
+ super .retain ();
121
106
return this ;
122
107
}
123
108
124
109
/** Increases the reference count by the specified {@code increment}. */
125
110
@ Override
126
111
public Frame retain (int increment ) {
127
- content .retain (increment );
112
+ super .retain (increment );
128
113
return this ;
129
114
}
130
115
@@ -151,35 +136,13 @@ public Frame touch(@Nullable Object hint) {
151
136
}
152
137
153
138
/**
154
- * Decreases the reference count by {@code 1} and deallocates this object if the reference count
155
- * reaches at {@code 0}.
156
- *
157
- * @return {@code true} if and only if the reference count became {@code 0} and this object has
158
- * been deallocated
159
- */
160
- @ Override
161
- public boolean release () {
162
- if (content != null && content .release ()) {
163
- recycle ();
164
- return true ;
165
- }
166
- return false ;
167
- }
168
-
169
- /**
170
- * Decreases the reference count by the specified {@code decrement} and deallocates this object if
171
- * the reference count reaches at {@code 0}.
172
- *
173
- * @return {@code true} if and only if the reference count became {@code 0} and this object has
174
- * been deallocated
139
+ * Called once {@link #refCnt()} is equals 0.
175
140
*/
176
141
@ Override
177
- public boolean release (int decrement ) {
178
- if (content != null && content .release (decrement )) {
179
- recycle ();
180
- return true ;
181
- }
182
- return false ;
142
+ protected void deallocate () {
143
+ content .release ();
144
+ content = null ;
145
+ handle .recycle (this );
183
146
}
184
147
185
148
/**
@@ -239,6 +202,7 @@ public int flags() {
239
202
*/
240
203
public static Frame from (final ByteBuf content ) {
241
204
final Frame frame = RECYCLER .get ();
205
+ frame .setRefCnt (1 );
242
206
frame .content = content ;
243
207
244
208
return frame ;
@@ -281,6 +245,7 @@ public static Frame from(
281
245
final ByteBuf data = payload .sliceData ();
282
246
283
247
final Frame frame = RECYCLER .get ();
248
+ frame .setRefCnt (1 );
284
249
frame .content =
285
250
ByteBufAllocator .DEFAULT .buffer (
286
251
SetupFrameFlyweight .computeFrameLength (
@@ -347,6 +312,7 @@ public static Frame from(int streamId, final Throwable throwable, ByteBuf dataBu
347
312
348
313
final int code = ErrorFrameFlyweight .errorCodeFromException (throwable );
349
314
final Frame frame = RECYCLER .get ();
315
+ frame .setRefCnt (1 );
350
316
frame .content =
351
317
ByteBufAllocator .DEFAULT .buffer (
352
318
ErrorFrameFlyweight .computeFrameLength (dataBuffer .readableBytes ()));
@@ -378,6 +344,7 @@ private Lease() {}
378
344
379
345
public static Frame from (int ttl , int numberOfRequests , ByteBuf metadata ) {
380
346
final Frame frame = RECYCLER .get ();
347
+ frame .setRefCnt (1 );
381
348
frame .content =
382
349
ByteBufAllocator .DEFAULT .buffer (
383
350
LeaseFrameFlyweight .computeFrameLength (metadata .readableBytes ()));
@@ -411,6 +378,7 @@ public static Frame from(int streamId, int requestN) {
411
378
}
412
379
413
380
final Frame frame = RECYCLER .get ();
381
+ frame .setRefCnt (1 );
414
382
frame .content = ByteBufAllocator .DEFAULT .buffer (RequestNFrameFlyweight .computeFrameLength ());
415
383
frame .content .writerIndex (RequestNFrameFlyweight .encode (frame .content , streamId , requestN ));
416
384
return frame ;
@@ -438,6 +406,7 @@ public static Frame from(int streamId, FrameType type, Payload payload, int init
438
406
final ByteBuf data = payload .sliceData ();
439
407
440
408
final Frame frame = RECYCLER .get ();
409
+ frame .setRefCnt (1 );
441
410
frame .content =
442
411
ByteBufAllocator .DEFAULT .buffer (
443
412
RequestFrameFlyweight .computeFrameLength (
@@ -464,6 +433,7 @@ public static Frame from(int streamId, FrameType type, Payload payload, int init
464
433
465
434
public static Frame from (int streamId , FrameType type , int flags ) {
466
435
final Frame frame = RECYCLER .get ();
436
+ frame .setRefCnt (1 );
467
437
frame .content =
468
438
ByteBufAllocator .DEFAULT .buffer (RequestFrameFlyweight .computeFrameLength (type , null , 0 ));
469
439
frame .content .writerIndex (
@@ -480,6 +450,7 @@ public static Frame from(
480
450
int initialRequestN ,
481
451
int flags ) {
482
452
final Frame frame = RECYCLER .get ();
453
+ frame .setRefCnt (1 );
483
454
frame .content =
484
455
ByteBufAllocator .DEFAULT .buffer (
485
456
RequestFrameFlyweight .computeFrameLength (
@@ -543,6 +514,7 @@ public static Frame from(int streamId, FrameType type, Payload payload, int flag
543
514
public static Frame from (
544
515
int streamId , FrameType type , @ Nullable ByteBuf metadata , ByteBuf data , int flags ) {
545
516
final Frame frame = RECYCLER .get ();
517
+ frame .setRefCnt (1 );
546
518
frame .content =
547
519
ByteBufAllocator .DEFAULT .buffer (
548
520
FrameHeaderFlyweight .computeFrameHeaderLength (
@@ -559,6 +531,7 @@ private Cancel() {}
559
531
560
532
public static Frame from (int streamId ) {
561
533
final Frame frame = RECYCLER .get ();
534
+ frame .setRefCnt (1 );
562
535
frame .content =
563
536
ByteBufAllocator .DEFAULT .buffer (
564
537
FrameHeaderFlyweight .computeFrameHeaderLength (FrameType .CANCEL , null , 0 ));
@@ -575,6 +548,7 @@ private Keepalive() {}
575
548
576
549
public static Frame from (ByteBuf data , boolean respond ) {
577
550
final Frame frame = RECYCLER .get ();
551
+ frame .setRefCnt (1 );
578
552
frame .content =
579
553
ByteBufAllocator .DEFAULT .buffer (
580
554
KeepaliveFrameFlyweight .computeFrameLength (data .readableBytes ()));
@@ -611,12 +585,12 @@ public boolean equals(Object o) {
611
585
return false ;
612
586
}
613
587
final Frame frame = (Frame ) o ;
614
- return Objects .equals (content , frame .content );
588
+ return content .equals (frame .content () );
615
589
}
616
590
617
591
@ Override
618
592
public int hashCode () {
619
- return Objects . hash ( content );
593
+ return content . hashCode ( );
620
594
}
621
595
622
596
@ Override
0 commit comments