1919import static io .rsocket .frame .FrameHeaderFlyweight .FLAGS_M ;
2020
2121import io .netty .buffer .*;
22+ import io .netty .util .AbstractReferenceCounted ;
2223import io .netty .util .IllegalReferenceCountException ;
2324import io .netty .util .Recycler ;
2425import io .netty .util .Recycler .Handle ;
3334import io .rsocket .frame .VersionFlyweight ;
3435import io .rsocket .framing .FrameType ;
3536import java .nio .charset .StandardCharsets ;
36- import java .util .Objects ;
3737import javax .annotation .Nullable ;
3838import org .slf4j .Logger ;
3939import org .slf4j .LoggerFactory ;
4343 *
4444 * <p>This provides encoding, decoding and field accessors.
4545 */
46- public class Frame implements Payload , ByteBufHolder {
46+ public class Frame extends AbstractReferenceCounted implements Payload , ByteBufHolder {
4747 private static final Recycler <Frame > RECYCLER =
4848 new Recycler <Frame >() {
4949 protected Frame newObject (Handle <Frame > handle ) {
@@ -58,12 +58,6 @@ private Frame(final Handle<Frame> handle) {
5858 this .handle = handle ;
5959 }
6060
61- /** Clear and recycle this instance. */
62- private void recycle () {
63- content = null ;
64- handle .recycle (this );
65- }
66-
6761 /** Return the content which is held by this {@link Frame}. */
6862 @ Override
6963 public ByteBuf content () {
@@ -105,26 +99,17 @@ public Frame replace(ByteBuf content) {
10599 return from (content );
106100 }
107101
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-
117102 /** Increases the reference count by {@code 1}. */
118103 @ Override
119104 public Frame retain () {
120- content .retain ();
105+ super .retain ();
121106 return this ;
122107 }
123108
124109 /** Increases the reference count by the specified {@code increment}. */
125110 @ Override
126111 public Frame retain (int increment ) {
127- content .retain (increment );
112+ super .retain (increment );
128113 return this ;
129114 }
130115
@@ -150,36 +135,12 @@ public Frame touch(@Nullable Object hint) {
150135 return this ;
151136 }
152137
153- /**
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
175- */
138+ /** Called once {@link #refCnt()} is equals 0. */
176139 @ Override
177- public boolean release (int decrement ) {
178- if (content != null && content .release (decrement )) {
179- recycle ();
180- return true ;
181- }
182- return false ;
140+ protected void deallocate () {
141+ content .release ();
142+ content = null ;
143+ handle .recycle (this );
183144 }
184145
185146 /**
@@ -239,6 +200,7 @@ public int flags() {
239200 */
240201 public static Frame from (final ByteBuf content ) {
241202 final Frame frame = RECYCLER .get ();
203+ frame .setRefCnt (1 );
242204 frame .content = content ;
243205
244206 return frame ;
@@ -281,6 +243,7 @@ public static Frame from(
281243 final ByteBuf data = payload .sliceData ();
282244
283245 final Frame frame = RECYCLER .get ();
246+ frame .setRefCnt (1 );
284247 frame .content =
285248 ByteBufAllocator .DEFAULT .buffer (
286249 SetupFrameFlyweight .computeFrameLength (
@@ -347,6 +310,7 @@ public static Frame from(int streamId, final Throwable throwable, ByteBuf dataBu
347310
348311 final int code = ErrorFrameFlyweight .errorCodeFromException (throwable );
349312 final Frame frame = RECYCLER .get ();
313+ frame .setRefCnt (1 );
350314 frame .content =
351315 ByteBufAllocator .DEFAULT .buffer (
352316 ErrorFrameFlyweight .computeFrameLength (dataBuffer .readableBytes ()));
@@ -378,6 +342,7 @@ private Lease() {}
378342
379343 public static Frame from (int ttl , int numberOfRequests , ByteBuf metadata ) {
380344 final Frame frame = RECYCLER .get ();
345+ frame .setRefCnt (1 );
381346 frame .content =
382347 ByteBufAllocator .DEFAULT .buffer (
383348 LeaseFrameFlyweight .computeFrameLength (metadata .readableBytes ()));
@@ -411,6 +376,7 @@ public static Frame from(int streamId, int requestN) {
411376 }
412377
413378 final Frame frame = RECYCLER .get ();
379+ frame .setRefCnt (1 );
414380 frame .content = ByteBufAllocator .DEFAULT .buffer (RequestNFrameFlyweight .computeFrameLength ());
415381 frame .content .writerIndex (RequestNFrameFlyweight .encode (frame .content , streamId , requestN ));
416382 return frame ;
@@ -438,6 +404,7 @@ public static Frame from(int streamId, FrameType type, Payload payload, int init
438404 final ByteBuf data = payload .sliceData ();
439405
440406 final Frame frame = RECYCLER .get ();
407+ frame .setRefCnt (1 );
441408 frame .content =
442409 ByteBufAllocator .DEFAULT .buffer (
443410 RequestFrameFlyweight .computeFrameLength (
@@ -464,6 +431,7 @@ public static Frame from(int streamId, FrameType type, Payload payload, int init
464431
465432 public static Frame from (int streamId , FrameType type , int flags ) {
466433 final Frame frame = RECYCLER .get ();
434+ frame .setRefCnt (1 );
467435 frame .content =
468436 ByteBufAllocator .DEFAULT .buffer (RequestFrameFlyweight .computeFrameLength (type , null , 0 ));
469437 frame .content .writerIndex (
@@ -480,6 +448,7 @@ public static Frame from(
480448 int initialRequestN ,
481449 int flags ) {
482450 final Frame frame = RECYCLER .get ();
451+ frame .setRefCnt (1 );
483452 frame .content =
484453 ByteBufAllocator .DEFAULT .buffer (
485454 RequestFrameFlyweight .computeFrameLength (
@@ -543,6 +512,7 @@ public static Frame from(int streamId, FrameType type, Payload payload, int flag
543512 public static Frame from (
544513 int streamId , FrameType type , @ Nullable ByteBuf metadata , ByteBuf data , int flags ) {
545514 final Frame frame = RECYCLER .get ();
515+ frame .setRefCnt (1 );
546516 frame .content =
547517 ByteBufAllocator .DEFAULT .buffer (
548518 FrameHeaderFlyweight .computeFrameHeaderLength (
@@ -559,6 +529,7 @@ private Cancel() {}
559529
560530 public static Frame from (int streamId ) {
561531 final Frame frame = RECYCLER .get ();
532+ frame .setRefCnt (1 );
562533 frame .content =
563534 ByteBufAllocator .DEFAULT .buffer (
564535 FrameHeaderFlyweight .computeFrameHeaderLength (FrameType .CANCEL , null , 0 ));
@@ -575,6 +546,7 @@ private Keepalive() {}
575546
576547 public static Frame from (ByteBuf data , boolean respond ) {
577548 final Frame frame = RECYCLER .get ();
549+ frame .setRefCnt (1 );
578550 frame .content =
579551 ByteBufAllocator .DEFAULT .buffer (
580552 KeepaliveFrameFlyweight .computeFrameLength (data .readableBytes ()));
@@ -611,12 +583,12 @@ public boolean equals(Object o) {
611583 return false ;
612584 }
613585 final Frame frame = (Frame ) o ;
614- return Objects .equals (content , frame .content );
586+ return content .equals (frame .content () );
615587 }
616588
617589 @ Override
618590 public int hashCode () {
619- return Objects . hash ( content );
591+ return content . hashCode ( );
620592 }
621593
622594 @ Override
0 commit comments