From 68b406d5aa02c566475cd03c0c544984dcd9ad29 Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Mon, 4 Sep 2023 13:47:36 +0800 Subject: [PATCH] Update dll Fix ArgumentNullException on DotNetty.Transport.Channels.AbstractChannelHandlerContext.IsSkippable --- .../Plugins/DotNetty.Buffers.dll.mdb.meta | 14 +- .../Plugins/DotNetty.Buffers.dll.meta | 66 +- .../Plugins/DotNetty.Buffers.pdb.meta | 14 +- .../csharp-kcp/Plugins/DotNetty.Buffers.xml | 3956 ++++++------- .../Plugins/DotNetty.Buffers.xml.meta | 14 +- .../Plugins/DotNetty.Codecs.dll.mdb.meta | 14 +- .../Plugins/DotNetty.Codecs.dll.meta | 66 +- .../Plugins/DotNetty.Codecs.pdb.meta | 14 +- .../csharp-kcp/Plugins/DotNetty.Codecs.xml | 1292 ++--- .../Plugins/DotNetty.Codecs.xml.meta | 14 +- .../Plugins/DotNetty.Common.dll.mdb.meta | 14 +- .../Plugins/DotNetty.Common.dll.meta | 66 +- .../Plugins/DotNetty.Common.pdb.meta | 14 +- .../csharp-kcp/Plugins/DotNetty.Common.xml | 4298 +++++++------- .../Plugins/DotNetty.Common.xml.meta | 14 +- .../Plugins/DotNetty.Handlers.dll.mdb.meta | 14 +- .../Plugins/DotNetty.Handlers.dll.meta | 66 +- .../Plugins/DotNetty.Handlers.pdb.meta | 14 +- .../csharp-kcp/Plugins/DotNetty.Handlers.xml | 1182 ++-- .../Plugins/DotNetty.Handlers.xml.meta | 14 +- .../csharp-kcp/Plugins/DotNetty.Transport.dll | Bin 159744 -> 174592 bytes .../Plugins/DotNetty.Transport.dll.mdb.meta | 14 +- .../Plugins/DotNetty.Transport.dll.meta | 66 +- .../csharp-kcp/Plugins/DotNetty.Transport.pdb | Bin 796160 -> 105132 bytes .../Plugins/DotNetty.Transport.pdb.meta | 14 +- .../csharp-kcp/Plugins/DotNetty.Transport.xml | 4928 ++++++++--------- .../Plugins/DotNetty.Transport.xml.meta | 14 +- .../Plugins/DotNetty.Unity.dll.mdb.meta | 14 +- .../Plugins/DotNetty.Unity.dll.meta | 66 +- .../Plugins/DotNetty.Unity.pdb.meta | 14 +- Runtime/csharp-kcp/Plugins/DotNetty.Unity.xml | 16 +- .../Plugins/DotNetty.Unity.xml.meta | 14 +- Runtime/csharp-kcp/Plugins/LICENSE.txt.meta | 14 +- ...m.Runtime.CompilerServices.Unsafe.dll.meta | 66 +- 34 files changed, 8200 insertions(+), 8200 deletions(-) diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.dll.mdb.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.dll.mdb.meta index 432ce29..6d28c93 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.dll.mdb.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.dll.mdb.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: e9f013cd847fa5144a1b8089fe0a7888 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: e9f013cd847fa5144a1b8089fe0a7888 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.dll.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.dll.meta index 3e863e4..a834046 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.dll.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.dll.meta @@ -1,33 +1,33 @@ -fileFormatVersion: 2 -guid: ec820f421ab70614f92d92ce8266e58b -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: ec820f421ab70614f92d92ce8266e58b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.pdb.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.pdb.meta index 43a7034..9199bc8 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.pdb.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.pdb.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: f115da9a4e605a04590cbbc5c46e416f -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: f115da9a4e605a04590cbbc5c46e416f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.xml b/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.xml index f23c85d..398152b 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.xml +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.xml @@ -1,1978 +1,1978 @@ - - - - DotNetty.Buffers - - - - - - Abstract base class implementation of a - - - - - - Abstract base class for instances - - - - - - Abstract base class for implementations that wrap another - . - - - - - Returns a hex dump - of the specified buffer's sub-region. - - - - - Returns a hex dump - of the specified buffer's sub-region. - - - - - Returns a hex dump - of the specified buffer's sub-region. - - - - - Returns a hex dump - of the specified buffer's sub-region. - - - - - Calculates the hash code of the specified buffer. This method is - useful when implementing a new buffer type. - - - - - Returns the reader index of needle in haystack, or -1 if needle is not in haystack. - - - - - Returns {@code true} if and only if the two specified buffers are - identical to each other for {@code length} bytes starting at {@code aStartIndex} - index for the {@code a} buffer and {@code bStartIndex} index for the {@code b} buffer. - A more compact way to express this is: -

- {@code a[aStartIndex : aStartIndex + length] == b[bStartIndex : bStartIndex + length]} -

-
- - - Returns {@code true} if and only if the two specified buffers are - identical to each other as described in {@link ByteBuf#equals(Object)}. - This method is useful when implementing a new buffer type. - - - - - Compares the two specified buffers as described in {@link ByteBuf#compareTo(ByteBuf)}. - This method is useful when implementing a new buffer type. - - - - - The default implementation of . - This method is useful when implementing a new buffer type. - - - - - Read the given amount of bytes into a new {@link ByteBuf} that is allocated from the {@link ByteBufAllocator}. - - - - - Encode a string in http://en.wikipedia.org/wiki/UTF-8 and write it into reserveBytes of - a byte buffer. The reserveBytes must be computed (ie eagerly using {@link #utf8MaxBytes(string)} - or exactly with #utf8Bytes(string)}) to ensure this method not to not: for performance reasons - the index checks will be performed using just reserveBytes. - - This method returns the actual number of bytes written. - - - - Encode the given using the given into a new - which - is allocated via the . - - The to allocate {@link IByteBuffer}. - src The to encode. - charset The specified - - - - Encode the given using the given into a new - which - is allocated via the . - - The to allocate {@link IByteBuffer}. - src The to encode. - charset The specified - the extra capacity to alloc except the space for decoding. - - - - Returns a multi-line hexadecimal dump of the specified {@link ByteBuf} that is easy to read by humans. - - - - - Returns a multi-line hexadecimal dump of the specified {@link ByteBuf} that is easy to read by humans, - starting at the given {@code offset} using the given {@code length}. - - - - - Appends the prettified multi-line hexadecimal dump of the specified {@link ByteBuf} to the specified - {@link StringBuilder} that is easy to read by humans. - - - - - Appends the prettified multi-line hexadecimal dump of the specified {@link ByteBuf} to the specified - {@link StringBuilder} that is easy to read by humans, starting at the given {@code offset} using - the given {@code length}. - - - - - Toggles the endianness of the specified 64-bit long integer. - - - - - Toggles the endianness of the specified 32-bit integer. - - - - - Toggles the endianness of the specified 16-bit integer. - - - - - Default on most Windows systems - - - - - Add the given {@link IByteBuffer}. - Be aware that this method does not increase the {@code writerIndex} of the {@link CompositeByteBuffer}. - If you need to have it increased you need to handle it by your own. - @param buffer the {@link IByteBuffer} to add - - - - - Add the given {@link IByteBuffer}s. - Be aware that this method does not increase the {@code writerIndex} of the {@link CompositeByteBuffer}. - If you need to have it increased you need to handle it by your own. - @param buffers the {@link IByteBuffer}s to add - - - - - Add the given {@link IByteBuffer}s. - Be aware that this method does not increase the {@code writerIndex} of the {@link CompositeByteBuffer}. - If you need to have it increased you need to handle it by your own. - @param buffers the {@link IByteBuffer}s to add - - - - - Add the given {@link IByteBuffer} on the specific index. - Be aware that this method does not increase the {@code writerIndex} of the {@link CompositeByteBuffer}. - If you need to have it increased you need to handle it by your own. - @param cIndex the index on which the {@link IByteBuffer} will be added - @param buffer the {@link IByteBuffer} to add - - - - - Add the given {@link IByteBuffer}s on the specific index - Be aware that this method does not increase the {@code writerIndex} of the {@link CompositeByteBuffer}. - If you need to have it increased you need to handle it by your own. - @param cIndex the index on which the {@link IByteBuffer} will be added. - @param buffers the {@link IByteBuffer}s to add - - - - - Add the given {@link ByteBuf}s on the specific index - Be aware that this method does not increase the {@code writerIndex} of the {@link CompositeByteBuffer}. - If you need to have it increased you need to handle it by your own. - @param cIndex the index on which the {@link IByteBuffer} will be added. - @param buffers the {@link IByteBuffer}s to add - - - - - This should only be called as last operation from a method as this may adjust the underlying - array of components and so affect the index etc. - - - - - Remove the {@link IByteBuffer} from the given index. - @param cIndex the index on from which the {@link IByteBuffer} will be remove - - - - - Remove the number of {@link IByteBuffer}s starting from the given index. - @param cIndex the index on which the {@link IByteBuffer}s will be started to removed - @param numComponents the number of components to remove - - - - - Same with {@link #slice(int, int)} except that this method returns a list. - - - - - Return the current number of {@link IByteBuffer}'s that are composed in this instance - - - - - Return the max number of {@link IByteBuffer}'s that are composed in this instance - - - - - Return the index for the given offset - - - - - Return the {@link IByteBuffer} on the specified index - @param cIndex the index for which the {@link IByteBuffer} should be returned - @return buffer the {@link IByteBuffer} on the specified index - - - - - Return the {@link IByteBuffer} on the specified index - @param offset the offset for which the {@link IByteBuffer} should be returned - @return the {@link IByteBuffer} on the specified index - - - - - Return the internal {@link IByteBuffer} on the specified index. Note that updating the indexes of the returned - buffer will lead to an undefined behavior of this buffer. - @param cIndex the index for which the {@link IByteBuffer} should be returned - - - - - Return the internal {@link IByteBuffer} on the specified offset. Note that updating the indexes of the returned - buffer will lead to an undefined behavior of this buffer. - @param offset the offset for which the {@link IByteBuffer} should be returned - - - - - Consolidate the composed {@link IByteBuffer}s - - - - - Consolidate the composed {@link IByteBuffer}s - @param cIndex the index on which to start to compose - @param numComponents the number of components to compose - - - - - Discard all {@link IByteBuffer}s which are read. - - - - - - Represents an empty byte buffer - - - - - Inspired by the Netty ByteBuffer implementation - (https://github.com/netty/netty/blob/master/buffer/src/main/java/io/netty/buffer/ByteBuf.java) - Provides circular-buffer-esque security around a byte array, allowing reads and writes to occur independently. - In general, the guarantees: - /// LESS THAN OR EQUAL TO LESS THAN OR EQUAL TO - . - - - - - Expands the capacity of this buffer so long as it is less than . - - - - - The allocator who created this buffer - - - - - Sets the of this buffer - - thrown if exceeds the length of the buffer - - - - Sets the of this buffer - - - thrown if is greater than - or less than 0. - - - - - Sets both indexes - - - thrown if or exceeds - the length of the buffer - - - - - Returns true if - is greater than 0. - - - - - Is the buffer readable if and only if the buffer contains equal or more than the specified number of elements - - The number of elements we would like to read - - - - Returns true if and only if - is greater than zero. - - - - - Returns true if and only if the buffer has enough to accomodate - additional bytes. - - The number of additional elements we would like to write. - - - - Sets the and to 0. Does not erase any of the data - written into the buffer already, - but it will overwrite that data. - - - - - Marks the current in this buffer. You can reposition the current - - to the marked by calling . - The initial value of the marked is 0. - - - - - Repositions the current to the marked in this buffer. - - - is thrown if the current is less than the - marked - - - - - Marks the current in this buffer. You can reposition the current - - to the marked by calling . - The initial value of the marked is 0. - - - - - Repositions the current to the marked in this buffer. - - - is thrown if the current is greater than the - marked - - - - - Discards the bytes between the 0th index and . - It moves the bytes between and to the 0th index, - and sets and to 0 and - oldWriterIndex - oldReaderIndex respectively. - - - - - Similar to except that this method might discard - some, all, or none of read bytes depending on its internal implementation to reduce - overall memory bandwidth consumption at the cost of potentially additional memory - consumption. - - - - - Makes sure the number of is equal to or greater than - the specified value (.) If there is enough writable bytes in this buffer, - the method returns with no side effect. Otherwise, it raises an . - - The expected number of minimum writable bytes - - if + > - . - - - - - Tries to make sure the number of - is equal to or greater than the specified value. Unlike , - this method does not raise an exception but returns a code. - - the expected minimum number of writable bytes - - When + minWritableBytes > : -
    -
  • true - the capacity of the buffer is expanded to
  • -
  • false - the capacity of the buffer is unchanged
  • -
- - - 0 if the buffer has enough writable bytes, and its capacity is unchanged. - 1 if the buffer does not have enough bytes, and its capacity is unchanged. - 2 if the buffer has enough writable bytes, and its capacity has been increased. - 3 if the buffer does not have enough bytes, but its capacity has been increased to its maximum. - -
- - - Gets a boolean at the specified absolute in this buffer. - This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 1 greater than - - - - - Gets a byte at the specified absolute in this buffer. - This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 1 greater than - - - - - Gets a short at the specified absolute in this buffer. - This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 2 greater than - - - - - Gets a short at the specified absolute in this buffer - in Little Endian Byte Order. This method does not modify - or of this buffer. - - - if the specified is less than 0 or - index + 2 greater than - - - - - Gets an ushort at the specified absolute in this buffer. - This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 2 greater than - - - - - Gets an ushort at the specified absolute in this buffer - in Little Endian Byte Order. This method does not modify - or of this buffer. - - - if the specified is less than 0 or - index + 2 greater than - - - - - Gets an integer at the specified absolute in this buffer. - This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Gets an integer at the specified absolute in this buffer - in Little Endian Byte Order. This method does not modify - or of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Gets an unsigned integer at the specified absolute in this buffer. - This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Gets an unsigned integer at the specified absolute in this buffer - in Little Endian Byte Order. This method does not modify - or of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Gets a long integer at the specified absolute in this buffer. - This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 8 greater than - - - - - Gets a long integer at the specified absolute in this buffer - in Little Endian Byte Order. This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 8 greater than - - - - - Gets a 24-bit medium integer at the specified absolute index in this buffer. - This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 3 greater than - - - - - Gets a 24-bit medium integer at the specified absolute index in this buffer - in Little Endian Byte Order. This method does not modify - or of this buffer. - - - if the specified is less than 0 or - index + 3 greater than - - - - - Gets an unsigned 24-bit medium integer at the specified absolute index in this buffer. - This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 3 greater than - - - - - Gets an unsigned 24-bit medium integer at the specified absolute index in this buffer - in Little Endian Byte Order. This method does not modify - or of this buffer. - - - if the specified is less than 0 or - index + 3 greater than - - - - - Gets a char at the specified absolute in this buffer. - This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 2 greater than - - - - - Gets a float at the specified absolute in this buffer. - This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Gets a float at the specified absolute in this buffer - in Little Endian Byte Order. This method does not modify - or of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Gets a double at the specified absolute in this buffer. - This method does not modify or - of this buffer. - - - if the specified is less than 0 or - index + 8 greater than - - - - - Gets a double at the specified absolute in this buffer - in Little Endian Byte Order. This method does not modify - or of this buffer. - - - if the specified is less than 0 or - index + 8 greater than - - - - - Transfers this buffers data to the specified buffer starting at the specified - absolute until the destination becomes non-writable. - - - if the specified is less than 0 or - index + 1 greater than - - - - - Transfers this buffers data to the specified buffer starting at the specified - absolute until the destination becomes non-writable. - - - if the specified is less than 0 or - index + 1 greater than - - - - - Transfers this buffers data to the specified buffer starting at the specified - absolute until the destination becomes non-writable. - - - if the specified is less than 0 or - index + 1 greater than - - - - - Transfers this buffers data to the specified buffer starting at the specified - absolute until the destination becomes non-writable. - - - if the specified is less than 0 or - index + 1 greater than - - - - - Transfers this buffers data to the specified buffer starting at the specified - absolute until the destination becomes non-writable. - - - if the specified is less than 0 or - index + 1 greater than - - - - - Transfers this buffer's data to the specified stream starting at the - specified absolute index. - - - This method does not modify readerIndex or writerIndex of - this buffer. - - absolute index in this buffer to start getting bytes from - destination stream - the number of bytes to transfer - - if the specified index is less than 0 or - if index + length is greater than - this.capacity - - - - - Gets a string with the given length at the given index. - - - length the length to read - charset that should be use - the string value. - - if length is greater than readable bytes. - - - - - Sets the specified boolean at the specified absolute in this buffer. - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - index + 1 greater than - - - - - Sets the specified byte at the specified absolute in this buffer. - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - index + 1 greater than - - - - - Sets the specified short at the specified absolute in this buffer. - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - index + 2 greater than - - - - - Sets the specified short at the specified absolute in this buffer - in the Little Endian Byte Order. This method does not directly modify - or of this buffer. - - - if the specified is less than 0 or - index + 2 greater than - - - - - Sets the specified unsigned short at the specified absolute in this buffer. - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - index + 2 greater than - - - - - Sets the specified unsigned short at the specified absolute in this buffer - in the Little Endian Byte Order. This method does not directly modify - or of this buffer. - - - if the specified is less than 0 or - index + 2 greater than - - - - - Sets the specified integer at the specified absolute in this buffer. - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Sets the specified integer at the specified absolute in this buffer - in the Little Endian Byte Order. This method does not directly modify - or of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Sets the specified unsigned integer at the specified absolute in this buffer. - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Sets the specified unsigned integer at the specified absolute in this buffer - in the Little Endian Byte Order. This method does not directly modify or - of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Sets the specified 24-bit medium integer at the specified absolute in this buffer. - Note that the most significant byte is ignored in the specified value. - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - index + 3 greater than - - - - - Sets the specified 24-bit medium integer at the specified absolute in this buffer. - Note that the most significant byte is ignored in the specified value. - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - index + 3 greater than - - - - - Sets the specified long integer at the specified absolute in this buffer. - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - index + 8 greater than - - - - - Sets the specified long integer at the specified absolute in this buffer - in the Little Endian Byte Order. This method does not directly modify or - of this buffer. - - - if the specified is less than 0 or - index + 8 greater than - - - - - Sets the specified UTF-16 char at the specified absolute in this buffer. - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - index + 2 greater than - - - - - Sets the specified double at the specified absolute in this buffer. - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - index + 8 greater than - - - - - Sets the specified float at the specified absolute in this buffer. - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Sets the specified float at the specified absolute in this buffer - in Little Endian Byte Order. This method does not directly modify - or of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Sets the specified float at the specified absolute in this buffer - in Little Endian Byte Order. This method does not directly modify - or of this buffer. - - - if the specified is less than 0 or - index + 4 greater than - - - - - Transfers the byte buffer's contents starting at the specified absolute . - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - + .ReadableBytes greater than - - - - - Transfers the byte buffer's contents starting at the specified absolute . - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - is less than 0 or - + greater than - - - - - Transfers the byte buffer's contents starting at the specified absolute . - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - is less than 0 or - is less than 0 or - + greater than or - + greater than .Capacity - - - - - Transfers the byte buffer's contents starting at the specified absolute . - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - + .Length greater than - - - - - Transfers the byte buffer's contents starting at the specified absolute . - This method does not directly modify or of this buffer. - - - if the specified is less than 0 or - is less than 0 or - is less than 0 or - + greater than or - + greater than .Length - - - - - Transfers the content of the specified source stream to this buffer - starting at the specified absolute . - This method does not modify or of - this buffer. - - absolute index in this byte buffer to start writing to - - number of bytes to transfer - cancellation token - the actual number of bytes read in from the specified channel. - - if the specified index is less than 0 or - if index + length is greater than this.capacity - - - - - Fills this buffer with NULL (0x00) starting at the specified - absolute index. This method does not modify reader index - or writer index of this buffer - - absolute index in this byte buffer to start writing to - length the number of NULs to write to the buffer - - if the specified index is less than 0 or if index + length - is greater than capacity. - - - - - Writes the specified string at the current writer index and increases - the writer index by the written bytes. - - Index on which the string should be written - The string value. - Encoding that should be used. - The written number of bytes. - - if writable bytes is not large enough to write the whole string. - - - - - Gets a boolean at the current and increases the - by 1 in this buffer. - - if is less than 1 - - - - Gets a byte at the current and increases the - by 1 in this buffer. - - if is less than 1 - - - - Gets a short at the current and increases the - by 2 in this buffer. - - if is less than 2 - - - - Gets a short at the current in the Little Endian Byte Order and increases - the by 2 in this buffer. - - if is less than 2 - - - - Gets a 24-bit medium integer at the current and increases the - by 3 in this buffer. - - if is less than 3 - - - - Gets a 24-bit medium integer at the current in the Little Endian Byte Order and - increases the by 3 in this buffer. - - if is less than 3 - - - - Gets an unsigned 24-bit medium integer at the current and increases the - by 3 in this buffer. - - if is less than 3 - - - - Gets an unsigned 24-bit medium integer at the current in the Little Endian Byte Order - and increases the by 3 in this buffer. - - if is less than 3 - - - - Gets an unsigned short at the current and increases the - by 2 in this buffer. - - if is less than 2 - - - - Gets an unsigned short at the current in the Little Endian Byte Order and - increases the by 2 in this buffer. - - if is less than 2 - - - - Gets an integer at the current and increases the - by 4 in this buffer. - - if is less than 4 - - - - Gets an integer at the current in the Little Endian Byte Order and increases - the by 4 in this buffer. - - if is less than 4 - - - - Gets an unsigned integer at the current and increases the - by 4 in this buffer. - - if is less than 4 - - - - Gets an unsigned integer at the current in the Little Endian Byte Order and - increases the by 4 in this buffer. - - if is less than 4 - - - - Gets an long at the current and increases the - by 8 in this buffer. - - if is less than 4 - - - - Gets an long at the current in the Little Endian Byte Order and - increases the by 8 in this buffer. - - if is less than 4 - - - - Gets a 2-byte UTF-16 character at the current and increases the - - by 2 in this buffer. - - if is less than 2 - - - - Gets an 8-byte Decimaling integer at the current and increases the - - by 8 in this buffer. - - if is less than 8 - - - - Gets an 8-byte Decimaling integer at the current and increases the - by 8 in this buffer in Little Endian Byte Order. - - if is less than 8 - - - - Gets an 4-byte Decimaling integer at the current and increases the - - by 4 in this buffer. - - if is less than 4 - - - - Gets an 4-byte Decimaling integer at the current and increases the - by 4 in this buffer in Little Endian Byte Order. - - if is less than 4 - - - - Reads bytes from this buffer into a new destination buffer. - - - if is less than - - - - - Transfers bytes from this buffer's data into the specified destination buffer - starting at the current until the destination becomes - non-writable and increases the by the number of transferred bytes. - - - if destination. is greater than - . - - - - - Gets a string with the given length at the current reader index - and increases the reader index by the given length. - - The length to read - Encoding that should be used - The string value - - - - Increases the current by the specified in this buffer. - - if is greater than . - - - - Returns the maximum of that this buffer holds. Note that - - or might return a less number of s of - . - - - -1 if this buffer cannot represent its content as of . - the number of the underlying s if this buffer has at least one underlying segment. - Note that this method does not return 0 to avoid confusion. - - - - - - - - - Exposes this buffer's readable bytes as an of . Returned segment - shares the content with this buffer. This method is identical - to buf.GetIoBuffer(buf.ReaderIndex, buf.ReadableBytes). This method does not - modify or of this buffer. Please note that the - returned segment will not see the changes of this buffer if this buffer is a dynamic - buffer and it adjusted its capacity. - - - if this buffer cannot represent its content as - of - - - - - - - - Exposes this buffer's sub-region as an of . Returned segment - shares the content with this buffer. This method does not - modify or of this buffer. Please note that the - returned segment will not see the changes of this buffer if this buffer is a dynamic - buffer and it adjusted its capacity. - - - if this buffer cannot represent its content as - of - - - - - - - - Exposes this buffer's readable bytes as an array of of . Returned - segments - share the content with this buffer. This method does not - modify or of this buffer. Please note that - returned segments will not see the changes of this buffer if this buffer is a dynamic - buffer and it adjusted its capacity. - - - if this buffer cannot represent its content with - of - - - - - - - - Exposes this buffer's bytes as an array of of for the specified - index and length. - Returned segments share the content with this buffer. This method does - not modify or of this buffer. Please note that - returned segments will not see the changes of this buffer if this buffer is a dynamic - buffer and it adjusted its capacity. - - - if this buffer cannot represent its content with - of - - - - - - - - Flag that indicates if this is backed by a byte array or not - - - - - Grabs the underlying byte array for this buffer - - - - - Returns {@code true} if and only if this buffer has a reference to the low-level memory address that points - to the backing data. - - - - - Returns the low-level memory address that point to the first byte of ths backing data. - - The low-level memory address - - - - Returns the pointer address of the buffer if the memory is pinned. - - IntPtr.Zero if not pinned. - - - - Creates a deep clone of the existing byte array and returns it - - - - - Unwraps a nested buffer - - - - - Returns a copy of this buffer's readable bytes. Modifying the content of the - returned buffer or this buffer does not affect each other at all.This method is - identical to {@code buf.copy(buf.readerIndex(), buf.readableBytes())}. - This method does not modify {@code readerIndex} or {@code writerIndex} of this buffer. - - - - - Iterates over the readable bytes of this buffer with the specified processor in ascending order. - - - -1 if the processor iterated to or beyond the end of the readable bytes. - The last-visited index If the returned false. - - Processor. - - - - Iterates over the specified area of this buffer with the specified in ascending order. - (i.e. , (index + 1), .. (index + length - 1)) - - - -1 if the processor iterated to or beyond the end of the specified area. - The last-visited index If the returned false. - - Index. - Length. - Processor. - - - - Iterates over the readable bytes of this buffer with the specified in descending order. - - - -1 if the processor iterated to or beyond the beginning of the readable bytes. - The last-visited index If the returned false. - - Processor. - - - - Iterates over the specified area of this buffer with the specified in descending order. - (i.e. (index + length - 1), (index + length - 2), ... ) - - - -1 if the processor iterated to or beyond the beginning of the specified area. - The last-visited index If the returned false. - - Index. - Length. - Processor. - - - - Thread-safe interface for allocating /. - - - - - Returns the number of bytes of heap memory used by a {@link ByteBufAllocator} or {@code -1} if unknown. - - - - - Returns the number of bytes of direct memory used by a {@link ByteBufAllocator} or {@code -1} if unknown. - - - - - Returns a for a - - - - - Return the data which is held by this {@link ByteBufHolder}. - - - - - Create a deep copy of this {@link ByteBufHolder}. - - - - - Duplicate the {@link ByteBufHolder}. Be aware that this will not automatically call {@link #retain()}. - - - - - Duplicates this {@link ByteBufHolder}. This method returns a retained duplicate unlike {@link #duplicate()}. - - - - - Returns a new {@link ByteBufHolder} which contains the specified {@code content}. - - - - Returns the number of thread caches backed by this arena. - - - Returns the number of tiny sub-pages for the arena. - - - Returns the number of small sub-pages for the arena. - - - Returns the number of chunk lists for the arena. - - - Returns an unmodifiable {@link List} which holds {@link PoolSubpageMetric}s for tiny sub-pages. - - - Returns an unmodifiable {@link List} which holds {@link PoolSubpageMetric}s for small sub-pages. - - - Returns an unmodifiable {@link List} which holds {@link PoolChunkListMetric}s. - - - Return the number of allocations done via the arena. This includes all sizes. - - - Return the number of tiny allocations done via the arena. - - - Return the number of small allocations done via the arena. - - - Return the number of normal allocations done via the arena. - - - Return the number of huge allocations done via the arena. - - - Return the number of deallocations done via the arena. This includes all sizes. - - - Return the number of tiny deallocations done via the arena. - - - Return the number of small deallocations done via the arena. - - - Return the number of normal deallocations done via the arena. - - - Return the number of huge deallocations done via the arena. - - - Return the number of currently active allocations. - - - Return the number of currently active tiny allocations. - - - Return the number of currently active small allocations. - - - Return the number of currently active normal allocations. - - - Return the number of currently active huge allocations. - - - Return the number of active bytes that are currently allocated by the arena. - - - Return the minimum usage of the chunk list before which chunks are promoted to the previous list. - - - Return the maximum usage of the chunk list after which chunks are promoted to the next list. - - - Return the percentage of the current usage of the chunk. - - - Return the size of the chunk in bytes, this is the maximum of bytes that can be served out of the chunk. - - - Return the number of free bytes in the chunk. - - - Return the number of maximal elements that can be allocated out of the sub-page. - - - Return the number of available elements to be allocated. - - - Return the size (in bytes) of the elements that will be allocated. - - - Return the size (in bytes) of this page. - - - - Description of algorithm for PageRun/PoolSubpage allocation from PoolChunk - Notation: The following terms are important to understand the code - > page - a page is the smallest unit of memory chunk that can be allocated - > chunk - a chunk is a collection of pages - > in this code chunkSize = 2^{maxOrder} /// pageSize - To begin we allocate a byte array of size = chunkSize - Whenever a ByteBuf of given size needs to be created we search for the first position - in the byte array that has enough empty space to accommodate the requested size and - return a (long) handle that encodes this offset information, (this memory segment is then - marked as reserved so it is always used by exactly one ByteBuf and no more) - For simplicity all sizes are normalized according to PoolArena#normalizeCapacity method - This ensures that when we request for memory segments of size >= pageSize the normalizedCapacity - equals the next nearest power of 2 - To search for the first offset in chunk that has at least requested size available we construct a - complete balanced binary tree and store it in an array (just like heaps) - memoryMap - The tree looks like this (the size of each node being mentioned in the parenthesis) - depth=0 1 node (chunkSize) - depth=1 2 nodes (chunkSize/2) - .. - .. - depth=d 2^d nodes (chunkSize/2^d) - .. - depth=maxOrder 2^maxOrder nodes (chunkSize/2^{maxOrder} = pageSize) - depth=maxOrder is the last level and the leafs consist of pages - With this tree available searching in chunkArray translates like this: - To allocate a memory segment of size chunkSize/2^k we search for the first node (from left) at height k - which is unused - Algorithm: - ---------- - Encode the tree in memoryMap with the notation - memoryMap[id] = x => in the subtree rooted at id, the first node that is free to be allocated - is at depth x (counted from depth=0) i.e., at depths [depth_of_id, x), there is no node that is free - As we allocate and free nodes, we update values stored in memoryMap so that the property is maintained - Initialization - - In the beginning we construct the memoryMap array by storing the depth of a node at each node - i.e., memoryMap[id] = depth_of_id - Observations: - ------------- - 1) memoryMap[id] = depth_of_id => it is free / unallocated - 2) memoryMap[id] > depth_of_id => at least one of its child nodes is allocated, so we cannot allocate it, but - some of its children can still be allocated based on their availability - 3) memoryMap[id] = maxOrder + 1 => the node is fully allocated and thus none of its children can be allocated, it - is thus marked as unusable - Algorithm: [allocateNode(d) => we want to find the first node (from left) at height h that can be allocated] - ---------- - 1) start at root (i.e., depth = 0 or id = 1) - 2) if memoryMap[1] > d => cannot be allocated from this chunk - 3) if left node value <= h; we can allocate from left subtree so move to left and repeat until found - 4) else try in right subtree - Algorithm: [allocateRun(size)] - ---------- - 1) Compute d = log_2(chunkSize/size) - 2) Return allocateNode(d) - Algorithm: [allocateSubpage(size)] - ---------- - 1) use allocateNode(maxOrder) to find an empty (i.e., unused) leaf (i.e., page) - 2) use this handle to construct the PoolSubpage object or if it already exists just call init(normCapacity) - note that this PoolSubpage object is added to subpagesPool in the PoolArena when we init() it - Note: - ----- - In the implementation for improving cache coherence, - we store 2 pieces of information (i.e, 2 byte vals) as a short value in memoryMap - memoryMap[id]= (depth_of_id, x) - where as per convention defined above - the second value (i.e, x) indicates that the first node which is free to be allocated is at depth x (from root) - - - - Used to determine if the requested capacity is equal to or greater than pageSize. - - - Used to mark memory as unusable - - - Creates a special chunk that is not pooled. - - - Update method used by allocate - This is triggered only when a successor is allocated and all its predecessors - need to update their state - The minimal depth at which subtree rooted at id has some free space - - @param id id - - - Update method used by free - This needs to handle the special case when both children are completely free - in which case parent be directly allocated on request of size = child-size * 2 - - @param id id - - - Algorithm to allocate an index in memoryMap when we query for a free node - at depth d - - @param d depth - @return index in memoryMap - - - Allocate a run of pages (>=1) - - @param normCapacity normalized capacity - @return index in memoryMap - - - Create/ initialize a new PoolSubpage of normCapacity - Any PoolSubpage created/ initialized here is added to subpage pool in the PoolArena that owns this PoolChunk - - @param normCapacity normalized capacity - @return index in memoryMap - - - Free a subpage or a run of pages - When a subpage is freed from PoolSubpage, it might be added back to subpage pool of the owning PoolArena - If the subpage pool in PoolArena has at least one other PoolSubpage of given elemSize, we can - completely free the owning Page so it is available for subsequent allocations - - @param handle handle to free - - - represents the size in #bytes supported by node 'id' in the tree - - - Calculates the maximum capacity of a buffer that will ever be possible to allocate out of the {@link PoolChunk}s - that belong to the {@link PoolChunkList} with the given {@code minUsage} and {@code maxUsage} settings. - - - Moves the {@link PoolChunk} down the {@link PoolChunkList} linked-list so it will end up in the right - {@link PoolChunkList} that has the correct minUsage / maxUsage in respect to {@link PoolChunk#usage()}. - - - Adds the {@link PoolChunk} to this {@link PoolChunkList}. - - - Method must be called before reuse this {@link PooledByteBufAllocator} - - - Returns the status of the allocator (which contains all metrics) as string. Be aware this may be expensive - and so should not called too frequently. - - - Special constructor that creates a linked list head - - - Returns the bitmap index of the subpage allocation. - - - @return {@code true} if this subpage is in use. - {@code false} if this subpage is not used by its chunk and thus it's OK to be released. - - - - Acts a Thread cache for allocations. This implementation is moduled after - jemalloc and the descripted - technics of - - Scalable - memory allocation using jemalloc - - . - - - - Try to allocate a tiny buffer out of the cache. Returns {@code true} if successful {@code false} otherwise - - - Try to allocate a small buffer out of the cache. Returns {@code true} if successful {@code false} otherwise - - - Try to allocate a small buffer out of the cache. Returns {@code true} if successful {@code false} otherwise - - - Add {@link PoolChunk} and {@code handle} to the cache if there is enough room. - Returns {@code true} if it fit into the cache {@code false} otherwise. - - - Should be called if the Thread that uses this cache is about to exist to release resources out of the cache - - - Cache used for buffers which are backed by TINY or SMALL size. - - - Cache used for buffers which are backed by NORMAL size. - - - Init the {@link PooledByteBuffer} using the provided chunk and handle with the capacity restrictions. - - - Add to cache if not already full. - - - Allocate something out of the cache if possible and remove the entry from the cache. - - - Clear out this cache and free up all previous cached {@link PoolChunk}s and {@code handle}s. - - - Free up cached {@link PoolChunk}s if not allocated frequently enough. - - - - Utility class for managing and creating unpooled buffers - - - - - Creates a new big-endian buffer which wraps the specified array. - A modification on the specified array's content will be visible to the returned buffer. - - - - - Creates a new big-endian buffer which wraps the sub-region of the - specified array. A modification on the specified array's content - will be visible to the returned buffer. - - - - - Creates a new buffer which wraps the specified buffer's readable bytes. - A modification on the specified buffer's content will be visible to the returned buffer. - - The buffer to wrap. Reference count ownership of this variable is transfered to this method. - The readable portion of the buffer, or an empty buffer if there is no readable portion. - - - - Creates a new big-endian composite buffer which wraps the specified arrays without copying them. - A modification on the specified arrays' content will be visible to the returned buffer. - - - - - Creates a new big-endian composite buffer which wraps the readable bytes of the specified buffers without copying them. - A modification on the content of the specified buffers will be visible to the returned buffer. - - The buffers to wrap. Reference count ownership of all variables is transfered to this method. - The readable portion of the buffers. The caller is responsible for releasing this buffer. - - - - Creates a new big-endian composite buffer which wraps the specified arrays without copying them. - A modification on the specified arrays' content will be visible to the returned buffer. - - - - - Creates a new big-endian composite buffer which wraps the readable bytes of the specified buffers without copying them. - A modification on the content of the specified buffers will be visible to the returned buffer. - - Advisement as to how many independent buffers are allowed to exist before consolidation occurs. - The buffers to wrap. Reference count ownership of all variables is transfered to this method. - The readable portion of the buffers. The caller is responsible for releasing this buffer. - - - - Creates a new big-endian buffer whose content is a copy of the specified array - The new buffer's and - are 0 and respectively. - - A buffer we're going to copy. - The new buffer that copies the contents of array. - - - - Creates a new big-endian buffer whose content is a copy of the specified array. - The new buffer's and - are 0 and respectively. - - A buffer we're going to copy. - The index offset from which we're going to read array. - - The number of bytes we're going to read from array beginning from position offset. - - The new buffer that copies the contents of array. - - - - Creates a new big-endian buffer whose content is a copy of the specified . - The new buffer's and - are 0 and respectively. - - A buffer we're going to copy. - The new buffer that copies the contents of buffer. - - - - Creates a new big-endian buffer whose content is a merged copy of of the specified arrays. - The new buffer's and - are 0 and respectively. - - - - - - - Creates a new big-endian buffer whose content is a merged copy of the specified . - The new buffer's and - are 0 and respectively. - - Buffers we're going to copy. - The new buffer that copies the contents of buffers. - - - - Creates a new 4-byte big-endian buffer that holds the specified 32-bit integer. - - - - - Create a big-endian buffer that holds a sequence of the specified 32-bit integers. - - - - - Creates a new 2-byte big-endian buffer that holds the specified 16-bit integer. - - - - - Create a new big-endian buffer that holds a sequence of the specified 16-bit integers. - - - - - Create a new big-endian buffer that holds a sequence of the specified 16-bit integers. - - - - - Creates a new 3-byte big-endian buffer that holds the specified 24-bit integer. - - - - - Create a new big-endian buffer that holds a sequence of the specified 24-bit integers. - - - - - Creates a new 8-byte big-endian buffer that holds the specified 64-bit integer. - - - - - Create a new big-endian buffer that holds a sequence of the specified 64-bit integers. - - - - - Creates a new single-byte big-endian buffer that holds the specified boolean value. - - - - - Create a new big-endian buffer that holds a sequence of the specified boolean values. - - - - - Creates a new 4-byte big-endian buffer that holds the specified 32-bit floating point number. - - - - - Create a new big-endian buffer that holds a sequence of the specified 32-bit floating point numbers. - - - - - Creates a new 8-byte big-endian buffer that holds the specified 64-bit floating point number. - - - - - Create a new big-endian buffer that holds a sequence of the specified 64-bit floating point numbers. - - - - - Return a unreleasable view on the given {@link ByteBuf} which will just ignore release and retain calls. - - - - - Unpooled implementation of . - - - - Wraps another . - - It's important that the {@link #readerIndex()} and {@link #writerIndex()} will not do any adjustments on the - indices on the fly because of internal optimizations made by {@link ByteBufUtil#writeAscii(ByteBuf, CharSequence)} - and {@link ByteBufUtil#writeUtf8(ByteBuf, CharSequence)}. - -
-
+ + + + DotNetty.Buffers + + + + + + Abstract base class implementation of a + + + + + + Abstract base class for instances + + + + + + Abstract base class for implementations that wrap another + . + + + + + Returns a hex dump + of the specified buffer's sub-region. + + + + + Returns a hex dump + of the specified buffer's sub-region. + + + + + Returns a hex dump + of the specified buffer's sub-region. + + + + + Returns a hex dump + of the specified buffer's sub-region. + + + + + Calculates the hash code of the specified buffer. This method is + useful when implementing a new buffer type. + + + + + Returns the reader index of needle in haystack, or -1 if needle is not in haystack. + + + + + Returns {@code true} if and only if the two specified buffers are + identical to each other for {@code length} bytes starting at {@code aStartIndex} + index for the {@code a} buffer and {@code bStartIndex} index for the {@code b} buffer. + A more compact way to express this is: +

+ {@code a[aStartIndex : aStartIndex + length] == b[bStartIndex : bStartIndex + length]} +

+
+ + + Returns {@code true} if and only if the two specified buffers are + identical to each other as described in {@link ByteBuf#equals(Object)}. + This method is useful when implementing a new buffer type. + + + + + Compares the two specified buffers as described in {@link ByteBuf#compareTo(ByteBuf)}. + This method is useful when implementing a new buffer type. + + + + + The default implementation of . + This method is useful when implementing a new buffer type. + + + + + Read the given amount of bytes into a new {@link ByteBuf} that is allocated from the {@link ByteBufAllocator}. + + + + + Encode a string in http://en.wikipedia.org/wiki/UTF-8 and write it into reserveBytes of + a byte buffer. The reserveBytes must be computed (ie eagerly using {@link #utf8MaxBytes(string)} + or exactly with #utf8Bytes(string)}) to ensure this method not to not: for performance reasons + the index checks will be performed using just reserveBytes. + + This method returns the actual number of bytes written. + + + + Encode the given using the given into a new + which + is allocated via the . + + The to allocate {@link IByteBuffer}. + src The to encode. + charset The specified + + + + Encode the given using the given into a new + which + is allocated via the . + + The to allocate {@link IByteBuffer}. + src The to encode. + charset The specified + the extra capacity to alloc except the space for decoding. + + + + Returns a multi-line hexadecimal dump of the specified {@link ByteBuf} that is easy to read by humans. + + + + + Returns a multi-line hexadecimal dump of the specified {@link ByteBuf} that is easy to read by humans, + starting at the given {@code offset} using the given {@code length}. + + + + + Appends the prettified multi-line hexadecimal dump of the specified {@link ByteBuf} to the specified + {@link StringBuilder} that is easy to read by humans. + + + + + Appends the prettified multi-line hexadecimal dump of the specified {@link ByteBuf} to the specified + {@link StringBuilder} that is easy to read by humans, starting at the given {@code offset} using + the given {@code length}. + + + + + Toggles the endianness of the specified 64-bit long integer. + + + + + Toggles the endianness of the specified 32-bit integer. + + + + + Toggles the endianness of the specified 16-bit integer. + + + + + Default on most Windows systems + + + + + Add the given {@link IByteBuffer}. + Be aware that this method does not increase the {@code writerIndex} of the {@link CompositeByteBuffer}. + If you need to have it increased you need to handle it by your own. + @param buffer the {@link IByteBuffer} to add + + + + + Add the given {@link IByteBuffer}s. + Be aware that this method does not increase the {@code writerIndex} of the {@link CompositeByteBuffer}. + If you need to have it increased you need to handle it by your own. + @param buffers the {@link IByteBuffer}s to add + + + + + Add the given {@link IByteBuffer}s. + Be aware that this method does not increase the {@code writerIndex} of the {@link CompositeByteBuffer}. + If you need to have it increased you need to handle it by your own. + @param buffers the {@link IByteBuffer}s to add + + + + + Add the given {@link IByteBuffer} on the specific index. + Be aware that this method does not increase the {@code writerIndex} of the {@link CompositeByteBuffer}. + If you need to have it increased you need to handle it by your own. + @param cIndex the index on which the {@link IByteBuffer} will be added + @param buffer the {@link IByteBuffer} to add + + + + + Add the given {@link IByteBuffer}s on the specific index + Be aware that this method does not increase the {@code writerIndex} of the {@link CompositeByteBuffer}. + If you need to have it increased you need to handle it by your own. + @param cIndex the index on which the {@link IByteBuffer} will be added. + @param buffers the {@link IByteBuffer}s to add + + + + + Add the given {@link ByteBuf}s on the specific index + Be aware that this method does not increase the {@code writerIndex} of the {@link CompositeByteBuffer}. + If you need to have it increased you need to handle it by your own. + @param cIndex the index on which the {@link IByteBuffer} will be added. + @param buffers the {@link IByteBuffer}s to add + + + + + This should only be called as last operation from a method as this may adjust the underlying + array of components and so affect the index etc. + + + + + Remove the {@link IByteBuffer} from the given index. + @param cIndex the index on from which the {@link IByteBuffer} will be remove + + + + + Remove the number of {@link IByteBuffer}s starting from the given index. + @param cIndex the index on which the {@link IByteBuffer}s will be started to removed + @param numComponents the number of components to remove + + + + + Same with {@link #slice(int, int)} except that this method returns a list. + + + + + Return the current number of {@link IByteBuffer}'s that are composed in this instance + + + + + Return the max number of {@link IByteBuffer}'s that are composed in this instance + + + + + Return the index for the given offset + + + + + Return the {@link IByteBuffer} on the specified index + @param cIndex the index for which the {@link IByteBuffer} should be returned + @return buffer the {@link IByteBuffer} on the specified index + + + + + Return the {@link IByteBuffer} on the specified index + @param offset the offset for which the {@link IByteBuffer} should be returned + @return the {@link IByteBuffer} on the specified index + + + + + Return the internal {@link IByteBuffer} on the specified index. Note that updating the indexes of the returned + buffer will lead to an undefined behavior of this buffer. + @param cIndex the index for which the {@link IByteBuffer} should be returned + + + + + Return the internal {@link IByteBuffer} on the specified offset. Note that updating the indexes of the returned + buffer will lead to an undefined behavior of this buffer. + @param offset the offset for which the {@link IByteBuffer} should be returned + + + + + Consolidate the composed {@link IByteBuffer}s + + + + + Consolidate the composed {@link IByteBuffer}s + @param cIndex the index on which to start to compose + @param numComponents the number of components to compose + + + + + Discard all {@link IByteBuffer}s which are read. + + + + + + Represents an empty byte buffer + + + + + Inspired by the Netty ByteBuffer implementation + (https://github.com/netty/netty/blob/master/buffer/src/main/java/io/netty/buffer/ByteBuf.java) + Provides circular-buffer-esque security around a byte array, allowing reads and writes to occur independently. + In general, the guarantees: + /// LESS THAN OR EQUAL TO LESS THAN OR EQUAL TO + . + + + + + Expands the capacity of this buffer so long as it is less than . + + + + + The allocator who created this buffer + + + + + Sets the of this buffer + + thrown if exceeds the length of the buffer + + + + Sets the of this buffer + + + thrown if is greater than + or less than 0. + + + + + Sets both indexes + + + thrown if or exceeds + the length of the buffer + + + + + Returns true if - is greater than 0. + + + + + Is the buffer readable if and only if the buffer contains equal or more than the specified number of elements + + The number of elements we would like to read + + + + Returns true if and only if - is greater than zero. + + + + + Returns true if and only if the buffer has enough to accomodate + additional bytes. + + The number of additional elements we would like to write. + + + + Sets the and to 0. Does not erase any of the data + written into the buffer already, + but it will overwrite that data. + + + + + Marks the current in this buffer. You can reposition the current + + to the marked by calling . + The initial value of the marked is 0. + + + + + Repositions the current to the marked in this buffer. + + + is thrown if the current is less than the + marked + + + + + Marks the current in this buffer. You can reposition the current + + to the marked by calling . + The initial value of the marked is 0. + + + + + Repositions the current to the marked in this buffer. + + + is thrown if the current is greater than the + marked + + + + + Discards the bytes between the 0th index and . + It moves the bytes between and to the 0th index, + and sets and to 0 and + oldWriterIndex - oldReaderIndex respectively. + + + + + Similar to except that this method might discard + some, all, or none of read bytes depending on its internal implementation to reduce + overall memory bandwidth consumption at the cost of potentially additional memory + consumption. + + + + + Makes sure the number of is equal to or greater than + the specified value (.) If there is enough writable bytes in this buffer, + the method returns with no side effect. Otherwise, it raises an . + + The expected number of minimum writable bytes + + if + > + . + + + + + Tries to make sure the number of + is equal to or greater than the specified value. Unlike , + this method does not raise an exception but returns a code. + + the expected minimum number of writable bytes + + When + minWritableBytes > : +
    +
  • true - the capacity of the buffer is expanded to
  • +
  • false - the capacity of the buffer is unchanged
  • +
+ + + 0 if the buffer has enough writable bytes, and its capacity is unchanged. + 1 if the buffer does not have enough bytes, and its capacity is unchanged. + 2 if the buffer has enough writable bytes, and its capacity has been increased. + 3 if the buffer does not have enough bytes, but its capacity has been increased to its maximum. + +
+ + + Gets a boolean at the specified absolute in this buffer. + This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 1 greater than + + + + + Gets a byte at the specified absolute in this buffer. + This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 1 greater than + + + + + Gets a short at the specified absolute in this buffer. + This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 2 greater than + + + + + Gets a short at the specified absolute in this buffer + in Little Endian Byte Order. This method does not modify + or of this buffer. + + + if the specified is less than 0 or + index + 2 greater than + + + + + Gets an ushort at the specified absolute in this buffer. + This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 2 greater than + + + + + Gets an ushort at the specified absolute in this buffer + in Little Endian Byte Order. This method does not modify + or of this buffer. + + + if the specified is less than 0 or + index + 2 greater than + + + + + Gets an integer at the specified absolute in this buffer. + This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Gets an integer at the specified absolute in this buffer + in Little Endian Byte Order. This method does not modify + or of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Gets an unsigned integer at the specified absolute in this buffer. + This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Gets an unsigned integer at the specified absolute in this buffer + in Little Endian Byte Order. This method does not modify + or of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Gets a long integer at the specified absolute in this buffer. + This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 8 greater than + + + + + Gets a long integer at the specified absolute in this buffer + in Little Endian Byte Order. This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 8 greater than + + + + + Gets a 24-bit medium integer at the specified absolute index in this buffer. + This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 3 greater than + + + + + Gets a 24-bit medium integer at the specified absolute index in this buffer + in Little Endian Byte Order. This method does not modify + or of this buffer. + + + if the specified is less than 0 or + index + 3 greater than + + + + + Gets an unsigned 24-bit medium integer at the specified absolute index in this buffer. + This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 3 greater than + + + + + Gets an unsigned 24-bit medium integer at the specified absolute index in this buffer + in Little Endian Byte Order. This method does not modify + or of this buffer. + + + if the specified is less than 0 or + index + 3 greater than + + + + + Gets a char at the specified absolute in this buffer. + This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 2 greater than + + + + + Gets a float at the specified absolute in this buffer. + This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Gets a float at the specified absolute in this buffer + in Little Endian Byte Order. This method does not modify + or of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Gets a double at the specified absolute in this buffer. + This method does not modify or + of this buffer. + + + if the specified is less than 0 or + index + 8 greater than + + + + + Gets a double at the specified absolute in this buffer + in Little Endian Byte Order. This method does not modify + or of this buffer. + + + if the specified is less than 0 or + index + 8 greater than + + + + + Transfers this buffers data to the specified buffer starting at the specified + absolute until the destination becomes non-writable. + + + if the specified is less than 0 or + index + 1 greater than + + + + + Transfers this buffers data to the specified buffer starting at the specified + absolute until the destination becomes non-writable. + + + if the specified is less than 0 or + index + 1 greater than + + + + + Transfers this buffers data to the specified buffer starting at the specified + absolute until the destination becomes non-writable. + + + if the specified is less than 0 or + index + 1 greater than + + + + + Transfers this buffers data to the specified buffer starting at the specified + absolute until the destination becomes non-writable. + + + if the specified is less than 0 or + index + 1 greater than + + + + + Transfers this buffers data to the specified buffer starting at the specified + absolute until the destination becomes non-writable. + + + if the specified is less than 0 or + index + 1 greater than + + + + + Transfers this buffer's data to the specified stream starting at the + specified absolute index. + + + This method does not modify readerIndex or writerIndex of + this buffer. + + absolute index in this buffer to start getting bytes from + destination stream + the number of bytes to transfer + + if the specified index is less than 0 or + if index + length is greater than + this.capacity + + + + + Gets a string with the given length at the given index. + + + length the length to read + charset that should be use + the string value. + + if length is greater than readable bytes. + + + + + Sets the specified boolean at the specified absolute in this buffer. + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + index + 1 greater than + + + + + Sets the specified byte at the specified absolute in this buffer. + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + index + 1 greater than + + + + + Sets the specified short at the specified absolute in this buffer. + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + index + 2 greater than + + + + + Sets the specified short at the specified absolute in this buffer + in the Little Endian Byte Order. This method does not directly modify + or of this buffer. + + + if the specified is less than 0 or + index + 2 greater than + + + + + Sets the specified unsigned short at the specified absolute in this buffer. + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + index + 2 greater than + + + + + Sets the specified unsigned short at the specified absolute in this buffer + in the Little Endian Byte Order. This method does not directly modify + or of this buffer. + + + if the specified is less than 0 or + index + 2 greater than + + + + + Sets the specified integer at the specified absolute in this buffer. + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Sets the specified integer at the specified absolute in this buffer + in the Little Endian Byte Order. This method does not directly modify + or of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Sets the specified unsigned integer at the specified absolute in this buffer. + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Sets the specified unsigned integer at the specified absolute in this buffer + in the Little Endian Byte Order. This method does not directly modify or + of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Sets the specified 24-bit medium integer at the specified absolute in this buffer. + Note that the most significant byte is ignored in the specified value. + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + index + 3 greater than + + + + + Sets the specified 24-bit medium integer at the specified absolute in this buffer. + Note that the most significant byte is ignored in the specified value. + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + index + 3 greater than + + + + + Sets the specified long integer at the specified absolute in this buffer. + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + index + 8 greater than + + + + + Sets the specified long integer at the specified absolute in this buffer + in the Little Endian Byte Order. This method does not directly modify or + of this buffer. + + + if the specified is less than 0 or + index + 8 greater than + + + + + Sets the specified UTF-16 char at the specified absolute in this buffer. + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + index + 2 greater than + + + + + Sets the specified double at the specified absolute in this buffer. + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + index + 8 greater than + + + + + Sets the specified float at the specified absolute in this buffer. + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Sets the specified float at the specified absolute in this buffer + in Little Endian Byte Order. This method does not directly modify + or of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Sets the specified float at the specified absolute in this buffer + in Little Endian Byte Order. This method does not directly modify + or of this buffer. + + + if the specified is less than 0 or + index + 4 greater than + + + + + Transfers the byte buffer's contents starting at the specified absolute . + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + + .ReadableBytes greater than + + + + + Transfers the byte buffer's contents starting at the specified absolute . + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + is less than 0 or + + greater than + + + + + Transfers the byte buffer's contents starting at the specified absolute . + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + is less than 0 or + is less than 0 or + + greater than or + + greater than .Capacity + + + + + Transfers the byte buffer's contents starting at the specified absolute . + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + + .Length greater than + + + + + Transfers the byte buffer's contents starting at the specified absolute . + This method does not directly modify or of this buffer. + + + if the specified is less than 0 or + is less than 0 or + is less than 0 or + + greater than or + + greater than .Length + + + + + Transfers the content of the specified source stream to this buffer + starting at the specified absolute . + This method does not modify or of + this buffer. + + absolute index in this byte buffer to start writing to + + number of bytes to transfer + cancellation token + the actual number of bytes read in from the specified channel. + + if the specified index is less than 0 or + if index + length is greater than this.capacity + + + + + Fills this buffer with NULL (0x00) starting at the specified + absolute index. This method does not modify reader index + or writer index of this buffer + + absolute index in this byte buffer to start writing to + length the number of NULs to write to the buffer + + if the specified index is less than 0 or if index + length + is greater than capacity. + + + + + Writes the specified string at the current writer index and increases + the writer index by the written bytes. + + Index on which the string should be written + The string value. + Encoding that should be used. + The written number of bytes. + + if writable bytes is not large enough to write the whole string. + + + + + Gets a boolean at the current and increases the + by 1 in this buffer. + + if is less than 1 + + + + Gets a byte at the current and increases the + by 1 in this buffer. + + if is less than 1 + + + + Gets a short at the current and increases the + by 2 in this buffer. + + if is less than 2 + + + + Gets a short at the current in the Little Endian Byte Order and increases + the by 2 in this buffer. + + if is less than 2 + + + + Gets a 24-bit medium integer at the current and increases the + by 3 in this buffer. + + if is less than 3 + + + + Gets a 24-bit medium integer at the current in the Little Endian Byte Order and + increases the by 3 in this buffer. + + if is less than 3 + + + + Gets an unsigned 24-bit medium integer at the current and increases the + by 3 in this buffer. + + if is less than 3 + + + + Gets an unsigned 24-bit medium integer at the current in the Little Endian Byte Order + and increases the by 3 in this buffer. + + if is less than 3 + + + + Gets an unsigned short at the current and increases the + by 2 in this buffer. + + if is less than 2 + + + + Gets an unsigned short at the current in the Little Endian Byte Order and + increases the by 2 in this buffer. + + if is less than 2 + + + + Gets an integer at the current and increases the + by 4 in this buffer. + + if is less than 4 + + + + Gets an integer at the current in the Little Endian Byte Order and increases + the by 4 in this buffer. + + if is less than 4 + + + + Gets an unsigned integer at the current and increases the + by 4 in this buffer. + + if is less than 4 + + + + Gets an unsigned integer at the current in the Little Endian Byte Order and + increases the by 4 in this buffer. + + if is less than 4 + + + + Gets an long at the current and increases the + by 8 in this buffer. + + if is less than 4 + + + + Gets an long at the current in the Little Endian Byte Order and + increases the by 8 in this buffer. + + if is less than 4 + + + + Gets a 2-byte UTF-16 character at the current and increases the + + by 2 in this buffer. + + if is less than 2 + + + + Gets an 8-byte Decimaling integer at the current and increases the + + by 8 in this buffer. + + if is less than 8 + + + + Gets an 8-byte Decimaling integer at the current and increases the + by 8 in this buffer in Little Endian Byte Order. + + if is less than 8 + + + + Gets an 4-byte Decimaling integer at the current and increases the + + by 4 in this buffer. + + if is less than 4 + + + + Gets an 4-byte Decimaling integer at the current and increases the + by 4 in this buffer in Little Endian Byte Order. + + if is less than 4 + + + + Reads bytes from this buffer into a new destination buffer. + + + if is less than + + + + + Transfers bytes from this buffer's data into the specified destination buffer + starting at the current until the destination becomes + non-writable and increases the by the number of transferred bytes. + + + if destination. is greater than + . + + + + + Gets a string with the given length at the current reader index + and increases the reader index by the given length. + + The length to read + Encoding that should be used + The string value + + + + Increases the current by the specified in this buffer. + + if is greater than . + + + + Returns the maximum of that this buffer holds. Note that + + or might return a less number of s of + . + + + -1 if this buffer cannot represent its content as of . + the number of the underlying s if this buffer has at least one underlying segment. + Note that this method does not return 0 to avoid confusion. + + + + + + + + + Exposes this buffer's readable bytes as an of . Returned segment + shares the content with this buffer. This method is identical + to buf.GetIoBuffer(buf.ReaderIndex, buf.ReadableBytes). This method does not + modify or of this buffer. Please note that the + returned segment will not see the changes of this buffer if this buffer is a dynamic + buffer and it adjusted its capacity. + + + if this buffer cannot represent its content as + of + + + + + + + + Exposes this buffer's sub-region as an of . Returned segment + shares the content with this buffer. This method does not + modify or of this buffer. Please note that the + returned segment will not see the changes of this buffer if this buffer is a dynamic + buffer and it adjusted its capacity. + + + if this buffer cannot represent its content as + of + + + + + + + + Exposes this buffer's readable bytes as an array of of . Returned + segments + share the content with this buffer. This method does not + modify or of this buffer. Please note that + returned segments will not see the changes of this buffer if this buffer is a dynamic + buffer and it adjusted its capacity. + + + if this buffer cannot represent its content with + of + + + + + + + + Exposes this buffer's bytes as an array of of for the specified + index and length. + Returned segments share the content with this buffer. This method does + not modify or of this buffer. Please note that + returned segments will not see the changes of this buffer if this buffer is a dynamic + buffer and it adjusted its capacity. + + + if this buffer cannot represent its content with + of + + + + + + + + Flag that indicates if this is backed by a byte array or not + + + + + Grabs the underlying byte array for this buffer + + + + + Returns {@code true} if and only if this buffer has a reference to the low-level memory address that points + to the backing data. + + + + + Returns the low-level memory address that point to the first byte of ths backing data. + + The low-level memory address + + + + Returns the pointer address of the buffer if the memory is pinned. + + IntPtr.Zero if not pinned. + + + + Creates a deep clone of the existing byte array and returns it + + + + + Unwraps a nested buffer + + + + + Returns a copy of this buffer's readable bytes. Modifying the content of the + returned buffer or this buffer does not affect each other at all.This method is + identical to {@code buf.copy(buf.readerIndex(), buf.readableBytes())}. + This method does not modify {@code readerIndex} or {@code writerIndex} of this buffer. + + + + + Iterates over the readable bytes of this buffer with the specified processor in ascending order. + + + -1 if the processor iterated to or beyond the end of the readable bytes. + The last-visited index If the returned false. + + Processor. + + + + Iterates over the specified area of this buffer with the specified in ascending order. + (i.e. , (index + 1), .. (index + length - 1)) + + + -1 if the processor iterated to or beyond the end of the specified area. + The last-visited index If the returned false. + + Index. + Length. + Processor. + + + + Iterates over the readable bytes of this buffer with the specified in descending order. + + + -1 if the processor iterated to or beyond the beginning of the readable bytes. + The last-visited index If the returned false. + + Processor. + + + + Iterates over the specified area of this buffer with the specified in descending order. + (i.e. (index + length - 1), (index + length - 2), ... ) + + + -1 if the processor iterated to or beyond the beginning of the specified area. + The last-visited index If the returned false. + + Index. + Length. + Processor. + + + + Thread-safe interface for allocating /. + + + + + Returns the number of bytes of heap memory used by a {@link ByteBufAllocator} or {@code -1} if unknown. + + + + + Returns the number of bytes of direct memory used by a {@link ByteBufAllocator} or {@code -1} if unknown. + + + + + Returns a for a + + + + + Return the data which is held by this {@link ByteBufHolder}. + + + + + Create a deep copy of this {@link ByteBufHolder}. + + + + + Duplicate the {@link ByteBufHolder}. Be aware that this will not automatically call {@link #retain()}. + + + + + Duplicates this {@link ByteBufHolder}. This method returns a retained duplicate unlike {@link #duplicate()}. + + + + + Returns a new {@link ByteBufHolder} which contains the specified {@code content}. + + + + Returns the number of thread caches backed by this arena. + + + Returns the number of tiny sub-pages for the arena. + + + Returns the number of small sub-pages for the arena. + + + Returns the number of chunk lists for the arena. + + + Returns an unmodifiable {@link List} which holds {@link PoolSubpageMetric}s for tiny sub-pages. + + + Returns an unmodifiable {@link List} which holds {@link PoolSubpageMetric}s for small sub-pages. + + + Returns an unmodifiable {@link List} which holds {@link PoolChunkListMetric}s. + + + Return the number of allocations done via the arena. This includes all sizes. + + + Return the number of tiny allocations done via the arena. + + + Return the number of small allocations done via the arena. + + + Return the number of normal allocations done via the arena. + + + Return the number of huge allocations done via the arena. + + + Return the number of deallocations done via the arena. This includes all sizes. + + + Return the number of tiny deallocations done via the arena. + + + Return the number of small deallocations done via the arena. + + + Return the number of normal deallocations done via the arena. + + + Return the number of huge deallocations done via the arena. + + + Return the number of currently active allocations. + + + Return the number of currently active tiny allocations. + + + Return the number of currently active small allocations. + + + Return the number of currently active normal allocations. + + + Return the number of currently active huge allocations. + + + Return the number of active bytes that are currently allocated by the arena. + + + Return the minimum usage of the chunk list before which chunks are promoted to the previous list. + + + Return the maximum usage of the chunk list after which chunks are promoted to the next list. + + + Return the percentage of the current usage of the chunk. + + + Return the size of the chunk in bytes, this is the maximum of bytes that can be served out of the chunk. + + + Return the number of free bytes in the chunk. + + + Return the number of maximal elements that can be allocated out of the sub-page. + + + Return the number of available elements to be allocated. + + + Return the size (in bytes) of the elements that will be allocated. + + + Return the size (in bytes) of this page. + + + + Description of algorithm for PageRun/PoolSubpage allocation from PoolChunk + Notation: The following terms are important to understand the code + > page - a page is the smallest unit of memory chunk that can be allocated + > chunk - a chunk is a collection of pages + > in this code chunkSize = 2^{maxOrder} /// pageSize + To begin we allocate a byte array of size = chunkSize + Whenever a ByteBuf of given size needs to be created we search for the first position + in the byte array that has enough empty space to accommodate the requested size and + return a (long) handle that encodes this offset information, (this memory segment is then + marked as reserved so it is always used by exactly one ByteBuf and no more) + For simplicity all sizes are normalized according to PoolArena#normalizeCapacity method + This ensures that when we request for memory segments of size >= pageSize the normalizedCapacity + equals the next nearest power of 2 + To search for the first offset in chunk that has at least requested size available we construct a + complete balanced binary tree and store it in an array (just like heaps) - memoryMap + The tree looks like this (the size of each node being mentioned in the parenthesis) + depth=0 1 node (chunkSize) + depth=1 2 nodes (chunkSize/2) + .. + .. + depth=d 2^d nodes (chunkSize/2^d) + .. + depth=maxOrder 2^maxOrder nodes (chunkSize/2^{maxOrder} = pageSize) + depth=maxOrder is the last level and the leafs consist of pages + With this tree available searching in chunkArray translates like this: + To allocate a memory segment of size chunkSize/2^k we search for the first node (from left) at height k + which is unused + Algorithm: + ---------- + Encode the tree in memoryMap with the notation + memoryMap[id] = x => in the subtree rooted at id, the first node that is free to be allocated + is at depth x (counted from depth=0) i.e., at depths [depth_of_id, x), there is no node that is free + As we allocate and free nodes, we update values stored in memoryMap so that the property is maintained + Initialization - + In the beginning we construct the memoryMap array by storing the depth of a node at each node + i.e., memoryMap[id] = depth_of_id + Observations: + ------------- + 1) memoryMap[id] = depth_of_id => it is free / unallocated + 2) memoryMap[id] > depth_of_id => at least one of its child nodes is allocated, so we cannot allocate it, but + some of its children can still be allocated based on their availability + 3) memoryMap[id] = maxOrder + 1 => the node is fully allocated and thus none of its children can be allocated, it + is thus marked as unusable + Algorithm: [allocateNode(d) => we want to find the first node (from left) at height h that can be allocated] + ---------- + 1) start at root (i.e., depth = 0 or id = 1) + 2) if memoryMap[1] > d => cannot be allocated from this chunk + 3) if left node value <= h; we can allocate from left subtree so move to left and repeat until found + 4) else try in right subtree + Algorithm: [allocateRun(size)] + ---------- + 1) Compute d = log_2(chunkSize/size) + 2) Return allocateNode(d) + Algorithm: [allocateSubpage(size)] + ---------- + 1) use allocateNode(maxOrder) to find an empty (i.e., unused) leaf (i.e., page) + 2) use this handle to construct the PoolSubpage object or if it already exists just call init(normCapacity) + note that this PoolSubpage object is added to subpagesPool in the PoolArena when we init() it + Note: + ----- + In the implementation for improving cache coherence, + we store 2 pieces of information (i.e, 2 byte vals) as a short value in memoryMap + memoryMap[id]= (depth_of_id, x) + where as per convention defined above + the second value (i.e, x) indicates that the first node which is free to be allocated is at depth x (from root) + + + + Used to determine if the requested capacity is equal to or greater than pageSize. + + + Used to mark memory as unusable + + + Creates a special chunk that is not pooled. + + + Update method used by allocate + This is triggered only when a successor is allocated and all its predecessors + need to update their state + The minimal depth at which subtree rooted at id has some free space + + @param id id + + + Update method used by free + This needs to handle the special case when both children are completely free + in which case parent be directly allocated on request of size = child-size * 2 + + @param id id + + + Algorithm to allocate an index in memoryMap when we query for a free node + at depth d + + @param d depth + @return index in memoryMap + + + Allocate a run of pages (>=1) + + @param normCapacity normalized capacity + @return index in memoryMap + + + Create/ initialize a new PoolSubpage of normCapacity + Any PoolSubpage created/ initialized here is added to subpage pool in the PoolArena that owns this PoolChunk + + @param normCapacity normalized capacity + @return index in memoryMap + + + Free a subpage or a run of pages + When a subpage is freed from PoolSubpage, it might be added back to subpage pool of the owning PoolArena + If the subpage pool in PoolArena has at least one other PoolSubpage of given elemSize, we can + completely free the owning Page so it is available for subsequent allocations + + @param handle handle to free + + + represents the size in #bytes supported by node 'id' in the tree + + + Calculates the maximum capacity of a buffer that will ever be possible to allocate out of the {@link PoolChunk}s + that belong to the {@link PoolChunkList} with the given {@code minUsage} and {@code maxUsage} settings. + + + Moves the {@link PoolChunk} down the {@link PoolChunkList} linked-list so it will end up in the right + {@link PoolChunkList} that has the correct minUsage / maxUsage in respect to {@link PoolChunk#usage()}. + + + Adds the {@link PoolChunk} to this {@link PoolChunkList}. + + + Method must be called before reuse this {@link PooledByteBufAllocator} + + + Returns the status of the allocator (which contains all metrics) as string. Be aware this may be expensive + and so should not called too frequently. + + + Special constructor that creates a linked list head + + + Returns the bitmap index of the subpage allocation. + + + @return {@code true} if this subpage is in use. + {@code false} if this subpage is not used by its chunk and thus it's OK to be released. + + + + Acts a Thread cache for allocations. This implementation is moduled after + jemalloc and the descripted + technics of + + Scalable + memory allocation using jemalloc + + . + + + + Try to allocate a tiny buffer out of the cache. Returns {@code true} if successful {@code false} otherwise + + + Try to allocate a small buffer out of the cache. Returns {@code true} if successful {@code false} otherwise + + + Try to allocate a small buffer out of the cache. Returns {@code true} if successful {@code false} otherwise + + + Add {@link PoolChunk} and {@code handle} to the cache if there is enough room. + Returns {@code true} if it fit into the cache {@code false} otherwise. + + + Should be called if the Thread that uses this cache is about to exist to release resources out of the cache + + + Cache used for buffers which are backed by TINY or SMALL size. + + + Cache used for buffers which are backed by NORMAL size. + + + Init the {@link PooledByteBuffer} using the provided chunk and handle with the capacity restrictions. + + + Add to cache if not already full. + + + Allocate something out of the cache if possible and remove the entry from the cache. + + + Clear out this cache and free up all previous cached {@link PoolChunk}s and {@code handle}s. + + + Free up cached {@link PoolChunk}s if not allocated frequently enough. + + + + Utility class for managing and creating unpooled buffers + + + + + Creates a new big-endian buffer which wraps the specified array. + A modification on the specified array's content will be visible to the returned buffer. + + + + + Creates a new big-endian buffer which wraps the sub-region of the + specified array. A modification on the specified array's content + will be visible to the returned buffer. + + + + + Creates a new buffer which wraps the specified buffer's readable bytes. + A modification on the specified buffer's content will be visible to the returned buffer. + + The buffer to wrap. Reference count ownership of this variable is transfered to this method. + The readable portion of the buffer, or an empty buffer if there is no readable portion. + + + + Creates a new big-endian composite buffer which wraps the specified arrays without copying them. + A modification on the specified arrays' content will be visible to the returned buffer. + + + + + Creates a new big-endian composite buffer which wraps the readable bytes of the specified buffers without copying them. + A modification on the content of the specified buffers will be visible to the returned buffer. + + The buffers to wrap. Reference count ownership of all variables is transfered to this method. + The readable portion of the buffers. The caller is responsible for releasing this buffer. + + + + Creates a new big-endian composite buffer which wraps the specified arrays without copying them. + A modification on the specified arrays' content will be visible to the returned buffer. + + + + + Creates a new big-endian composite buffer which wraps the readable bytes of the specified buffers without copying them. + A modification on the content of the specified buffers will be visible to the returned buffer. + + Advisement as to how many independent buffers are allowed to exist before consolidation occurs. + The buffers to wrap. Reference count ownership of all variables is transfered to this method. + The readable portion of the buffers. The caller is responsible for releasing this buffer. + + + + Creates a new big-endian buffer whose content is a copy of the specified array + The new buffer's and + are 0 and respectively. + + A buffer we're going to copy. + The new buffer that copies the contents of array. + + + + Creates a new big-endian buffer whose content is a copy of the specified array. + The new buffer's and + are 0 and respectively. + + A buffer we're going to copy. + The index offset from which we're going to read array. + + The number of bytes we're going to read from array beginning from position offset. + + The new buffer that copies the contents of array. + + + + Creates a new big-endian buffer whose content is a copy of the specified . + The new buffer's and + are 0 and respectively. + + A buffer we're going to copy. + The new buffer that copies the contents of buffer. + + + + Creates a new big-endian buffer whose content is a merged copy of of the specified arrays. + The new buffer's and + are 0 and respectively. + + + + + + + Creates a new big-endian buffer whose content is a merged copy of the specified . + The new buffer's and + are 0 and respectively. + + Buffers we're going to copy. + The new buffer that copies the contents of buffers. + + + + Creates a new 4-byte big-endian buffer that holds the specified 32-bit integer. + + + + + Create a big-endian buffer that holds a sequence of the specified 32-bit integers. + + + + + Creates a new 2-byte big-endian buffer that holds the specified 16-bit integer. + + + + + Create a new big-endian buffer that holds a sequence of the specified 16-bit integers. + + + + + Create a new big-endian buffer that holds a sequence of the specified 16-bit integers. + + + + + Creates a new 3-byte big-endian buffer that holds the specified 24-bit integer. + + + + + Create a new big-endian buffer that holds a sequence of the specified 24-bit integers. + + + + + Creates a new 8-byte big-endian buffer that holds the specified 64-bit integer. + + + + + Create a new big-endian buffer that holds a sequence of the specified 64-bit integers. + + + + + Creates a new single-byte big-endian buffer that holds the specified boolean value. + + + + + Create a new big-endian buffer that holds a sequence of the specified boolean values. + + + + + Creates a new 4-byte big-endian buffer that holds the specified 32-bit floating point number. + + + + + Create a new big-endian buffer that holds a sequence of the specified 32-bit floating point numbers. + + + + + Creates a new 8-byte big-endian buffer that holds the specified 64-bit floating point number. + + + + + Create a new big-endian buffer that holds a sequence of the specified 64-bit floating point numbers. + + + + + Return a unreleasable view on the given {@link ByteBuf} which will just ignore release and retain calls. + + + + + Unpooled implementation of . + + + + Wraps another . + + It's important that the {@link #readerIndex()} and {@link #writerIndex()} will not do any adjustments on the + indices on the fly because of internal optimizations made by {@link ByteBufUtil#writeAscii(ByteBuf, CharSequence)} + and {@link ByteBufUtil#writeUtf8(ByteBuf, CharSequence)}. + +
+
diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.xml.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.xml.meta index a87b2b2..4013c5f 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.xml.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Buffers.xml.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 991956ddfc61ef14ca46d3c8eae721e9 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 991956ddfc61ef14ca46d3c8eae721e9 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.dll.mdb.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.dll.mdb.meta index f43737e..d661e8e 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.dll.mdb.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.dll.mdb.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 70f0a8fa49650a4458ed62e36ce70603 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 70f0a8fa49650a4458ed62e36ce70603 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.dll.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.dll.meta index 44f0b5e..17e51c1 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.dll.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.dll.meta @@ -1,33 +1,33 @@ -fileFormatVersion: 2 -guid: 7fc98c66abee8d2489b521b5379ef98d -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 7fc98c66abee8d2489b521b5379ef98d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.pdb.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.pdb.meta index caffe26..7aa93ef 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.pdb.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.pdb.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 0ae5a74b089e32d4f9e7f3ffe94e6072 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 0ae5a74b089e32d4f9e7f3ffe94e6072 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.xml b/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.xml index 2999d6b..8bcbd67 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.xml +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.xml @@ -1,646 +1,646 @@ - - - - DotNetty.Codecs - - - - - http://www.faqs.org/rfcs/rfc3548.html - Table 1: The Base 64 Alphabet - - - - - http://www.faqs.org/rfcs/rfc3548.html - Table 2: The "URL and Filename safe" Base 64 Alphabet - - - - - Cumulates instances of by merging them into one , using memory - copies. - - - - - Cumulate instances of by add them to a and therefore - avoiding memory copy when possible. - - - Be aware that use a more complex indexing implementation so depending on your - use-case - and the decoder implementation this may be slower then just use the . - - - - - Determines whether only one message should be decoded per call. - Default is false as this has performance impacts. - - Is particularly useful in support of protocol upgrade scenarios. - - - - Returns the actual number of readable bytes in the internal cumulative - buffer of this decoder. You usually do not need to rely on this value - to write a decoder. Use it only when you must use it at your own risk. - This method is a shortcut to of . - - - - - An which is thrown by a codec. - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/Adler32.java - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/CRC32.java - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/Deflate.java - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/Deflater.java - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/GZIPException.java - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/GZIPHeader.java - - http://www.ietf.org/rfc/rfc1952.txt - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/InfBlocks.java - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/InfCodes.java - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/Inflate.java - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/Inflater.java - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/InfTree.java - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/JZlib.java - - - - Creates a new zlib encoder with the specified {@code compressionLevel}, - the specified {@code windowBits}, the specified {@code memLevel}, and - the specified wrapper. - - @param compressionLevel - {@code 1} yields the fastest compression and {@code 9} yields the - best compression. {@code 0} means no compression. The default - compression level is {@code 6}. - @param windowBits - The base two logarithm of the size of the history buffer. The - value should be in the range {@code 9} to {@code 15} inclusive. - Larger values result in better compression at the expense of - memory usage. The default value is {@code 15}. - @param memLevel - How much memory should be allocated for the internal compression - state. {@code 1} uses minimum memory and {@code 9} uses maximum - memory. Larger values result in better and faster compression - at the expense of memory usage. The default value is {@code 8} - - @throws CompressionException if failed to initialize zlib - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/StaticTree.java - - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/Tree.java - - - - Close this {@link ZlibEncoder} and so finish the encoding. - - The returned {@link ChannelFuture} will be notified once the - operation completes. - - - The container file formats that wrap the stream compressed by the DEFLATE - algorithm. - - - The ZLIB wrapper as specified in RFC 1950. - - - The GZIP wrapper as specified in RFC 1952. - - - Raw DEFLATE stream only (no header and no footer). - - - Try {@link #ZLIB} first and then {@link #NONE} if the first attempt fails. - Please note that you can specify this wrapper type only when decompressing. - - - - https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/ZStream.java - - - - Those methods are expected to be override by Inflater and Deflater. - In the future, they will become abstract methods. - - - - A which is thrown when the received frame data could not - be decoded by an inbound handler. - - - - - A decoder that splits the received by one or more - delimiters.It is particularly useful for decoding the frames which ends - with a delimiter such as or - -

Specifying more than one delimiter

- allows you to specify more than one - delimiter. If more than one delimiter is found in the buffer, it chooses - the delimiter which produces the shortest frame. For example, if you have - the following data in the buffer: - +--------------+ - | ABC\nDEF\r\n | - +--------------+ - a will choose '\n' as the first delimiter and produce two - frames: - +-----+-----+ - | ABC | DEF | - +-----+-----+ - rather than incorrectly choosing '\r\n' as the first delimiter: - +----------+ - | ABC\nDEF | - +----------+ -
-
- - Common constructor - - The maximum length of the decoded frame - NOTE: A see is thrown if the length of the frame exceeds this - value. - - whether the decoded frame should strip out the delimiter or not - - If true, a is - thrown as soon as the decoder notices the length of the - frame will exceedmaxFrameLength regardless of - whether the entire frame has been read. - If false, a is - thrown after the entire frame that exceeds maxFrameLength has been read. - - delimiters - - - Returns true if the delimiters are "\n" and "\r\n" - - - ReturnsReturn true if the current instance is a subclass of DelimiterBasedFrameDecoder - - - Create a frame out of the and return it - - the which this - belongs to - - the from which to read data - - the which represent the frame or null if no frame could be - created. - - - - Returns the number of bytes between the readerIndex of the haystack and - the first needle found in the haystack. -1 is returned if no needle is - found in the haystack. - - - Returns a null (0x00) delimiter, which could be used for Flash XML socket or any similar protocols - - - - Returns {@code CR ('\r')} and {@code LF ('\n')} delimiters, which could - be used for text-based line protocols. - - - - - Splits a byte stream of JSON objects and arrays into individual objects/arrays and passes them up the - . - This class does not do any real parsing or validation. A sequence of bytes is considered a JSON object/array - if it contains a matching number of opening and closing braces/brackets. It's up to a subsequent - - to parse the JSON text into a more usable form i.e.a POCO. - - - - - - Create a new instance. - - - The maximum length of the frame. If the length of the frame is - greater than this value then will be thrown. - - The offset of the length field. - The length of the length field. - - - - Create a new instance. - - - The maximum length of the frame. If the length of the frame is - greater than this value then will be thrown. - - The offset of the length field. - The length of the length field. - The compensation value to add to the value of the length field. - the number of first bytes to strip out from the decoded frame. - - - - Create a new instance. - - - The maximum length of the frame. If the length of the frame is - greater than this value then will be thrown. - - The offset of the length field. - The length of the length field. - The compensation value to add to the value of the length field. - the number of first bytes to strip out from the decoded frame. - - If true, a is thrown as soon as the decoder notices the length - of the frame will exceeed regardless of whether the entire frame has been - read. If false, a is thrown after the entire frame that exceeds - has been read. - Defaults to true in other overloads. - - - - - Create a new instance. - - The of the lenght field. - - The maximum length of the frame. If the length of the frame is - greater than this value then will be thrown. - - The offset of the length field. - The length of the length field. - The compensation value to add to the value of the length field. - the number of first bytes to strip out from the decoded frame. - - If true, a is thrown as soon as the decoder notices the length - of the frame will exceeed regardless of whether the entire frame has been - read. If false, a is thrown after the entire frame that exceeds - has been read. - Defaults to true in other overloads. - - - - - Create a frame out of the and return it. - - - The which this belongs - to. - - The from which to read data. - The which represents the frame or null if no frame could be created. - - - - Decodes the specified region of the buffer into an unadjusted frame length. The default implementation is - capable of decoding the specified region into an unsigned 8/16/24/32/64 bit integer. Override this method to - decode the length field encoded differently. - Note that this method must not modify the state of the specified buffer (e.g. - , - , and the content of the buffer.) - - The buffer we'll be extracting the frame length from. - The offset from the absolute . - The length of the framelenght field. Expected: 1, 2, 3, 4, or 8. - The preferred of buffer. - A long integer that represents the unadjusted length of the next frame. - - - - An encoder that prepends the length of the message. The length value is - prepended as a binary form. -

- For example, {@link LengthFieldPrepender}(2) will encode the - following 12-bytes string: -

-                    +----------------+
-                    | "HELLO, WORLD" |
-                    +----------------+
-                
- into the following: -
-                    +--------+----------------+
-                    + 0x000C | "HELLO, WORLD" |
-                    +--------+----------------+
-                
- If you turned on the {@code lengthIncludesLengthFieldLength} flag in the - constructor, the encoded data would look like the following - (12 (original data) + 2 (prepended data) = 14 (0xE)): -
-                    +--------+----------------+
-                    + 0x000E | "HELLO, WORLD" |
-                    +--------+----------------+
-                
-
-
- - - Creates a new instance. - - - The length of the prepended length field. - Only 1, 2, 3, 4, and 8 are allowed. - - - - - Creates a new instance. - - - The length of the prepended length field. - Only 1, 2, 3, 4, and 8 are allowed. - - - If true, the length of the prepended length field is added - to the value of the prepended length field. - - - - - Creates a new instance. - - - The length of the prepended length field. - Only 1, 2, 3, 4, and 8 are allowed. - - The compensation value to add to the value of the length field. - - - - Creates a new instance. - - - The length of the prepended length field. - Only 1, 2, 3, 4, and 8 are allowed. - - - If true, the length of the prepended length field is added - to the value of the prepended length field. - - The compensation value to add to the value of the length field. - - - - Creates a new instance. - - The of the length field. - - The length of the prepended length field. - Only 1, 2, 3, 4, and 8 are allowed. - - - If true, the length of the prepended length field is added - to the value of the prepended length field. - - The compensation value to add to the value of the length field. - - - - A decoder that splits the received {@link ByteBuf}s on line endings. - Both {@code "\n"} and {@code "\r\n"} are handled. - For a more general delimiter-based decoder, see {@link DelimiterBasedFrameDecoder}. - - - - Maximum length of a frame we're willing to decode. - - - Whether or not to throw an exception as soon as we exceed maxLength. - - - True if we're discarding input because we're already over maxLength. - - - - Initializes a new instance of the class. - - - the maximum length of the decoded frame. - A {@link TooLongFrameException} is thrown if - the length of the frame exceeds this value. - - - - - Initializes a new instance of the class. - - - the maximum length of the decoded frame. - A {@link TooLongFrameException} is thrown if - the length of the frame exceeds this value. - - - whether the decoded frame should strip out the - delimiter or not - - - If true, a {@link TooLongFrameException} is - thrown as soon as the decoder notices the length of the - frame will exceed maxFrameLength regardless of - whether the entire frame has been read. - If false, a {@link TooLongFrameException} is - thrown after the entire frame that exceeds - maxFrameLength has been read. - - - - - Create a frame out of the {@link ByteBuf} and return it. - - the {@link ChannelHandlerContext} which this {@link ByteToMessageDecoder} belongs to - the {@link ByteBuf} from which to read data - - - - - An abstract that aggregates a series of message objects - into a single aggregated message. - 'A series of messages' is composed of the following: - a single start message which optionally contains the first part of the content, and - 1 or more content messages. The content of the aggregated message will be the merged - content of the start message and its following content messages. If this aggregator - encounters a content message where { @link #isLastContentMessage(ByteBufHolder)} - return true for, the aggregator will finish the aggregation and produce the aggregated - message and expect another start message. - - The type that covers both start message and content message - The type of the start message - The type of the content message - The type of the aggregated message - - - - Message to message decoder. - - - - - Decode from one message to an other. This method will be called for each written message that can be handled - by this encoder. - - the {@link ChannelHandlerContext} which this {@link MessageToMessageDecoder} belongs to - the message to decode to an other one - the {@link List} to which decoded messages should be added - - - - Returns {@code true} if the given message should be handled. If {@code false} it will be passed to the next - {@link ChannelHandler} in the {@link ChannelPipeline}. - - - - - Encode from one message to an other. This method will be called for each written message that can be handled - by this encoder. - @param context the {@link ChannelHandlerContext} which this {@link MessageToMessageEncoder} belongs to - @param message the message to encode to an other one - @param output the {@link List} into which the encoded message should be added - needs to do some kind of aggragation - @throws Exception is thrown if an error accour - - - - - A decoder that splits the received {@link ByteBuf}s dynamically by the - value of the Google Protocol Buffers - http://code.google.com/apis/protocolbuffers/docs/encoding.html#varints - Base 128 Varints integer length field in the message. - For example: - - BEFORE DECODE (302 bytes) AFTER DECODE (300 bytes) - +--------+---------------+ +---------------+ - | Length | Protobuf Data |----->| Protobuf Data | - | 0xAC02 | (300 bytes) | | (300 bytes) | - +--------+---------------+ +---------------+ - - - - - An encoder that prepends the the Google Protocol Buffers - http://code.google.com/apis/protocolbuffers/docs/encoding.html#varints - Base 128 Varints integer length field. - For example: - - BEFORE ENCODE (300 bytes) AFTER ENCODE (302 bytes) - +---------------+ +--------+---------------+ - | Protobuf Data |-------------->| Length | Protobuf Data | - | (300 bytes) | | 0xAC02 | (300 bytes) | - +---------------+ +--------+---------------+ - - - - Initializes a new instance of the class with the current system - character set. - - - - - Initializes a new instance of the class with the specified character - set.. - - Encoding. - - - Encodes the requested {@link String} into a {@link ByteBuf}. - A typical setup for a text-based line protocol in a TCP/IP socket would be: -
-             {@link ChannelPipeline} pipeline = ...;
-            
-             // Decoders
-             pipeline.addLast("frameDecoder", new {@link LineBasedFrameDecoder}(80));
-             pipeline.addLast("stringDecoder", new {@link StringDecoder}(CharsetUtil.UTF_8));
-            
-             // Encoder
-             pipeline.addLast("stringEncoder", new {@link StringEncoder}(CharsetUtil.UTF_8));
-             
- and then you can use a {@link String} instead of a {@link ByteBuf} - as a message: -
-             void channelRead({@link ChannelHandlerContext} ctx, {@link String} msg) {
-                 ch.write("Did you say '" + msg + "'?\n");
-             }
-             
-
- - - Initializes a new instance of the class with the current system - character set. - - - - - Initializes a new instance of the class with the specified character - set.. - - Encoding. - - - - A which is thrown when the length of the frame - decoded is greater than the allowed maximum. - - - - - Thrown if an unsupported message is received by an codec. - - -
-
+ + + + DotNetty.Codecs + + + + + http://www.faqs.org/rfcs/rfc3548.html + Table 1: The Base 64 Alphabet + + + + + http://www.faqs.org/rfcs/rfc3548.html + Table 2: The "URL and Filename safe" Base 64 Alphabet + + + + + Cumulates instances of by merging them into one , using memory + copies. + + + + + Cumulate instances of by add them to a and therefore + avoiding memory copy when possible. + + + Be aware that use a more complex indexing implementation so depending on your + use-case + and the decoder implementation this may be slower then just use the . + + + + + Determines whether only one message should be decoded per call. + Default is false as this has performance impacts. + + Is particularly useful in support of protocol upgrade scenarios. + + + + Returns the actual number of readable bytes in the internal cumulative + buffer of this decoder. You usually do not need to rely on this value + to write a decoder. Use it only when you must use it at your own risk. + This method is a shortcut to of . + + + + + An which is thrown by a codec. + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/Adler32.java + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/CRC32.java + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/Deflate.java + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/Deflater.java + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/GZIPException.java + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/GZIPHeader.java + + http://www.ietf.org/rfc/rfc1952.txt + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/InfBlocks.java + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/InfCodes.java + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/Inflate.java + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/Inflater.java + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/InfTree.java + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/JZlib.java + + + + Creates a new zlib encoder with the specified {@code compressionLevel}, + the specified {@code windowBits}, the specified {@code memLevel}, and + the specified wrapper. + + @param compressionLevel + {@code 1} yields the fastest compression and {@code 9} yields the + best compression. {@code 0} means no compression. The default + compression level is {@code 6}. + @param windowBits + The base two logarithm of the size of the history buffer. The + value should be in the range {@code 9} to {@code 15} inclusive. + Larger values result in better compression at the expense of + memory usage. The default value is {@code 15}. + @param memLevel + How much memory should be allocated for the internal compression + state. {@code 1} uses minimum memory and {@code 9} uses maximum + memory. Larger values result in better and faster compression + at the expense of memory usage. The default value is {@code 8} + + @throws CompressionException if failed to initialize zlib + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/StaticTree.java + + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/Tree.java + + + + Close this {@link ZlibEncoder} and so finish the encoding. + + The returned {@link ChannelFuture} will be notified once the + operation completes. + + + The container file formats that wrap the stream compressed by the DEFLATE + algorithm. + + + The ZLIB wrapper as specified in RFC 1950. + + + The GZIP wrapper as specified in RFC 1952. + + + Raw DEFLATE stream only (no header and no footer). + + + Try {@link #ZLIB} first and then {@link #NONE} if the first attempt fails. + Please note that you can specify this wrapper type only when decompressing. + + + + https://github.com/ymnk/jzlib/blob/master/src/main/java/com/jcraft/jzlib/ZStream.java + + + + Those methods are expected to be override by Inflater and Deflater. + In the future, they will become abstract methods. + + + + A which is thrown when the received frame data could not + be decoded by an inbound handler. + + + + + A decoder that splits the received by one or more + delimiters.It is particularly useful for decoding the frames which ends + with a delimiter such as or + +

Specifying more than one delimiter

+ allows you to specify more than one + delimiter. If more than one delimiter is found in the buffer, it chooses + the delimiter which produces the shortest frame. For example, if you have + the following data in the buffer: + +--------------+ + | ABC\nDEF\r\n | + +--------------+ + a will choose '\n' as the first delimiter and produce two + frames: + +-----+-----+ + | ABC | DEF | + +-----+-----+ + rather than incorrectly choosing '\r\n' as the first delimiter: + +----------+ + | ABC\nDEF | + +----------+ +
+
+ + Common constructor + + The maximum length of the decoded frame + NOTE: A see is thrown if the length of the frame exceeds this + value. + + whether the decoded frame should strip out the delimiter or not + + If true, a is + thrown as soon as the decoder notices the length of the + frame will exceedmaxFrameLength regardless of + whether the entire frame has been read. + If false, a is + thrown after the entire frame that exceeds maxFrameLength has been read. + + delimiters + + + Returns true if the delimiters are "\n" and "\r\n" + + + ReturnsReturn true if the current instance is a subclass of DelimiterBasedFrameDecoder + + + Create a frame out of the and return it + + the which this + belongs to + + the from which to read data + + the which represent the frame or null if no frame could be + created. + + + + Returns the number of bytes between the readerIndex of the haystack and + the first needle found in the haystack. -1 is returned if no needle is + found in the haystack. + + + Returns a null (0x00) delimiter, which could be used for Flash XML socket or any similar protocols + + + + Returns {@code CR ('\r')} and {@code LF ('\n')} delimiters, which could + be used for text-based line protocols. + + + + + Splits a byte stream of JSON objects and arrays into individual objects/arrays and passes them up the + . + This class does not do any real parsing or validation. A sequence of bytes is considered a JSON object/array + if it contains a matching number of opening and closing braces/brackets. It's up to a subsequent + + to parse the JSON text into a more usable form i.e.a POCO. + + + + + + Create a new instance. + + + The maximum length of the frame. If the length of the frame is + greater than this value then will be thrown. + + The offset of the length field. + The length of the length field. + + + + Create a new instance. + + + The maximum length of the frame. If the length of the frame is + greater than this value then will be thrown. + + The offset of the length field. + The length of the length field. + The compensation value to add to the value of the length field. + the number of first bytes to strip out from the decoded frame. + + + + Create a new instance. + + + The maximum length of the frame. If the length of the frame is + greater than this value then will be thrown. + + The offset of the length field. + The length of the length field. + The compensation value to add to the value of the length field. + the number of first bytes to strip out from the decoded frame. + + If true, a is thrown as soon as the decoder notices the length + of the frame will exceeed regardless of whether the entire frame has been + read. If false, a is thrown after the entire frame that exceeds + has been read. + Defaults to true in other overloads. + + + + + Create a new instance. + + The of the lenght field. + + The maximum length of the frame. If the length of the frame is + greater than this value then will be thrown. + + The offset of the length field. + The length of the length field. + The compensation value to add to the value of the length field. + the number of first bytes to strip out from the decoded frame. + + If true, a is thrown as soon as the decoder notices the length + of the frame will exceeed regardless of whether the entire frame has been + read. If false, a is thrown after the entire frame that exceeds + has been read. + Defaults to true in other overloads. + + + + + Create a frame out of the and return it. + + + The which this belongs + to. + + The from which to read data. + The which represents the frame or null if no frame could be created. + + + + Decodes the specified region of the buffer into an unadjusted frame length. The default implementation is + capable of decoding the specified region into an unsigned 8/16/24/32/64 bit integer. Override this method to + decode the length field encoded differently. + Note that this method must not modify the state of the specified buffer (e.g. + , + , and the content of the buffer.) + + The buffer we'll be extracting the frame length from. + The offset from the absolute . + The length of the framelenght field. Expected: 1, 2, 3, 4, or 8. + The preferred of buffer. + A long integer that represents the unadjusted length of the next frame. + + + + An encoder that prepends the length of the message. The length value is + prepended as a binary form. +

+ For example, {@link LengthFieldPrepender}(2) will encode the + following 12-bytes string: +

+                    +----------------+
+                    | "HELLO, WORLD" |
+                    +----------------+
+                
+ into the following: +
+                    +--------+----------------+
+                    + 0x000C | "HELLO, WORLD" |
+                    +--------+----------------+
+                
+ If you turned on the {@code lengthIncludesLengthFieldLength} flag in the + constructor, the encoded data would look like the following + (12 (original data) + 2 (prepended data) = 14 (0xE)): +
+                    +--------+----------------+
+                    + 0x000E | "HELLO, WORLD" |
+                    +--------+----------------+
+                
+
+
+ + + Creates a new instance. + + + The length of the prepended length field. + Only 1, 2, 3, 4, and 8 are allowed. + + + + + Creates a new instance. + + + The length of the prepended length field. + Only 1, 2, 3, 4, and 8 are allowed. + + + If true, the length of the prepended length field is added + to the value of the prepended length field. + + + + + Creates a new instance. + + + The length of the prepended length field. + Only 1, 2, 3, 4, and 8 are allowed. + + The compensation value to add to the value of the length field. + + + + Creates a new instance. + + + The length of the prepended length field. + Only 1, 2, 3, 4, and 8 are allowed. + + + If true, the length of the prepended length field is added + to the value of the prepended length field. + + The compensation value to add to the value of the length field. + + + + Creates a new instance. + + The of the length field. + + The length of the prepended length field. + Only 1, 2, 3, 4, and 8 are allowed. + + + If true, the length of the prepended length field is added + to the value of the prepended length field. + + The compensation value to add to the value of the length field. + + + + A decoder that splits the received {@link ByteBuf}s on line endings. + Both {@code "\n"} and {@code "\r\n"} are handled. + For a more general delimiter-based decoder, see {@link DelimiterBasedFrameDecoder}. + + + + Maximum length of a frame we're willing to decode. + + + Whether or not to throw an exception as soon as we exceed maxLength. + + + True if we're discarding input because we're already over maxLength. + + + + Initializes a new instance of the class. + + + the maximum length of the decoded frame. + A {@link TooLongFrameException} is thrown if + the length of the frame exceeds this value. + + + + + Initializes a new instance of the class. + + + the maximum length of the decoded frame. + A {@link TooLongFrameException} is thrown if + the length of the frame exceeds this value. + + + whether the decoded frame should strip out the + delimiter or not + + + If true, a {@link TooLongFrameException} is + thrown as soon as the decoder notices the length of the + frame will exceed maxFrameLength regardless of + whether the entire frame has been read. + If false, a {@link TooLongFrameException} is + thrown after the entire frame that exceeds + maxFrameLength has been read. + + + + + Create a frame out of the {@link ByteBuf} and return it. + + the {@link ChannelHandlerContext} which this {@link ByteToMessageDecoder} belongs to + the {@link ByteBuf} from which to read data + + + + + An abstract that aggregates a series of message objects + into a single aggregated message. + 'A series of messages' is composed of the following: + a single start message which optionally contains the first part of the content, and + 1 or more content messages. The content of the aggregated message will be the merged + content of the start message and its following content messages. If this aggregator + encounters a content message where { @link #isLastContentMessage(ByteBufHolder)} + return true for, the aggregator will finish the aggregation and produce the aggregated + message and expect another start message. + + The type that covers both start message and content message + The type of the start message + The type of the content message + The type of the aggregated message + + + + Message to message decoder. + + + + + Decode from one message to an other. This method will be called for each written message that can be handled + by this encoder. + + the {@link ChannelHandlerContext} which this {@link MessageToMessageDecoder} belongs to + the message to decode to an other one + the {@link List} to which decoded messages should be added + + + + Returns {@code true} if the given message should be handled. If {@code false} it will be passed to the next + {@link ChannelHandler} in the {@link ChannelPipeline}. + + + + + Encode from one message to an other. This method will be called for each written message that can be handled + by this encoder. + @param context the {@link ChannelHandlerContext} which this {@link MessageToMessageEncoder} belongs to + @param message the message to encode to an other one + @param output the {@link List} into which the encoded message should be added + needs to do some kind of aggragation + @throws Exception is thrown if an error accour + + + + + A decoder that splits the received {@link ByteBuf}s dynamically by the + value of the Google Protocol Buffers + http://code.google.com/apis/protocolbuffers/docs/encoding.html#varints + Base 128 Varints integer length field in the message. + For example: + + BEFORE DECODE (302 bytes) AFTER DECODE (300 bytes) + +--------+---------------+ +---------------+ + | Length | Protobuf Data |----->| Protobuf Data | + | 0xAC02 | (300 bytes) | | (300 bytes) | + +--------+---------------+ +---------------+ + + + + + An encoder that prepends the the Google Protocol Buffers + http://code.google.com/apis/protocolbuffers/docs/encoding.html#varints + Base 128 Varints integer length field. + For example: + + BEFORE ENCODE (300 bytes) AFTER ENCODE (302 bytes) + +---------------+ +--------+---------------+ + | Protobuf Data |-------------->| Length | Protobuf Data | + | (300 bytes) | | 0xAC02 | (300 bytes) | + +---------------+ +--------+---------------+ + + + + Initializes a new instance of the class with the current system + character set. + + + + + Initializes a new instance of the class with the specified character + set.. + + Encoding. + + + Encodes the requested {@link String} into a {@link ByteBuf}. + A typical setup for a text-based line protocol in a TCP/IP socket would be: +
+             {@link ChannelPipeline} pipeline = ...;
+            
+             // Decoders
+             pipeline.addLast("frameDecoder", new {@link LineBasedFrameDecoder}(80));
+             pipeline.addLast("stringDecoder", new {@link StringDecoder}(CharsetUtil.UTF_8));
+            
+             // Encoder
+             pipeline.addLast("stringEncoder", new {@link StringEncoder}(CharsetUtil.UTF_8));
+             
+ and then you can use a {@link String} instead of a {@link ByteBuf} + as a message: +
+             void channelRead({@link ChannelHandlerContext} ctx, {@link String} msg) {
+                 ch.write("Did you say '" + msg + "'?\n");
+             }
+             
+
+ + + Initializes a new instance of the class with the current system + character set. + + + + + Initializes a new instance of the class with the specified character + set.. + + Encoding. + + + + A which is thrown when the length of the frame + decoded is greater than the allowed maximum. + + + + + Thrown if an unsupported message is received by an codec. + + +
+
diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.xml.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.xml.meta index bfd9f27..27299e2 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.xml.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Codecs.xml.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: cf54e07b609f28c4c9ed1409ba230ad6 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: cf54e07b609f28c4c9ed1409ba230ad6 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Common.dll.mdb.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Common.dll.mdb.meta index a29dcba..90306fb 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Common.dll.mdb.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Common.dll.mdb.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 206957aa7baaebe49899acc8f0e8c89a -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 206957aa7baaebe49899acc8f0e8c89a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Common.dll.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Common.dll.meta index fc25e08..6e634b7 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Common.dll.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Common.dll.meta @@ -1,33 +1,33 @@ -fileFormatVersion: 2 -guid: 1a268e2cd81ae1240a54deedb4231b26 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 1a268e2cd81ae1240a54deedb4231b26 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Common.pdb.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Common.pdb.meta index a524ee8..e1e1ec5 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Common.pdb.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Common.pdb.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: a21e213b5e1e0684cb3e00a30252902f -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: a21e213b5e1e0684cb3e00a30252902f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Common.xml b/Runtime/csharp-kcp/Plugins/DotNetty.Common.xml index f7be6b7..5e05d56 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Common.xml +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Common.xml @@ -1,2149 +1,2149 @@ - - - - DotNetty.Common - - - - - Abstract base class for implementations - - - - Creates an instance of . - - - Creates an instance of . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Abstract base class for s that need to support scheduling. - - - - - Cancel all scheduled tasks - This method MUST be called only when is true. - - - - - Parent . - - - - - Returns true if the current belongs to this event loop, - false otherwise. - - - It is a convenient way to determine whether code can be executed directly or if it - should be posted for execution to this executor instance explicitly to ensure execution in the loop. - - - - - Returns true if the given belongs to this event loop, - false> otherwise. - - - - - Provides an access to a set of s it manages. - - - - - Returns list of owned event executors. - - - - - Returns true if and only if this executor is being shut down via . - - - - - Terminates this and all its s. - - for completion of termination. - - - - Terminates this and all its s. - - for completion of termination. - - - - A for completion of termination. . - - - - - Returns . - - - - - Executes the given task. - - Threading specifics are determined by IEventExecutor implementation. - - - - Executes the given action. - - - parameter is useful to when repeated execution of an action against - different objects is needed. - Threading specifics are determined by IEventExecutor implementation. - - - - - Executes the given . - - Threading specifics are determined by IEventExecutor implementation. - - - - Executes the given action. - - - and parameters are useful when repeated execution of - an action against different objects in different context is needed. - Threading specifics are determined by IEventExecutor implementation. - - - - - Returns true if this executor has been shut down, false otherwise. - - - - - Returns true if all tasks have completed following shut down. - - - Note that is never true unless was called first. - - - - - Executes the given function and returns indicating completion status and result of - execution. - - - Threading specifics are determined by IEventExecutor implementation. - - - - - Executes the given action and returns indicating completion status and result of execution. - - - Threading specifics are determined by IEventExecutor implementation. - - - - - Executes the given action and returns indicating completion status and result of execution. - - - parameter is useful to when repeated execution of an action against - different objects is needed. - Threading specifics are determined by IEventExecutor implementation. - - - - - Executes the given action and returns indicating completion status and result of execution. - - - parameter is useful to when repeated execution of an action against - different objects is needed. - Threading specifics are determined by IEventExecutor implementation. - - - - - Executes the given action and returns indicating completion status and result of execution. - - - and parameters are useful when repeated execution of - an action against different objects in different context is needed. - Threading specifics are determined by IEventExecutor implementation. - - - - - Executes the given action and returns indicating completion status and result of execution. - - - and parameters are useful when repeated execution of - an action against different objects in different context is needed. - Threading specifics are determined by IEventExecutor implementation. - - - - - Creates and executes a one-shot action that becomes enabled after the given delay. - - the task to execute - the time from now to delay execution - an representing pending completion of the task. - - - - Schedules the given action for execution after the specified delay would pass. - - - Threading specifics are determined by IEventExecutor implementation. - - - - - Schedules the given action for execution after the specified delay would pass. - - - parameter is useful to when repeated execution of an action against - different objects is needed. - Threading specifics are determined by IEventExecutor implementation. - - - - - Schedules the given action for execution after the specified delay would pass. - - - and parameters are useful when repeated execution of - an action against different objects in different context is needed. - Threading specifics are determined by IEventExecutor implementation. - - - - - Schedules the given action for execution at a fixed frequency after the specified delay would pass. - - - - - - - - - Schedules the given action for execution at a fixed frequency after the specified delay would pass. - - - - - - - - - Schedules the given action for execution at a fixed delay after the specified delay would pass. - - - - - - - - - Schedules the given action for execution at a fixed delay after the specified delay would pass. - - - - - - - - - Schedules the given action for execution after the specified delay would pass. - - - parameter is useful to when repeated execution of an action against - different objects is needed. - Threading specifics are determined by IEventExecutor implementation. - - - - - Schedules the given action for execution after the specified delay would pass. - - - parameter is useful to when repeated execution of an action against - different objects is needed. - Threading specifics are determined by IEventExecutor implementation. - - - - - Schedules the given action for execution after the specified delay would pass. - - - Threading specifics are determined by IEventExecutor implementation. - - - - - Schedules the given action for execution after the specified delay would pass. - - - Threading specifics are determined by IEventExecutor implementation. - - - - - Schedules the given action for execution after the specified delay would pass. - - - and parameters are useful when repeated execution of - an action against different objects in different context is needed. - Threading specifics are determined by IEventExecutor implementation. - - - - - Schedules the given action for execution after the specified delay would pass. - - - and parameters are useful when repeated execution of - an action against different objects in different context is needed. - Threading specifics are determined by IEventExecutor implementation. - - - - - Reuse ReusableScheduledTask to optimize GC. - - - - - backed by a single thread. - - - - Creates a new instance of . - - - Creates a new instance of . - - - - Task Scheduler that will post work to this executor's queue. - - - - - Allows to track whether executor is progressing through its backlog. Useful for diagnosing / mitigating stalls due to blocking calls in conjunction with IsBacklogEmpty property. - - - - - Indicates whether executor's backlog is empty. Useful for diagnosing / mitigating stalls due to blocking calls in conjunction with Progress property. - - - - - Gets length of backlog of tasks queued for immediate execution. - - - - - - - - - - - - - - - - - - - - - - - Adds an which will be executed on shutdown of this instance. - - The to run on shutdown. - - - - Removes a previously added from the collection of s which will be - executed on shutdown of this instance. - - The to remove. - - - - - - - Removes all variables bound to the current thread. This operation is useful when you - are in a container environment, and you don't want to leave the thread local variables in the threads you do not - manage. - - - - - Destroys the data structure that keeps all variables accessed from - non-s. This operation is useful when you are in a container environment, and - you do not want to leave the thread local variables in the threads you do not manage. Call this method when - your application is being unloaded from the container. - - - - - Sets the value to uninitialized; a proceeding call to get() will trigger a call to GetInitialValue(). - - - - - - Returns the number of thread local variables bound to the current thread. - - - - - Gets or sets current value for the current thread. - - - - - Returns the current value for the specified thread local map. - The specified thread local map must be for the current thread. - - - - - Set the value for the specified thread local map. The specified thread local map must be for the current thread. - - - - - Returns true if and only if this thread-local variable is set. - - - - - Returns true if and only if this thread-local variable is set. - The specified thread local map must be for the current thread. - - - - - Returns the initial value for this thread-local variable. - - - - - Sets the value to uninitialized for the specified thread local map; - a proceeding call to will trigger a call to . - The specified thread local map must be for the current thread. - - - The from which this should be removed. - - - - - Invoked when this thread local variable is removed by . - - - - - The internal data structure that stores the thread-local variables for DotNetty and all - s. Note that this class is for internal use only and is subject to change at any - time. Use unless you know what you are doing. - - - - - Used by . - - - - - Sets a value at the given index in this . - - The desired index at which a value should be set. - The value to set at the given index. - true if and only if a new thread-local variable has been created. - - - - Resets the . Be aware this will only reset the current internal - position and not shrink the internal char array. - - - - - Create a new ascii string, this method assumes all chars has been sanitized to ascii chars when appending - to the array. - - - - Forked from - JCTools - . - A concurrent access enabling class used by circular array based queues this class exposes an offset computation - method along with differently memory fenced load/store methods into the underlying array. The class is pre-padded and - the array is padded on either side to help with False sharing prvention. It is expected theat subclasses handle post - padding. -

- Offset calculation is separate from access to enable the reuse of a give compute offset. -

- Load/Store methods using a - buffer - parameter are provided to allow the prevention of field reload after a - LoadLoad barrier. -

- - -

- Calculates an element offset based on a given array index. - - The desirable element index. - The offset in bytes within the array for a given index. -
- - - A plain store (no ordering/fences) of an element to a given offset. - - Computed via . - A kitty. - - - - An ordered store(store + StoreStore barrier) of an element to a given offset. - - Computed via . - An orderly kitty. - - - - A plain load (no ordering/fences) of an element from a given offset. - - Computed via . - The element at the offset. - - - - A volatile load (load + LoadLoad barrier) of an element from a given offset. - - Computed via . - The element at the offset. - - - - A skeletal implementation of . This class implements - all methods that have a parameter by default to call - specific logger methods such as or . - - - - - Creates a new instance. - - A friendly name for the new logger instance. - - - - Holds the results of formatting done by . - - - - - Internal-use-only logger used by DotNetty. DO NOT - access this class outside of DotNetty. - - - - - Return the name of this instance. - - name of this logger instance - - - - Is this logger instance enabled for the TRACE level? - - true if this Logger is enabled for level TRACE, false otherwise. - - - - Log a message object at level TRACE. - - the message object to be logged - - - - Log a message at level TRACE according to the specified format and - argument. - - This form avoids superfluous object creation when the logger is disabled - for level TRACE. - - - the format string - the argument - - - - Log a message at level TRACE according to the specified format and - arguments. - - This form avoids superfluous object creation when the logger is disabled - for level TRACE. - - - the format string - the first argument - the second argument - - - - Log a message at level TRACE according to the specified format and - arguments. - - This form avoids superfluous object creation when the logger is disabled - for level TRACE. However, this variant incurs the hidden - (and relatively small) cost of creating an object[] - before invoking the method, - even if this logger is disabled for TRACE. The variants - and - arguments exist solely to avoid this hidden cost. - - - the format string - an array of arguments - - - - Log an exception at level TRACE with an accompanying message. - - the message accompanying the exception - the exception to log - - - - Log an exception at level TRACE. - - the exception to log - - - - Is this logger instance enabled for the DEBUG level? - - true if this Logger is enabled for level DEBUG, false otherwise. - - - - Log a message object at level DEBUG. - - the message object to be logged - - - - Log a message at level DEBUG according to the specified format and - argument. - - This form avoids superfluous object creation when the logger is disabled - for level DEBUG. - - - the format string - the argument - - - - Log a message at level DEBUG according to the specified format and - arguments. - - This form avoids superfluous object creation when the logger is disabled - for level DEBUG. - - - the format string - the first argument - the second argument - - - - Log a message at level DEBUG according to the specified format and - arguments. - - This form avoids superfluous object creation when the logger is disabled - for level DEBUG. However, this variant incurs the hidden - (and relatively small) cost of creating an object[] - before invoking the method, - even if this logger is disabled for DEBUG. The variants - and - arguments exist solely to avoid this hidden cost. - - - the format string - an array of arguments - - - - Log an exception at level DEBUG with an accompanying message. - - the message accompanying the exception - the exception to log - - - - Log an exception at level DEBUG. - - the exception to log - - - - Is this logger instance enabled for the INFO level? - - true if this Logger is enabled for level INFO, false otherwise. - - - - Log a message object at level INFO. - - the message object to be logged - - - - Log a message at level INFO according to the specified format and - argument. - - This form avoids superfluous object creation when the logger is disabled - for level INFO. - - - the format string - the argument - - - - Log a message at level INFO according to the specified format and - arguments. - - This form avoids superfluous object creation when the logger is disabled - for level INFO. - - - the format string - the first argument - the second argument - - - - Log a message at level INFO according to the specified format and - arguments. - - This form avoids superfluous object creation when the logger is disabled - for level INFO. However, this variant incurs the hidden - (and relatively small) cost of creating an object[] - before invoking the method, - even if this logger is disabled for INFO. The variants - and - arguments exist solely to avoid this hidden cost. - - - the format string - an array of arguments - - - - Log an exception at level INFO with an accompanying message. - - the message accompanying the exception - the exception to log - - - - Log an exception at level INFO. - - the exception to log - - - - Is this logger instance enabled for the WARN level? - - true if this Logger is enabled for level WARN, false otherwise. - - - - Log a message object at level WARN. - - the message object to be logged - - - - Log a message at level WARN according to the specified format and - argument. - - This form avoids superfluous object creation when the logger is disabled - for level WARN. - - - the format string - the argument - - - - Log a message at level WARN according to the specified format and - arguments. - - This form avoids superfluous object creation when the logger is disabled - for level WARN. However, this variant incurs the hidden - (and relatively small) cost of creating an object[] - before invoking the method, - even if this logger is disabled for WARN. The variants - and - arguments exist solely to avoid this hidden cost. - - - the format string - an array of arguments - - - - Log a message at level WARN according to the specified format and - arguments. - - This form avoids superfluous object creation when the logger is disabled - for level WARN. - - - the format string - the first argument - the second argument - - - - Log an exception at level WARN with an accompanying message. - - the message accompanying the exception - the exception to log - - - - Log an exception at level WARN. - - the exception to log - - - - Is this logger instance enabled for the ERROR level? - - true if this Logger is enabled for level ERROR, false otherwise. - - - - Log a message object at level ERROR. - - the message object to be logged - - - - Log a message at level ERROR according to the specified format and - argument. - - This form avoids superfluous object creation when the logger is disabled - for level ERROR. - - - the format string - the argument - - - - Log a message at level ERROR according to the specified format and - arguments. - - This form avoids superfluous object creation when the logger is disabled - for level ERROR. - - - the format string - the first argument - the second argument - - - - Log a message at level ERROR according to the specified format and - arguments. - - This form avoids superfluous object creation when the logger is disabled - for level ERROR. However, this variant incurs the hidden - (and relatively small) cost of creating an object[] - before invoking the method, - even if this logger is disabled for ERROR. The variants - and - arguments exist solely to avoid this hidden cost. - - - the format string - an array of arguments - - - - Log an exception at level ERROR with an accompanying message. - - the message accompanying the exception - the exception to log - - - - Log an exception at level ERROR. - - the exception to log - - - - Is the logger instance enabled for the specified ? - - log level - true if this Logger is enabled for the specified , false otherwise. - - - - Log a message object at a specified . - - log level - the message object to be logged - - - - Log a message at a specified according to the specified format and - argument. - - This form avoids superfluous object creation when the logger is disabled - for the specified . - - - log level - the format string - the argument - - - - Log a message at a specified according to the specified format and - arguments. - - This form avoids superfluous object creation when the logger is disabled - for the specified . - - - log level - the format string - the first argument - the second argument - - - - Log a message at the specified according to the specified format - and arguments. - - This form avoids superfluous string concatenation when the logger - is disabled for the specified . However, this variant incurs the hidden - (and relatively small) cost of creating an object[] before invoking the method, - even if this logger is disabled for the specified . The variants - and - arguments exist solely - in order to avoid this hidden cost. - - - log level - the format string - an array of arguments - - - - Log an exception at the specified with an - accompanying message. - - log level - the message accompanying the exception - the exception to log - - - - Log an exception at the specified . - - log level - the exception to log - - - - Creates an or changes the default factory - implementation. This factory allows you to choose what logging framework - DotNetty should use. The default factory is own with registered. - You can change it to your preferred logging framework before other DotNetty classes are loaded: -
-                    InternalLoggerFactory.DefaultFactory = new LoggerFactory();
-                
- Please note that the new default factory is effective only for the classes - which were loaded after the default factory is changed. Therefore, should be set as early - as possible and should not be called more than once. -
-
- - - Creates a new logger instance with the name of the specified type. - - type where logger is used - logger instance - - - - Creates a new logger instance with the name of the specified type. - - type where logger is used - logger instance - - - - Creates a new logger instance with the specified name. - - logger name - logger instance - - - - The log level that can log at. - - - - - 'TRACE' log level. - - - - - 'DEBUG' log level. - - - - - 'INFO' log level. - - - - - 'WARN' log level. - - - - - 'ERROR' log level. - - - - - Formats messages according to very simple substitution rules. Substitutions can be made 1, 2 or more arguments. - For example, - - MessageFormatter.Format("Hi {}.", "there") - - - will return the string "Hi there.". - - - The {} pair is called the formatting anchor. It serves to designate the location where arguments need - to be substituted within the message pattern. - - - In case your message contains the '{' or the '}' character, you do not have to do anything special unless the - '}' character immediately follows '{'. For example, - - - MessageFormatter.Format("Set {1,2,3} is not equal to {}.", "1,2"); - - - will return the string "Set {1,2,3} is not equal to 1,2.". - - - If for whatever reason you need to place the string "{}" in the message without its formatting anchor - meaning, then you need to escape the '{' character with '\', that is the backslash character. Only the '{' - character should be escaped. There is no need to escape the '}' character. For example, - - - MessageFormatter.Format("Set \\{} is not equal to {}.", "1,2"); - - - will return the string "Set {} is not equal to 1,2.". - - - The escaping behavior just described can be overridden by escaping the escape character '\'. Calling - - - MessageFormatter.Format("File name is C:\\\\{}.", "file.zip"); - - - will return the string "File name is C:\file.zip". - - - - - - - - - Performs single argument substitution for the given . - - For example, - - - MessageFormatter.Format("Hi {}.", "there"); - - - will return the string "Hi there.". - - - The message pattern which will be parsed and formatted - The argument to be substituted in place of the formatting anchor - The formatted message - - - - Performs a two argument substitution for the given . - - For example, - - - MessageFormatter.Format("Hi {}. My name is {}.", "Alice", "Bob"); - - - will return the string "Hi Alice. My name is Bob.". - - - The message pattern which will be parsed and formatted - The argument to be substituted in place of the first formatting anchor - The argument to be substituted in place of the second formatting anchor - The formatted message - - - - Same principle as the and - methods, except that any number of arguments can be passed in an array. - - The message pattern which will be parsed and formatted - An array of arguments to be substituted in place of formatting anchors - The formatted message - - - Length of a valid MAC address. - - - Obtains the best MAC address found on local network interfaces. - Generally speaking, an active network interface used on public - networks is better than a local network interface. - byte array containing a MAC. null if no MAC can be found. - - - byte array of a MAC address. - hex formatted MAC address. - - - positive - current is better, 0 - cannot tell from MAC addr, negative - candidate is better. - - - positive - current is better, 0 - cannot tell, negative - candidate is better - - - - Forked from JCTools. - A Multi-Producer-Single-Consumer queue based on a . This implies - that any thread may call the Enqueue methods, but only a single thread may call poll/peek for correctness to - maintained. - - This implementation follows patterns documented on the package level for False Sharing protection. - - - This implementation is using the Fast Flow - method for polling from the queue (with minor change to correctly publish the index) and an extension of - the Leslie Lamport concurrent queue algorithm (originated by Martin Thompson) on the producer side. - - - The type of each item in the queue. - - - - Lock free Enqueue operation, using a single compare-and-swap. As the class name suggests, access is - permitted to many threads concurrently. - - The item to enqueue. - true if the item was added successfully, otherwise false. - - - - - A wait-free alternative to , which fails on compare-and-swap failure. - - The item to enqueue. - 1 if next element cannot be filled, -1 if CAS failed, and 0 if successful. - - - - Lock free poll using ordered loads/stores. As class name suggests, access is limited to a single thread. - - The dequeued item. - true if an item was retrieved, otherwise false. - - - - - Lock free peek using ordered loads. As class name suggests access is limited to a single thread. - - The peeked item. - true if an item was retrieved, otherwise false. - - - - - Returns the number of items in this . - - - - - A plain store (no ordering/fences) of an element to a given offset. - - The element type. - The source buffer. - Computed via - An orderly kitty. - - - - An ordered store(store + StoreStore barrier) of an element to a given offset. - - The element type. - The source buffer. - Computed via - - - - - A plain load (no ordering/fences) of an element from a given offset. - - The element type. - The source buffer. - Computed via - The element at the given in the given . - - - - A volatile load (load + LoadLoad barrier) of an element from a given offset. - - The element type. - The source buffer. - Computed via - The element at the given in the given . - - - - Gets the offset in bytes within the array for a given index. - - The desired element index. - Mask for the index. - The offset (in bytes) within the array for a given index. - - - - Called from a producer thread subject to the restrictions appropriate to the implementation and - according to the interface. - - The element to enqueue. - true if the element was inserted, false iff the queue is full. - - - - Called from the consumer thread subject to the restrictions appropriate to the implementation and - according to the interface. - - A message from the queue if one is available, null iff the queue is empty. - - - - Called from the consumer thread subject to the restrictions appropriate to the implementation and - according to the interface. - - A message from the queue if one is available, null iff the queue is empty. - - - - A collection of utility methods to retrieve and parse the values of the system properties (Environment variables). - - - - - Returns true if and only if the system property with the specified key - exists. - - - - - Returns the value of the system property with the specified - key, while falling back to null if the property access fails. - - the property value or null - - - - Returns the value of the system property with the specified - key, while falling back to the specified default value if - the property access fails. - - - the property value. - def if there's no such property or if an access to the - specified property is not allowed. - - - - - Returns the value of the system property with the specified - key, while falling back to the specified default value if - the property access fails. - - - the property value or def if there's no such property or - if an access to the specified property is not allowed. - - - - - Returns the value of the system property with the specified - key, while falling back to the specified default value if - the property access fails. - - - the property value. - def if there's no such property or if an access to the - specified property is not allowed. - - - - - Returns the value of the system property with the specified - key, while falling back to the specified default value if - the property access fails. - - - the property value. - def if there's no such property or if an access to the - specified property is not allowed. - - - - - Reference counting interface for reusable objects - - - - - Returns the reference count of this object - - - - - Increases the reference count by 1 - - - - - Increases the reference count by - - - - - Records the current access location of this object for debugging purposes. - If this object is determined to be leaked, the information recorded by this operation will be provided to you - via . This method is a shortcut to with null as - an argument. - - - - - - Records the current access location of this object with an additonal arbitrary information for debugging - purposes. If this object is determined to be leaked, the information recorded by this operation will be - provided to you via . - - - - - Decreases the reference count by 1 and deallocates this object if the reference count reaches 0. - - true if and only if the reference count is 0 and this object has been deallocated - - - - Decreases the reference count by and deallocates this object if the reference count - reaches 0. - - true if and only if the reference count is 0 and this object has been deallocated - - - - A hint object that provides human-readable message for easier resource leak tracking. - - - - - Returns a human-readable message that potentially enables easier resource leak tracking. - - - - - - Records the caller's current stack trace so that the can tell where the - leaked - resource was accessed lastly. This method is a shortcut to with null as an - argument. - - - - - Records the caller's current stack trace and the specified additional arbitrary information - so that the can tell where the leaked resource was accessed lastly. - - - - - - Close the leak so that does not warn about leaked resources. - - true if called first time, false if called already - - - - Represents the level of resource leak detection. - - - - - Disables resource leak detection. - - - - - Enables simplistic sampling resource leak detection which reports there is a leak or not, - at the cost of small overhead (default). - - - - - Enables advanced sampling resource leak detection which reports where the leaked object was accessed - recently at the cost of high overhead. - - - - - Enables paranoid resource leak detection which reports where the leaked object was accessed recently, - at the cost of the highest possible overhead (for testing purposes only). - - - - Returns true if resource leak detection is enabled. - - - - Gets or sets resource leak detection level - - - - - Creates a new which is expected to be closed - when the - related resource is deallocated. - - the or null - - - - Schedules the specified to run when the specified dies. - - - - - Cancels the task scheduled via . - - - - - Waits until the thread of this watcher has no threads to watch and terminates itself. - Because a new watcher thread will be started again on , - this operation is only useful when you want to ensure that the watcher thread is terminated - after your application is shut down and there's no chance of calling - afterwards. - - - true if and only if the watcher thread has been terminated. - - - - Allocate a new or return null if not possible. - - - - Base implementation of . - - - Creates a new instance. - - - - Extension methods used for slicing byte arrays - - - - - Merge the byte arrays into one byte array. - - - - - During normal use cases the AsciiString should be immutable, but if the - underlying array is shared, and changes then this needs to be called. - - - - - Implementation of the java.concurrent.util AtomicReference type. - - - - - Sets the initial value of this to . - - - - - Default constructor - - - - - The current value of this - - - - - If equals , then set the Value to - - Returns true if was set, false otherwise. - - - - - Implicit conversion operator = automatically casts the to an instance of - - - - - - Implicit conversion operator = allows us to cast any type directly into a - instance. - - - - - - - Key which can be used to access out of the . Be aware that - it is not be possible to have multiple keys with the same name. - - - the type of the which can be accessed via this . - - - - Returns the singleton instance of the {@link AttributeKey} which has the specified name. - - - Returns true if a exists for the given name. - - - - Creates a new for the given name or fail with an - if a for the given name exists. - - - - - Provides a mechanism to iterate over a collection of bytes. - - - - - Aborts on a NUL (0x00). - - - - - Aborts on a non-NUL (0x00). - - - - - Aborts on a CR ('\r'). - - - - - Aborts on a non-CR ('\r'). - - - - - Aborts on a LF ('\n'). - - - - - Aborts on a non-LF ('\n'). - - - - - Aborts on a CR (';'). - - - - - Aborts on a comma (','). - - - - - Aborts on a ascii space character (' '). - - - - - Aborts on a CR ('\r') or a LF ('\n'). - - - - - Aborts on a byte which is neither a CR ('\r') nor a LF ('\n'). - - - - - Aborts on a linear whitespace (a ' ' or a '\t'). - - - - - Aborts on a byte which is not a linear whitespace (neither ' ' nor '\t'). - - - - - A pool of s. - - - - Shortcut of this.ValueOf(firstNameComponent.Name + "#" + secondNameComponent). - - - - Returns the which is assigned to the specified name. - If there's no such , a new one will be created and returned. - Once created, the subsequent calls with the same name will always return the previously created one - (i.e. singleton.) - - the name of the - - - Returns true if a exists for the given name. - - - - Creates a new for the given name or fail with an - if a for the given name exists. - - - - - Default implementation which use simple synchronization per bucket to keep the memory - overhead - as low as possible. - - - - - Creates a new timer. - - the interval between two consecutive ticks - the size of the wheel - The maximum number of pending timeouts after which call to - newTimeout will result in being thrown. - No maximum pending timeouts limit is assumed if this value is 0 or negative. - if either of tickInterval and ticksPerWheel is <= 0 - - - - Starts the background thread explicitly. The background thread will - start automatically on demand even if you did not call this method. - - if this timer has been - stopped already. - - - - calculate timer firing time from startTime and current tick number, - then wait until that goal has been reached. - - long.MinValue if received a shutdown request, - current time otherwise (with long.MinValue changed by +1) - - - - - Bucket that stores HashedWheelTimeouts. These are stored in a linked-list like datastructure to allow easy - removal of HashedWheelTimeouts in the middle. Also the HashedWheelTimeout act as nodes themself and so no - extra object creation is needed. - - - - - Add a to this bucket. - - - - - Expire all s for the given deadline. - - - - - Clear this bucket and return all not expired / cancelled s. - - - - An attribute which allows to store a value reference. It may be updated atomically and so is thread-safe. - the type of the value it holds. - - - - Returns the key of this attribute. - - - - - Returns the current value, which may be null - - - - - Sets the value - - - - - Atomically sets to the given value and returns the old value which may be null if non was set before. - - - - - Atomically sets to the given value if this 's value is null. - If it was not possible to set the value as it contains a value it will just return the current value. - - - - - Removes this attribute from the and returns the old value. Subsequent - - calls will return null. - If you only want to return the old value and clear the while still keep it in - use with a value of null. - - - - - Atomically sets the value to the given updated value if the current value == the expected value. - If it the set was successful it returns true otherwise false. - - - - - Removes this attribute from the . Subsequent calls will return - null. - If you only want to remove the value and clear the while still keep it in - use with a value of null. - - - - Holds s which can be accessed via . - Implementations must be Thread-safe. - - - - Get the for the given . This method will never return - null, but may return an which does not have a value set yet. - - - - - Returns true if and only if the given exists in this - . - - - - Start is the inclusive start index to begin the subsequence. - End is the exclusive end index to end the subsequence. - - - - A singleton which is safe to compare via the == operator. Created and managed by - . - - - - Returns the unique number assigned to this . - - - Returns the name of this . - - - - - Exception thrown during instances where a reference count is used incorrectly - - - - - A handle associated with a that is returned by a - . - - - - - Returns the that created this handle. - - - - - Returns the which is associated with this handle. - - - - - Returns true if and only if the associated - with this handle has been expired. - - - - - Returns true if and only if the associated - with this handle has been canceled. - - - - - Attempts to cancel the associated with this handle. - If the task has been executed or canceled already, it will return with - no side effect. - - true if the cancellation completed successfully, otherwise false. - - - - Schedules s for one-time future execution in a background - thread. - - - - - Schedules the specified for one-time execution after the specified delay. - - a handle which is associated with the specified task - if this timer has been stopped already - if the pending timeouts are too many and creating new timeout - can cause instability in the system. - - - - Releases all resources acquired by this and cancels all - tasks which were scheduled but not executed yet. - - the handles associated with the tasks which were canceled by - this method - - - - A task which is executed after the delay specified with - . - - - - - Executed after the delay specified with - . - - a handle which is associated with this task - - - - Tries to call if the specified message implements - . If the specified message doesn't implement - , this method does nothing. - - - - - Tries to call if the specified message implements - . If the specified message doesn't implement - , this method does nothing. - - - - - Tries to call if the specified message implements - . - If the specified message doesn't implement , this method does nothing. - - - - - Tries to call if the specified message implements - . If the specified message doesn't implement - , this method does nothing. - - - - - Tries to call if the specified message implements - . If the specified message doesn't implement - , this method does nothing. - - - - - Tries to call if the specified message implements - . If the specified message doesn't implement - , this method does nothing. - - - - - Tries to call if the specified message implements - . If the specified message doesn't implement - , this method does nothing. Unlike , this - method catches an exception raised by and logs it, rather than - rethrowing it to the caller. It is usually recommended to use instead, unless - you absolutely need to swallow an exception. - - - - - Tries to call if the specified message implements - . If the specified message doesn't implement - , this method does nothing. Unlike , this - method catches an exception raised by and logs it, rather - than rethrowing it to the caller. It is usually recommended to use - instead, unless you absolutely need to swallow an exception. - - - - - Schedules the specified object to be released when the caller thread terminates. Note that this operation - is intended to simplify reference counting of ephemeral objects during unit tests. Do not use it beyond the - intended use case. - - - - - Schedules the specified object to be released when the caller thread terminates. Note that this operation - is intended to simplify reference counting of ephemeral objects during unit tests. Do not use it beyond the - intended use case. - - - - - String utility class. - - - - 2 - Quote character at beginning and end. - 5 - Extra allowance for anticipated escape characters that may be added. - - - - Converts the specified byte value into a 2-digit hexadecimal integer. - - - - - Converts the specified byte array into a hexadecimal value. - - - - - Converts the specified byte array into a hexadecimal value. - - - - - Converts the specified byte value into a hexadecimal integer. - - - - - The shortcut to SimpleClassName(o.GetType()). - - - - - The shortcut to SimpleClassName(o.GetType()). - - - - - Generates a simplified name from a . Similar to {@link Class#getSimpleName()}, but it works - fine - with anonymous classes. - - - - - Escapes the specified value, if necessary according to - RFC-4180. - - - The value which will be escaped according to - RFC-4180 - - - The value will first be trimmed of its optional white-space characters, according to - RFC-7230 - - the escaped value if necessary, or the value unchanged - - - - Time utility class. - - - - - Compare two timespan objects - - first timespan object - two timespan object - - - - Gets the system time. - - The system time. - -
-
+ + + + DotNetty.Common + + + + + Abstract base class for implementations + + + + Creates an instance of . + + + Creates an instance of . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Abstract base class for s that need to support scheduling. + + + + + Cancel all scheduled tasks + This method MUST be called only when is true. + + + + + Parent . + + + + + Returns true if the current belongs to this event loop, + false otherwise. + + + It is a convenient way to determine whether code can be executed directly or if it + should be posted for execution to this executor instance explicitly to ensure execution in the loop. + + + + + Returns true if the given belongs to this event loop, + false> otherwise. + + + + + Provides an access to a set of s it manages. + + + + + Returns list of owned event executors. + + + + + Returns true if and only if this executor is being shut down via . + + + + + Terminates this and all its s. + + for completion of termination. + + + + Terminates this and all its s. + + for completion of termination. + + + + A for completion of termination. . + + + + + Returns . + + + + + Executes the given task. + + Threading specifics are determined by IEventExecutor implementation. + + + + Executes the given action. + + + parameter is useful to when repeated execution of an action against + different objects is needed. + Threading specifics are determined by IEventExecutor implementation. + + + + + Executes the given . + + Threading specifics are determined by IEventExecutor implementation. + + + + Executes the given action. + + + and parameters are useful when repeated execution of + an action against different objects in different context is needed. + Threading specifics are determined by IEventExecutor implementation. + + + + + Returns true if this executor has been shut down, false otherwise. + + + + + Returns true if all tasks have completed following shut down. + + + Note that is never true unless was called first. + + + + + Executes the given function and returns indicating completion status and result of + execution. + + + Threading specifics are determined by IEventExecutor implementation. + + + + + Executes the given action and returns indicating completion status and result of execution. + + + Threading specifics are determined by IEventExecutor implementation. + + + + + Executes the given action and returns indicating completion status and result of execution. + + + parameter is useful to when repeated execution of an action against + different objects is needed. + Threading specifics are determined by IEventExecutor implementation. + + + + + Executes the given action and returns indicating completion status and result of execution. + + + parameter is useful to when repeated execution of an action against + different objects is needed. + Threading specifics are determined by IEventExecutor implementation. + + + + + Executes the given action and returns indicating completion status and result of execution. + + + and parameters are useful when repeated execution of + an action against different objects in different context is needed. + Threading specifics are determined by IEventExecutor implementation. + + + + + Executes the given action and returns indicating completion status and result of execution. + + + and parameters are useful when repeated execution of + an action against different objects in different context is needed. + Threading specifics are determined by IEventExecutor implementation. + + + + + Creates and executes a one-shot action that becomes enabled after the given delay. + + the task to execute + the time from now to delay execution + an representing pending completion of the task. + + + + Schedules the given action for execution after the specified delay would pass. + + + Threading specifics are determined by IEventExecutor implementation. + + + + + Schedules the given action for execution after the specified delay would pass. + + + parameter is useful to when repeated execution of an action against + different objects is needed. + Threading specifics are determined by IEventExecutor implementation. + + + + + Schedules the given action for execution after the specified delay would pass. + + + and parameters are useful when repeated execution of + an action against different objects in different context is needed. + Threading specifics are determined by IEventExecutor implementation. + + + + + Schedules the given action for execution at a fixed frequency after the specified delay would pass. + + + + + + + + + Schedules the given action for execution at a fixed frequency after the specified delay would pass. + + + + + + + + + Schedules the given action for execution at a fixed delay after the specified delay would pass. + + + + + + + + + Schedules the given action for execution at a fixed delay after the specified delay would pass. + + + + + + + + + Schedules the given action for execution after the specified delay would pass. + + + parameter is useful to when repeated execution of an action against + different objects is needed. + Threading specifics are determined by IEventExecutor implementation. + + + + + Schedules the given action for execution after the specified delay would pass. + + + parameter is useful to when repeated execution of an action against + different objects is needed. + Threading specifics are determined by IEventExecutor implementation. + + + + + Schedules the given action for execution after the specified delay would pass. + + + Threading specifics are determined by IEventExecutor implementation. + + + + + Schedules the given action for execution after the specified delay would pass. + + + Threading specifics are determined by IEventExecutor implementation. + + + + + Schedules the given action for execution after the specified delay would pass. + + + and parameters are useful when repeated execution of + an action against different objects in different context is needed. + Threading specifics are determined by IEventExecutor implementation. + + + + + Schedules the given action for execution after the specified delay would pass. + + + and parameters are useful when repeated execution of + an action against different objects in different context is needed. + Threading specifics are determined by IEventExecutor implementation. + + + + + Reuse ReusableScheduledTask to optimize GC. + + + + + backed by a single thread. + + + + Creates a new instance of . + + + Creates a new instance of . + + + + Task Scheduler that will post work to this executor's queue. + + + + + Allows to track whether executor is progressing through its backlog. Useful for diagnosing / mitigating stalls due to blocking calls in conjunction with IsBacklogEmpty property. + + + + + Indicates whether executor's backlog is empty. Useful for diagnosing / mitigating stalls due to blocking calls in conjunction with Progress property. + + + + + Gets length of backlog of tasks queued for immediate execution. + + + + + + + + + + + + + + + + + + + + + + + Adds an which will be executed on shutdown of this instance. + + The to run on shutdown. + + + + Removes a previously added from the collection of s which will be + executed on shutdown of this instance. + + The to remove. + + + + + + + Removes all variables bound to the current thread. This operation is useful when you + are in a container environment, and you don't want to leave the thread local variables in the threads you do not + manage. + + + + + Destroys the data structure that keeps all variables accessed from + non-s. This operation is useful when you are in a container environment, and + you do not want to leave the thread local variables in the threads you do not manage. Call this method when + your application is being unloaded from the container. + + + + + Sets the value to uninitialized; a proceeding call to get() will trigger a call to GetInitialValue(). + + + + + + Returns the number of thread local variables bound to the current thread. + + + + + Gets or sets current value for the current thread. + + + + + Returns the current value for the specified thread local map. + The specified thread local map must be for the current thread. + + + + + Set the value for the specified thread local map. The specified thread local map must be for the current thread. + + + + + Returns true if and only if this thread-local variable is set. + + + + + Returns true if and only if this thread-local variable is set. + The specified thread local map must be for the current thread. + + + + + Returns the initial value for this thread-local variable. + + + + + Sets the value to uninitialized for the specified thread local map; + a proceeding call to will trigger a call to . + The specified thread local map must be for the current thread. + + + The from which this should be removed. + + + + + Invoked when this thread local variable is removed by . + + + + + The internal data structure that stores the thread-local variables for DotNetty and all + s. Note that this class is for internal use only and is subject to change at any + time. Use unless you know what you are doing. + + + + + Used by . + + + + + Sets a value at the given index in this . + + The desired index at which a value should be set. + The value to set at the given index. + true if and only if a new thread-local variable has been created. + + + + Resets the . Be aware this will only reset the current internal + position and not shrink the internal char array. + + + + + Create a new ascii string, this method assumes all chars has been sanitized to ascii chars when appending + to the array. + + + + Forked from + JCTools + . + A concurrent access enabling class used by circular array based queues this class exposes an offset computation + method along with differently memory fenced load/store methods into the underlying array. The class is pre-padded and + the array is padded on either side to help with False sharing prvention. It is expected theat subclasses handle post + padding. +

+ Offset calculation is separate from access to enable the reuse of a give compute offset. +

+ Load/Store methods using a + buffer + parameter are provided to allow the prevention of field reload after a + LoadLoad barrier. +

+ + +

+ Calculates an element offset based on a given array index. + + The desirable element index. + The offset in bytes within the array for a given index. +
+ + + A plain store (no ordering/fences) of an element to a given offset. + + Computed via . + A kitty. + + + + An ordered store(store + StoreStore barrier) of an element to a given offset. + + Computed via . + An orderly kitty. + + + + A plain load (no ordering/fences) of an element from a given offset. + + Computed via . + The element at the offset. + + + + A volatile load (load + LoadLoad barrier) of an element from a given offset. + + Computed via . + The element at the offset. + + + + A skeletal implementation of . This class implements + all methods that have a parameter by default to call + specific logger methods such as or . + + + + + Creates a new instance. + + A friendly name for the new logger instance. + + + + Holds the results of formatting done by . + + + + + Internal-use-only logger used by DotNetty. DO NOT + access this class outside of DotNetty. + + + + + Return the name of this instance. + + name of this logger instance + + + + Is this logger instance enabled for the TRACE level? + + true if this Logger is enabled for level TRACE, false otherwise. + + + + Log a message object at level TRACE. + + the message object to be logged + + + + Log a message at level TRACE according to the specified format and + argument. + + This form avoids superfluous object creation when the logger is disabled + for level TRACE. + + + the format string + the argument + + + + Log a message at level TRACE according to the specified format and + arguments. + + This form avoids superfluous object creation when the logger is disabled + for level TRACE. + + + the format string + the first argument + the second argument + + + + Log a message at level TRACE according to the specified format and + arguments. + + This form avoids superfluous object creation when the logger is disabled + for level TRACE. However, this variant incurs the hidden + (and relatively small) cost of creating an object[] + before invoking the method, + even if this logger is disabled for TRACE. The variants + and + arguments exist solely to avoid this hidden cost. + + + the format string + an array of arguments + + + + Log an exception at level TRACE with an accompanying message. + + the message accompanying the exception + the exception to log + + + + Log an exception at level TRACE. + + the exception to log + + + + Is this logger instance enabled for the DEBUG level? + + true if this Logger is enabled for level DEBUG, false otherwise. + + + + Log a message object at level DEBUG. + + the message object to be logged + + + + Log a message at level DEBUG according to the specified format and + argument. + + This form avoids superfluous object creation when the logger is disabled + for level DEBUG. + + + the format string + the argument + + + + Log a message at level DEBUG according to the specified format and + arguments. + + This form avoids superfluous object creation when the logger is disabled + for level DEBUG. + + + the format string + the first argument + the second argument + + + + Log a message at level DEBUG according to the specified format and + arguments. + + This form avoids superfluous object creation when the logger is disabled + for level DEBUG. However, this variant incurs the hidden + (and relatively small) cost of creating an object[] + before invoking the method, + even if this logger is disabled for DEBUG. The variants + and + arguments exist solely to avoid this hidden cost. + + + the format string + an array of arguments + + + + Log an exception at level DEBUG with an accompanying message. + + the message accompanying the exception + the exception to log + + + + Log an exception at level DEBUG. + + the exception to log + + + + Is this logger instance enabled for the INFO level? + + true if this Logger is enabled for level INFO, false otherwise. + + + + Log a message object at level INFO. + + the message object to be logged + + + + Log a message at level INFO according to the specified format and + argument. + + This form avoids superfluous object creation when the logger is disabled + for level INFO. + + + the format string + the argument + + + + Log a message at level INFO according to the specified format and + arguments. + + This form avoids superfluous object creation when the logger is disabled + for level INFO. + + + the format string + the first argument + the second argument + + + + Log a message at level INFO according to the specified format and + arguments. + + This form avoids superfluous object creation when the logger is disabled + for level INFO. However, this variant incurs the hidden + (and relatively small) cost of creating an object[] + before invoking the method, + even if this logger is disabled for INFO. The variants + and + arguments exist solely to avoid this hidden cost. + + + the format string + an array of arguments + + + + Log an exception at level INFO with an accompanying message. + + the message accompanying the exception + the exception to log + + + + Log an exception at level INFO. + + the exception to log + + + + Is this logger instance enabled for the WARN level? + + true if this Logger is enabled for level WARN, false otherwise. + + + + Log a message object at level WARN. + + the message object to be logged + + + + Log a message at level WARN according to the specified format and + argument. + + This form avoids superfluous object creation when the logger is disabled + for level WARN. + + + the format string + the argument + + + + Log a message at level WARN according to the specified format and + arguments. + + This form avoids superfluous object creation when the logger is disabled + for level WARN. However, this variant incurs the hidden + (and relatively small) cost of creating an object[] + before invoking the method, + even if this logger is disabled for WARN. The variants + and + arguments exist solely to avoid this hidden cost. + + + the format string + an array of arguments + + + + Log a message at level WARN according to the specified format and + arguments. + + This form avoids superfluous object creation when the logger is disabled + for level WARN. + + + the format string + the first argument + the second argument + + + + Log an exception at level WARN with an accompanying message. + + the message accompanying the exception + the exception to log + + + + Log an exception at level WARN. + + the exception to log + + + + Is this logger instance enabled for the ERROR level? + + true if this Logger is enabled for level ERROR, false otherwise. + + + + Log a message object at level ERROR. + + the message object to be logged + + + + Log a message at level ERROR according to the specified format and + argument. + + This form avoids superfluous object creation when the logger is disabled + for level ERROR. + + + the format string + the argument + + + + Log a message at level ERROR according to the specified format and + arguments. + + This form avoids superfluous object creation when the logger is disabled + for level ERROR. + + + the format string + the first argument + the second argument + + + + Log a message at level ERROR according to the specified format and + arguments. + + This form avoids superfluous object creation when the logger is disabled + for level ERROR. However, this variant incurs the hidden + (and relatively small) cost of creating an object[] + before invoking the method, + even if this logger is disabled for ERROR. The variants + and + arguments exist solely to avoid this hidden cost. + + + the format string + an array of arguments + + + + Log an exception at level ERROR with an accompanying message. + + the message accompanying the exception + the exception to log + + + + Log an exception at level ERROR. + + the exception to log + + + + Is the logger instance enabled for the specified ? + + log level + true if this Logger is enabled for the specified , false otherwise. + + + + Log a message object at a specified . + + log level + the message object to be logged + + + + Log a message at a specified according to the specified format and + argument. + + This form avoids superfluous object creation when the logger is disabled + for the specified . + + + log level + the format string + the argument + + + + Log a message at a specified according to the specified format and + arguments. + + This form avoids superfluous object creation when the logger is disabled + for the specified . + + + log level + the format string + the first argument + the second argument + + + + Log a message at the specified according to the specified format + and arguments. + + This form avoids superfluous string concatenation when the logger + is disabled for the specified . However, this variant incurs the hidden + (and relatively small) cost of creating an object[] before invoking the method, + even if this logger is disabled for the specified . The variants + and + arguments exist solely + in order to avoid this hidden cost. + + + log level + the format string + an array of arguments + + + + Log an exception at the specified with an + accompanying message. + + log level + the message accompanying the exception + the exception to log + + + + Log an exception at the specified . + + log level + the exception to log + + + + Creates an or changes the default factory + implementation. This factory allows you to choose what logging framework + DotNetty should use. The default factory is own with registered. + You can change it to your preferred logging framework before other DotNetty classes are loaded: +
+                    InternalLoggerFactory.DefaultFactory = new LoggerFactory();
+                
+ Please note that the new default factory is effective only for the classes + which were loaded after the default factory is changed. Therefore, should be set as early + as possible and should not be called more than once. +
+
+ + + Creates a new logger instance with the name of the specified type. + + type where logger is used + logger instance + + + + Creates a new logger instance with the name of the specified type. + + type where logger is used + logger instance + + + + Creates a new logger instance with the specified name. + + logger name + logger instance + + + + The log level that can log at. + + + + + 'TRACE' log level. + + + + + 'DEBUG' log level. + + + + + 'INFO' log level. + + + + + 'WARN' log level. + + + + + 'ERROR' log level. + + + + + Formats messages according to very simple substitution rules. Substitutions can be made 1, 2 or more arguments. + For example, + + MessageFormatter.Format("Hi {}.", "there") + + + will return the string "Hi there.". + + + The {} pair is called the formatting anchor. It serves to designate the location where arguments need + to be substituted within the message pattern. + + + In case your message contains the '{' or the '}' character, you do not have to do anything special unless the + '}' character immediately follows '{'. For example, + + + MessageFormatter.Format("Set {1,2,3} is not equal to {}.", "1,2"); + + + will return the string "Set {1,2,3} is not equal to 1,2.". + + + If for whatever reason you need to place the string "{}" in the message without its formatting anchor + meaning, then you need to escape the '{' character with '\', that is the backslash character. Only the '{' + character should be escaped. There is no need to escape the '}' character. For example, + + + MessageFormatter.Format("Set \\{} is not equal to {}.", "1,2"); + + + will return the string "Set {} is not equal to 1,2.". + + + The escaping behavior just described can be overridden by escaping the escape character '\'. Calling + + + MessageFormatter.Format("File name is C:\\\\{}.", "file.zip"); + + + will return the string "File name is C:\file.zip". + + + + + + + + + Performs single argument substitution for the given . + + For example, + + + MessageFormatter.Format("Hi {}.", "there"); + + + will return the string "Hi there.". + + + The message pattern which will be parsed and formatted + The argument to be substituted in place of the formatting anchor + The formatted message + + + + Performs a two argument substitution for the given . + + For example, + + + MessageFormatter.Format("Hi {}. My name is {}.", "Alice", "Bob"); + + + will return the string "Hi Alice. My name is Bob.". + + + The message pattern which will be parsed and formatted + The argument to be substituted in place of the first formatting anchor + The argument to be substituted in place of the second formatting anchor + The formatted message + + + + Same principle as the and + methods, except that any number of arguments can be passed in an array. + + The message pattern which will be parsed and formatted + An array of arguments to be substituted in place of formatting anchors + The formatted message + + + Length of a valid MAC address. + + + Obtains the best MAC address found on local network interfaces. + Generally speaking, an active network interface used on public + networks is better than a local network interface. + byte array containing a MAC. null if no MAC can be found. + + + byte array of a MAC address. + hex formatted MAC address. + + + positive - current is better, 0 - cannot tell from MAC addr, negative - candidate is better. + + + positive - current is better, 0 - cannot tell, negative - candidate is better + + + + Forked from JCTools. + A Multi-Producer-Single-Consumer queue based on a . This implies + that any thread may call the Enqueue methods, but only a single thread may call poll/peek for correctness to + maintained. + + This implementation follows patterns documented on the package level for False Sharing protection. + + + This implementation is using the Fast Flow + method for polling from the queue (with minor change to correctly publish the index) and an extension of + the Leslie Lamport concurrent queue algorithm (originated by Martin Thompson) on the producer side. + + + The type of each item in the queue. + + + + Lock free Enqueue operation, using a single compare-and-swap. As the class name suggests, access is + permitted to many threads concurrently. + + The item to enqueue. + true if the item was added successfully, otherwise false. + + + + + A wait-free alternative to , which fails on compare-and-swap failure. + + The item to enqueue. + 1 if next element cannot be filled, -1 if CAS failed, and 0 if successful. + + + + Lock free poll using ordered loads/stores. As class name suggests, access is limited to a single thread. + + The dequeued item. + true if an item was retrieved, otherwise false. + + + + + Lock free peek using ordered loads. As class name suggests access is limited to a single thread. + + The peeked item. + true if an item was retrieved, otherwise false. + + + + + Returns the number of items in this . + + + + + A plain store (no ordering/fences) of an element to a given offset. + + The element type. + The source buffer. + Computed via + An orderly kitty. + + + + An ordered store(store + StoreStore barrier) of an element to a given offset. + + The element type. + The source buffer. + Computed via + + + + + A plain load (no ordering/fences) of an element from a given offset. + + The element type. + The source buffer. + Computed via + The element at the given in the given . + + + + A volatile load (load + LoadLoad barrier) of an element from a given offset. + + The element type. + The source buffer. + Computed via + The element at the given in the given . + + + + Gets the offset in bytes within the array for a given index. + + The desired element index. + Mask for the index. + The offset (in bytes) within the array for a given index. + + + + Called from a producer thread subject to the restrictions appropriate to the implementation and + according to the interface. + + The element to enqueue. + true if the element was inserted, false iff the queue is full. + + + + Called from the consumer thread subject to the restrictions appropriate to the implementation and + according to the interface. + + A message from the queue if one is available, null iff the queue is empty. + + + + Called from the consumer thread subject to the restrictions appropriate to the implementation and + according to the interface. + + A message from the queue if one is available, null iff the queue is empty. + + + + A collection of utility methods to retrieve and parse the values of the system properties (Environment variables). + + + + + Returns true if and only if the system property with the specified key + exists. + + + + + Returns the value of the system property with the specified + key, while falling back to null if the property access fails. + + the property value or null + + + + Returns the value of the system property with the specified + key, while falling back to the specified default value if + the property access fails. + + + the property value. + def if there's no such property or if an access to the + specified property is not allowed. + + + + + Returns the value of the system property with the specified + key, while falling back to the specified default value if + the property access fails. + + + the property value or def if there's no such property or + if an access to the specified property is not allowed. + + + + + Returns the value of the system property with the specified + key, while falling back to the specified default value if + the property access fails. + + + the property value. + def if there's no such property or if an access to the + specified property is not allowed. + + + + + Returns the value of the system property with the specified + key, while falling back to the specified default value if + the property access fails. + + + the property value. + def if there's no such property or if an access to the + specified property is not allowed. + + + + + Reference counting interface for reusable objects + + + + + Returns the reference count of this object + + + + + Increases the reference count by 1 + + + + + Increases the reference count by + + + + + Records the current access location of this object for debugging purposes. + If this object is determined to be leaked, the information recorded by this operation will be provided to you + via . This method is a shortcut to with null as + an argument. + + + + + + Records the current access location of this object with an additonal arbitrary information for debugging + purposes. If this object is determined to be leaked, the information recorded by this operation will be + provided to you via . + + + + + Decreases the reference count by 1 and deallocates this object if the reference count reaches 0. + + true if and only if the reference count is 0 and this object has been deallocated + + + + Decreases the reference count by and deallocates this object if the reference count + reaches 0. + + true if and only if the reference count is 0 and this object has been deallocated + + + + A hint object that provides human-readable message for easier resource leak tracking. + + + + + Returns a human-readable message that potentially enables easier resource leak tracking. + + + + + + Records the caller's current stack trace so that the can tell where the + leaked + resource was accessed lastly. This method is a shortcut to with null as an + argument. + + + + + Records the caller's current stack trace and the specified additional arbitrary information + so that the can tell where the leaked resource was accessed lastly. + + + + + + Close the leak so that does not warn about leaked resources. + + true if called first time, false if called already + + + + Represents the level of resource leak detection. + + + + + Disables resource leak detection. + + + + + Enables simplistic sampling resource leak detection which reports there is a leak or not, + at the cost of small overhead (default). + + + + + Enables advanced sampling resource leak detection which reports where the leaked object was accessed + recently at the cost of high overhead. + + + + + Enables paranoid resource leak detection which reports where the leaked object was accessed recently, + at the cost of the highest possible overhead (for testing purposes only). + + + + Returns true if resource leak detection is enabled. + + + + Gets or sets resource leak detection level + + + + + Creates a new which is expected to be closed + when the + related resource is deallocated. + + the or null + + + + Schedules the specified to run when the specified dies. + + + + + Cancels the task scheduled via . + + + + + Waits until the thread of this watcher has no threads to watch and terminates itself. + Because a new watcher thread will be started again on , + this operation is only useful when you want to ensure that the watcher thread is terminated + after your application is shut down and there's no chance of calling + afterwards. + + + true if and only if the watcher thread has been terminated. + + + + Allocate a new or return null if not possible. + + + + Base implementation of . + + + Creates a new instance. + + + + Extension methods used for slicing byte arrays + + + + + Merge the byte arrays into one byte array. + + + + + During normal use cases the AsciiString should be immutable, but if the + underlying array is shared, and changes then this needs to be called. + + + + + Implementation of the java.concurrent.util AtomicReference type. + + + + + Sets the initial value of this to . + + + + + Default constructor + + + + + The current value of this + + + + + If equals , then set the Value to + + Returns true if was set, false otherwise. + + + + + Implicit conversion operator = automatically casts the to an instance of + + + + + + Implicit conversion operator = allows us to cast any type directly into a + instance. + + + + + + + Key which can be used to access out of the . Be aware that + it is not be possible to have multiple keys with the same name. + + + the type of the which can be accessed via this . + + + + Returns the singleton instance of the {@link AttributeKey} which has the specified name. + + + Returns true if a exists for the given name. + + + + Creates a new for the given name or fail with an + if a for the given name exists. + + + + + Provides a mechanism to iterate over a collection of bytes. + + + + + Aborts on a NUL (0x00). + + + + + Aborts on a non-NUL (0x00). + + + + + Aborts on a CR ('\r'). + + + + + Aborts on a non-CR ('\r'). + + + + + Aborts on a LF ('\n'). + + + + + Aborts on a non-LF ('\n'). + + + + + Aborts on a CR (';'). + + + + + Aborts on a comma (','). + + + + + Aborts on a ascii space character (' '). + + + + + Aborts on a CR ('\r') or a LF ('\n'). + + + + + Aborts on a byte which is neither a CR ('\r') nor a LF ('\n'). + + + + + Aborts on a linear whitespace (a ' ' or a '\t'). + + + + + Aborts on a byte which is not a linear whitespace (neither ' ' nor '\t'). + + + + + A pool of s. + + + + Shortcut of this.ValueOf(firstNameComponent.Name + "#" + secondNameComponent). + + + + Returns the which is assigned to the specified name. + If there's no such , a new one will be created and returned. + Once created, the subsequent calls with the same name will always return the previously created one + (i.e. singleton.) + + the name of the + + + Returns true if a exists for the given name. + + + + Creates a new for the given name or fail with an + if a for the given name exists. + + + + + Default implementation which use simple synchronization per bucket to keep the memory + overhead + as low as possible. + + + + + Creates a new timer. + + the interval between two consecutive ticks + the size of the wheel + The maximum number of pending timeouts after which call to + newTimeout will result in being thrown. + No maximum pending timeouts limit is assumed if this value is 0 or negative. + if either of tickInterval and ticksPerWheel is <= 0 + + + + Starts the background thread explicitly. The background thread will + start automatically on demand even if you did not call this method. + + if this timer has been + stopped already. + + + + calculate timer firing time from startTime and current tick number, + then wait until that goal has been reached. + + long.MinValue if received a shutdown request, + current time otherwise (with long.MinValue changed by +1) + + + + + Bucket that stores HashedWheelTimeouts. These are stored in a linked-list like datastructure to allow easy + removal of HashedWheelTimeouts in the middle. Also the HashedWheelTimeout act as nodes themself and so no + extra object creation is needed. + + + + + Add a to this bucket. + + + + + Expire all s for the given deadline. + + + + + Clear this bucket and return all not expired / cancelled s. + + + + An attribute which allows to store a value reference. It may be updated atomically and so is thread-safe. + the type of the value it holds. + + + + Returns the key of this attribute. + + + + + Returns the current value, which may be null + + + + + Sets the value + + + + + Atomically sets to the given value and returns the old value which may be null if non was set before. + + + + + Atomically sets to the given value if this 's value is null. + If it was not possible to set the value as it contains a value it will just return the current value. + + + + + Removes this attribute from the and returns the old value. Subsequent + + calls will return null. + If you only want to return the old value and clear the while still keep it in + use with a value of null. + + + + + Atomically sets the value to the given updated value if the current value == the expected value. + If it the set was successful it returns true otherwise false. + + + + + Removes this attribute from the . Subsequent calls will return + null. + If you only want to remove the value and clear the while still keep it in + use with a value of null. + + + + Holds s which can be accessed via . + Implementations must be Thread-safe. + + + + Get the for the given . This method will never return + null, but may return an which does not have a value set yet. + + + + + Returns true if and only if the given exists in this + . + + + + Start is the inclusive start index to begin the subsequence. + End is the exclusive end index to end the subsequence. + + + + A singleton which is safe to compare via the == operator. Created and managed by + . + + + + Returns the unique number assigned to this . + + + Returns the name of this . + + + + + Exception thrown during instances where a reference count is used incorrectly + + + + + A handle associated with a that is returned by a + . + + + + + Returns the that created this handle. + + + + + Returns the which is associated with this handle. + + + + + Returns true if and only if the associated + with this handle has been expired. + + + + + Returns true if and only if the associated + with this handle has been canceled. + + + + + Attempts to cancel the associated with this handle. + If the task has been executed or canceled already, it will return with + no side effect. + + true if the cancellation completed successfully, otherwise false. + + + + Schedules s for one-time future execution in a background + thread. + + + + + Schedules the specified for one-time execution after the specified delay. + + a handle which is associated with the specified task + if this timer has been stopped already + if the pending timeouts are too many and creating new timeout + can cause instability in the system. + + + + Releases all resources acquired by this and cancels all + tasks which were scheduled but not executed yet. + + the handles associated with the tasks which were canceled by + this method + + + + A task which is executed after the delay specified with + . + + + + + Executed after the delay specified with + . + + a handle which is associated with this task + + + + Tries to call if the specified message implements + . If the specified message doesn't implement + , this method does nothing. + + + + + Tries to call if the specified message implements + . If the specified message doesn't implement + , this method does nothing. + + + + + Tries to call if the specified message implements + . + If the specified message doesn't implement , this method does nothing. + + + + + Tries to call if the specified message implements + . If the specified message doesn't implement + , this method does nothing. + + + + + Tries to call if the specified message implements + . If the specified message doesn't implement + , this method does nothing. + + + + + Tries to call if the specified message implements + . If the specified message doesn't implement + , this method does nothing. + + + + + Tries to call if the specified message implements + . If the specified message doesn't implement + , this method does nothing. Unlike , this + method catches an exception raised by and logs it, rather than + rethrowing it to the caller. It is usually recommended to use instead, unless + you absolutely need to swallow an exception. + + + + + Tries to call if the specified message implements + . If the specified message doesn't implement + , this method does nothing. Unlike , this + method catches an exception raised by and logs it, rather + than rethrowing it to the caller. It is usually recommended to use + instead, unless you absolutely need to swallow an exception. + + + + + Schedules the specified object to be released when the caller thread terminates. Note that this operation + is intended to simplify reference counting of ephemeral objects during unit tests. Do not use it beyond the + intended use case. + + + + + Schedules the specified object to be released when the caller thread terminates. Note that this operation + is intended to simplify reference counting of ephemeral objects during unit tests. Do not use it beyond the + intended use case. + + + + + String utility class. + + + + 2 - Quote character at beginning and end. + 5 - Extra allowance for anticipated escape characters that may be added. + + + + Converts the specified byte value into a 2-digit hexadecimal integer. + + + + + Converts the specified byte array into a hexadecimal value. + + + + + Converts the specified byte array into a hexadecimal value. + + + + + Converts the specified byte value into a hexadecimal integer. + + + + + The shortcut to SimpleClassName(o.GetType()). + + + + + The shortcut to SimpleClassName(o.GetType()). + + + + + Generates a simplified name from a . Similar to {@link Class#getSimpleName()}, but it works + fine + with anonymous classes. + + + + + Escapes the specified value, if necessary according to + RFC-4180. + + + The value which will be escaped according to + RFC-4180 + + + The value will first be trimmed of its optional white-space characters, according to + RFC-7230 + + the escaped value if necessary, or the value unchanged + + + + Time utility class. + + + + + Compare two timespan objects + + first timespan object + two timespan object + + + + Gets the system time. + + The system time. + +
+
diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Common.xml.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Common.xml.meta index dc4e997..5fb569f 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Common.xml.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Common.xml.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: c546fed3667084e4aaa511b1588f700f -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: c546fed3667084e4aaa511b1588f700f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.dll.mdb.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.dll.mdb.meta index 2b06c55..7df5ba0 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.dll.mdb.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.dll.mdb.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 39f9688dda8becc44b61267395d5e74b -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 39f9688dda8becc44b61267395d5e74b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.dll.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.dll.meta index 1113d4c..9b75c40 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.dll.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.dll.meta @@ -1,33 +1,33 @@ -fileFormatVersion: 2 -guid: a0061affda6d09a429fd2674e5c26df4 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: a0061affda6d09a429fd2674e5c26df4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.pdb.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.pdb.meta index c3de5e6..49a4aee 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.pdb.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.pdb.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: e52783c20d361e14287f5ac05e933943 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: e52783c20d361e14287f5ac05e933943 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.xml b/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.xml index 3172afe..77634a5 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.xml +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.xml @@ -1,591 +1,591 @@ - - - - DotNetty.Handlers - - - - The {@link FlowControlHandler} ensures that only one message per {@code read()} is sent downstream. - - Classes such as {@link ByteToMessageDecoder} or {@link MessageToByteEncoder} are free to emit as - many events as they like for any given input. A channel's auto reading configuration doesn't usually - apply in these scenarios. This is causing problems in downstream {@link ChannelHandler}s that would - like to hold subsequent events while they're processing one event. It's a common problem with the - {@code HttpObjectDecoder} that will very often fire a {@code HttpRequest} that is immediately followed - by a {@code LastHttpContent} event. - -
{@code
-             ChannelPipeline pipeline = ...;
-            
-             pipeline.addLast(new HttpServerCodec());
-             pipeline.addLast(new FlowControlHandler());
-            
-             pipeline.addLast(new MyExampleHandler());
-            
-             class MyExampleHandler extends ChannelInboundHandlerAdapter {
-               @Override
-               public void channelRead(IChannelHandlerContext ctx, Object msg) {
-                 if (msg instanceof HttpRequest) {
-                   ctx.channel().config().setAutoRead(false);
-            
-                   // The FlowControlHandler will hold any subsequent events that
-                   // were emitted by HttpObjectDecoder until auto reading is turned
-                   // back on or Channel#read() is being called.
-                 }
-               }
-             }
-             }
- - @see ChannelConfig#setAutoRead(bool) -
- - Determine if the underlying {@link Queue} is empty. This method exists for - testing, debugging and inspection purposes and it is not Thread safe! - - - Releases all messages and destroys the {@link Queue}. - - - Dequeues one or many (or none) messages depending on the channel's auto - reading state and returns the number of messages that were consumed from - the internal queue. - - The {@code minConsume} argument is used to force {@code dequeue()} into - consuming that number of messages regardless of the channel's auto - reading configuration. - - @see #read(ChannelHandlerContext) - @see #channelRead(ChannelHandlerContext, Object) - - - - A that logs all events using a logging framework. - By default, all events are logged at DEBUG level. - - - - - Creates a new instance whose logger name is the fully qualified class - name of the instance with hex dump enabled. - - - - - Creates a new instance whose logger name is the fully qualified class - name of the instance - - the log level - - - - Creates a new instance with the specified logger name and with hex dump - enabled - - the class type to generate the logger for - - - - Creates a new instance with the specified logger name. - - the class type to generate the logger for - the log level - - - - Creates a new instance with the specified logger name using the default log level. - - the name of the class to use for the logger - - - - Creates a new instance with the specified logger name. - - the name of the class to use for the logger - the log level - - - - Returns the that this handler uses to log - - - - - Formats an event and returns the formatted message - - the name of the event - - - - Formats an event and returns the formatted message. - - the name of the event - the argument of the event - - - - Formats an event and returns the formatted message. This method is currently only used for formatting - - - the name of the event - the first argument of the event - the second argument of the event - - - - Generates the default log message of the specified event whose argument is a . - - - - - Generates the default log message of the specified event whose argument is a . - - - - - Generates the default log message of the specified event whose argument is an arbitrary object. - - - - - An that represents the idle state of a . - - - - - No data was received for a while. - - - - - No data was sent for a while. - - - - - No data was either received or sent for a while. - - - - - A user event triggered by when a is idle. - - - - - Constructor for sub-classes. - - the which triggered the event. - true if its the first idle event for the . - - - - Returns the idle state. - - The state. - - - - Returns true if this was the first event for the - - true if first; otherwise, false. - - - - Triggers an when a has not performed - read, write, or both operation for a while. - - - -

Supported idle states

- - - - - - - - - - - - - - - - -
PropertyMeaning
readerIdleTimean whose state is - will be triggered when no read was performed for the specified period of - time. Specify 0 to disable. -
writerIdleTimean whose state is - will be triggered when no write was performed for the specified period of - time. Specify 0 to disable.
allIdleTimean whose state is - will be triggered when neither read nor write was performed for the - specified period of time. Specify 0 to disable.
-
- - - - - - An example that sends a ping message when there is no outbound traffic - for 30 seconds. The connection is closed when there is no inbound traffic - for 60 seconds. - - - var bootstrap = new (); - - bootstrap.ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel => - { - IChannelPipeline pipeline = channel.Pipeline; - - pipeline.AddLast("idleStateHandler", new (60, 30, 0); - pipeline.AddLast("myHandler", new MyHandler()); - } - - - Handler should handle the triggered by . - - - public class MyHandler : ChannelDuplexHandler - { - public override void UserEventTriggered( context, evt) - { - if(evt is ) - { - e = () evt; - if (e.State == .ReaderIdle) - { - ctx.close(); - } - else if(e.State == .WriterIdle) - { - ctx.writeAndFlush(new PingMessage()); - } - } - } - } - - - - - - -
-
- - - Initializes a new instance firing s. - - - an whose state is - will be triggered when no read was performed for the specified - period of time. Specify 0 to disable. - - - an whose state is - will be triggered when no write was performed for the specified - period of time. Specify 0 to disable. - - - an whose state is - will be triggered when neither read nor write was performed for - the specified period of time. Specify 0 to disable. - - - - - - - - - - Initializes a new instance firing s. - - - whether or not the consumption of bytes should be taken into - consideration when assessing write idleness. The default is false. - - - an whose state is - will be triggered when no read was performed for the specified - period of time. Specify to disable. - - - an whose state is - will be triggered when no write was performed for the specified - period of time. Specify to disable. - - - an whose state is - will be triggered when neither read nor write was performed for - the specified period of time. Specify to disable. - - - - - Return the readerIdleTime that was given when instance this class in milliseconds. - - The reader idle time in millis. - - - - Return the writerIdleTime that was given when instance this class in milliseconds. - - The writer idle time in millis. - - - - Return the allIdleTime that was given when instance this class in milliseconds. - - The all idle time in millis. - - - - This method is visible for testing! - - - - - - This method is visible for testing! - - - - - - - - - - - Is called when an should be fired. This implementation calls - . - - Context. - Evt. - - - - Returns a . - - - - - - - - - - - - - - Returns true if and only if the - was constructed - with observeOutput enabled and there has been an observed change in the - between two consecutive calls of this method. - https://github.com/netty/netty/issues/6150 - - - - - - - - Raises a when no data was read within a certain - period of time. - -
-             The connection is closed when there is no inbound traffic
-             for 30 seconds.
-            
-             
-             
-             var bootstrap = new ();
-            
-             bootstrap.ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel =>
-             {
-                 IChannelPipeline pipeline = channel.Pipeline;
-                 
-                 pipeline.AddLast("readTimeoutHandler", new (30);
-                 pipeline.AddLast("myHandler", new MyHandler());
-             } 
-             
-                        
-             
-             public class MyHandler : ChannelDuplexHandler 
-             {
-                 public override void ExceptionCaught( context,  exception)
-                 {
-                     if(exception is ) 
-                     {
-                         // do somethind
-                     }
-                     else
-                     {
-                         base.ExceptionCaught(context, cause);
-                     }
-                  }
-             }
-             
-             
-             
- - - -
-
- - - Initializes a new instance of the class. - - Timeout in seconds. - - - - Initializes a new instance of the class. - - Timeout. - - - - Is called when a read timeout was detected. - - Context. - - - - Raises a when a write operation cannot finish in a certain period of time. - - - - - The connection is closed when a write operation cannot finish in 30 seconds. - - - var bootstrap = new (); - - bootstrap.ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel => - { - IChannelPipeline pipeline = channel.Pipeline; - - pipeline.AddLast("writeTimeoutHandler", new (30); - pipeline.AddLast("myHandler", new MyHandler()); - } - - - - public class MyHandler : ChannelDuplexHandler - { - public override void ExceptionCaught( context, exception) - { - if(exception is ) - { - // do somethind - } - else - { - base.ExceptionCaught(context, cause); - } - } - } - - - - - - - - - - - A doubly-linked list to track all WriteTimeoutTasks. - - - - - Initializes a new instance of the class. - - Timeout in seconds. - - - - Initializes a new instance of the class. - - Timeout. - - - - Is called when a write timeout was detected - - Context. - - - - Special exception which will get thrown if a packet is - received that not looks like a TLS/SSL record. A user can check for - this and so detect if one peer tries to - use secure and the other plain connection. - - - - Unwraps inbound SSL records. - - - - Creates a new event that indicates a successful handshake. - - - - - Creates a new event that indicates an unsuccessful handshake. - Use {@link #SUCCESS} to indicate a successful handshake. - - - - - Return {@code true} if the handshake was successful - - - - - Return the {@link Throwable} if {@link #isSuccess()} returns {@code false} - and so the handshake failed. - - - - Utilities for TLS packets. - - - change cipher spec - - - alert - - - handshake - - - application data - - - the length of the ssl record header (in bytes) - - - - Return how much bytes can be read out of the encrypted data. Be aware that this method will not increase - the readerIndex of the given . - - - The to read from. Be aware that it must have at least - bytes to read, - otherwise it will throw an . - - Offset to record start. - - The length of the encrypted packet that is included in the buffer. This will - return -1 if the given is not encrypted at all. - - -
-
+ + + + DotNetty.Handlers + + + + The {@link FlowControlHandler} ensures that only one message per {@code read()} is sent downstream. + + Classes such as {@link ByteToMessageDecoder} or {@link MessageToByteEncoder} are free to emit as + many events as they like for any given input. A channel's auto reading configuration doesn't usually + apply in these scenarios. This is causing problems in downstream {@link ChannelHandler}s that would + like to hold subsequent events while they're processing one event. It's a common problem with the + {@code HttpObjectDecoder} that will very often fire a {@code HttpRequest} that is immediately followed + by a {@code LastHttpContent} event. + +
{@code
+             ChannelPipeline pipeline = ...;
+            
+             pipeline.addLast(new HttpServerCodec());
+             pipeline.addLast(new FlowControlHandler());
+            
+             pipeline.addLast(new MyExampleHandler());
+            
+             class MyExampleHandler extends ChannelInboundHandlerAdapter {
+               @Override
+               public void channelRead(IChannelHandlerContext ctx, Object msg) {
+                 if (msg instanceof HttpRequest) {
+                   ctx.channel().config().setAutoRead(false);
+            
+                   // The FlowControlHandler will hold any subsequent events that
+                   // were emitted by HttpObjectDecoder until auto reading is turned
+                   // back on or Channel#read() is being called.
+                 }
+               }
+             }
+             }
+ + @see ChannelConfig#setAutoRead(bool) +
+ + Determine if the underlying {@link Queue} is empty. This method exists for + testing, debugging and inspection purposes and it is not Thread safe! + + + Releases all messages and destroys the {@link Queue}. + + + Dequeues one or many (or none) messages depending on the channel's auto + reading state and returns the number of messages that were consumed from + the internal queue. + + The {@code minConsume} argument is used to force {@code dequeue()} into + consuming that number of messages regardless of the channel's auto + reading configuration. + + @see #read(ChannelHandlerContext) + @see #channelRead(ChannelHandlerContext, Object) + + + + A that logs all events using a logging framework. + By default, all events are logged at DEBUG level. + + + + + Creates a new instance whose logger name is the fully qualified class + name of the instance with hex dump enabled. + + + + + Creates a new instance whose logger name is the fully qualified class + name of the instance + + the log level + + + + Creates a new instance with the specified logger name and with hex dump + enabled + + the class type to generate the logger for + + + + Creates a new instance with the specified logger name. + + the class type to generate the logger for + the log level + + + + Creates a new instance with the specified logger name using the default log level. + + the name of the class to use for the logger + + + + Creates a new instance with the specified logger name. + + the name of the class to use for the logger + the log level + + + + Returns the that this handler uses to log + + + + + Formats an event and returns the formatted message + + the name of the event + + + + Formats an event and returns the formatted message. + + the name of the event + the argument of the event + + + + Formats an event and returns the formatted message. This method is currently only used for formatting + + + the name of the event + the first argument of the event + the second argument of the event + + + + Generates the default log message of the specified event whose argument is a . + + + + + Generates the default log message of the specified event whose argument is a . + + + + + Generates the default log message of the specified event whose argument is an arbitrary object. + + + + + An that represents the idle state of a . + + + + + No data was received for a while. + + + + + No data was sent for a while. + + + + + No data was either received or sent for a while. + + + + + A user event triggered by when a is idle. + + + + + Constructor for sub-classes. + + the which triggered the event. + true if its the first idle event for the . + + + + Returns the idle state. + + The state. + + + + Returns true if this was the first event for the + + true if first; otherwise, false. + + + + Triggers an when a has not performed + read, write, or both operation for a while. + + + +

Supported idle states

+ + + + + + + + + + + + + + + + +
PropertyMeaning
readerIdleTimean whose state is + will be triggered when no read was performed for the specified period of + time. Specify 0 to disable. +
writerIdleTimean whose state is + will be triggered when no write was performed for the specified period of + time. Specify 0 to disable.
allIdleTimean whose state is + will be triggered when neither read nor write was performed for the + specified period of time. Specify 0 to disable.
+
+ + + + + + An example that sends a ping message when there is no outbound traffic + for 30 seconds. The connection is closed when there is no inbound traffic + for 60 seconds. + + + var bootstrap = new (); + + bootstrap.ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel => + { + IChannelPipeline pipeline = channel.Pipeline; + + pipeline.AddLast("idleStateHandler", new (60, 30, 0); + pipeline.AddLast("myHandler", new MyHandler()); + } + + + Handler should handle the triggered by . + + + public class MyHandler : ChannelDuplexHandler + { + public override void UserEventTriggered( context, evt) + { + if(evt is ) + { + e = () evt; + if (e.State == .ReaderIdle) + { + ctx.close(); + } + else if(e.State == .WriterIdle) + { + ctx.writeAndFlush(new PingMessage()); + } + } + } + } + + + + + + +
+
+ + + Initializes a new instance firing s. + + + an whose state is + will be triggered when no read was performed for the specified + period of time. Specify 0 to disable. + + + an whose state is + will be triggered when no write was performed for the specified + period of time. Specify 0 to disable. + + + an whose state is + will be triggered when neither read nor write was performed for + the specified period of time. Specify 0 to disable. + + + + + + + + + + Initializes a new instance firing s. + + + whether or not the consumption of bytes should be taken into + consideration when assessing write idleness. The default is false. + + + an whose state is + will be triggered when no read was performed for the specified + period of time. Specify to disable. + + + an whose state is + will be triggered when no write was performed for the specified + period of time. Specify to disable. + + + an whose state is + will be triggered when neither read nor write was performed for + the specified period of time. Specify to disable. + + + + + Return the readerIdleTime that was given when instance this class in milliseconds. + + The reader idle time in millis. + + + + Return the writerIdleTime that was given when instance this class in milliseconds. + + The writer idle time in millis. + + + + Return the allIdleTime that was given when instance this class in milliseconds. + + The all idle time in millis. + + + + This method is visible for testing! + + + + + + This method is visible for testing! + + + + + + + + + + + Is called when an should be fired. This implementation calls + . + + Context. + Evt. + + + + Returns a . + + + + + + + + + + + + + + Returns true if and only if the + was constructed + with observeOutput enabled and there has been an observed change in the + between two consecutive calls of this method. + https://github.com/netty/netty/issues/6150 + + + + + + + + Raises a when no data was read within a certain + period of time. + +
+             The connection is closed when there is no inbound traffic
+             for 30 seconds.
+            
+             
+             
+             var bootstrap = new ();
+            
+             bootstrap.ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel =>
+             {
+                 IChannelPipeline pipeline = channel.Pipeline;
+                 
+                 pipeline.AddLast("readTimeoutHandler", new (30);
+                 pipeline.AddLast("myHandler", new MyHandler());
+             } 
+             
+                        
+             
+             public class MyHandler : ChannelDuplexHandler 
+             {
+                 public override void ExceptionCaught( context,  exception)
+                 {
+                     if(exception is ) 
+                     {
+                         // do somethind
+                     }
+                     else
+                     {
+                         base.ExceptionCaught(context, cause);
+                     }
+                  }
+             }
+             
+             
+             
+ + + +
+
+ + + Initializes a new instance of the class. + + Timeout in seconds. + + + + Initializes a new instance of the class. + + Timeout. + + + + Is called when a read timeout was detected. + + Context. + + + + Raises a when a write operation cannot finish in a certain period of time. + + + + + The connection is closed when a write operation cannot finish in 30 seconds. + + + var bootstrap = new (); + + bootstrap.ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel => + { + IChannelPipeline pipeline = channel.Pipeline; + + pipeline.AddLast("writeTimeoutHandler", new (30); + pipeline.AddLast("myHandler", new MyHandler()); + } + + + + public class MyHandler : ChannelDuplexHandler + { + public override void ExceptionCaught( context, exception) + { + if(exception is ) + { + // do somethind + } + else + { + base.ExceptionCaught(context, cause); + } + } + } + + + + + + + + + + + A doubly-linked list to track all WriteTimeoutTasks. + + + + + Initializes a new instance of the class. + + Timeout in seconds. + + + + Initializes a new instance of the class. + + Timeout. + + + + Is called when a write timeout was detected + + Context. + + + + Special exception which will get thrown if a packet is + received that not looks like a TLS/SSL record. A user can check for + this and so detect if one peer tries to + use secure and the other plain connection. + + + + Unwraps inbound SSL records. + + + + Creates a new event that indicates a successful handshake. + + + + + Creates a new event that indicates an unsuccessful handshake. + Use {@link #SUCCESS} to indicate a successful handshake. + + + + + Return {@code true} if the handshake was successful + + + + + Return the {@link Throwable} if {@link #isSuccess()} returns {@code false} + and so the handshake failed. + + + + Utilities for TLS packets. + + + change cipher spec + + + alert + + + handshake + + + application data + + + the length of the ssl record header (in bytes) + + + + Return how much bytes can be read out of the encrypted data. Be aware that this method will not increase + the readerIndex of the given . + + + The to read from. Be aware that it must have at least + bytes to read, + otherwise it will throw an . + + Offset to record start. + + The length of the encrypted packet that is included in the buffer. This will + return -1 if the given is not encrypted at all. + + +
+
diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.xml.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.xml.meta index 9e0bfdd..72350d6 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.xml.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Handlers.xml.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 89c10de1e938af64ca52675754efe833 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 89c10de1e938af64ca52675754efe833 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Transport.dll b/Runtime/csharp-kcp/Plugins/DotNetty.Transport.dll index 29692d76f2e1097e307739c812ae02edaa1c5708..21fd3c94675e3b9c5f1e1b3f9be8f6d37c3ee616 100644 GIT binary patch literal 174592 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%0D7TC>?N@I2?k8_q^HVK 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 M{r{i;=P2;M08+zM)&Kwi literal 159744 zcmce<34mNxmH+?xz1Od*tGkn~bf+pC=_ZioQB|Elf(QXa2#bP%hzbeHz9uXWtAb04 zDjM7oaKjB12NYD?*HLHOmvJ1o(NSj<+I@H2#%)Fo|Ihc__iE`R2+Hr@kh=T1=bn4+ zIp?nLi@2r1{KBMX~2DqJit9ygqZ*LQQsRO?zzwQy~F0G-Cuah^YT6EdBTtC39s34(bIMi ze#<2wOPaM6Z|~of=bgKz-l$(dq~QjR*3j+!88>;}rZx48E>FlPTs?61l;z6Z@@-af z@87dUSN?>X?+toK4h?vpyJo-}ve@oVp7zgngM0P;-fyh*yh3XbO#OHguOGBV74VZ1 zz1adm`RV_t1-<1j%TEV}mGADgba?*-SNcr>u6W}I4R}kyZou=3ep3}BP&g_?wOo|^ zf{H4o3YmqGT&s1RpX5kMemy`kWd&m?E|e+yyT+UJV_1l0hU);msxd{IcBc7!Z!!6( z#qzbhmV^Ib}srLtCS`DSs!^*OFtLU)OZ(Jz%P)DR7d3|5# zPK7q4X<>4gg6mu`c|&jDjlF?4^^{89LSWj@fFyUjV5hz}D{m+CR)wfQe3k4=7pV8t zy+p>iQL;*rB|q3TP&wZZ)+}<-LGtgEO!l)xI%NDH-#e0iq~nWzGEBjO-z*T0)-Uv% zgu`0SxfMTNK=QC3!z|HAuGaKpYL8}e`O(~XSRKrb=EuXya~rU7q5fD{BVLU!#pXbm zE>XCC9x3J16i4#?#N+GD69z)COtO(k;nI_LNX5d26 zIrNUig<{1vj2`+4(S`OS2fT3gOnJI}Jf2-qb&*vw=hrOVqkKcYch!=N7~OoU%U|jS9A$(Vaz%yqqmZMqBBxyB zF@2GnT;$fiNSdqSPw$JQxr%%Sk@rU`Nn7Q6Wq;w2NJ)X9y_QZiOeNz7J$lp2!4u)l z+sa$4frY5_B?g@Dx;rdIWzyn;91n(-p+)^~2CC+oE-xS2vGb3mO zEB+M~M{=n?nq`qeg8Zs>Lv*o)o=Sc3vHbXqoN;u+BWN@IirhMi*g}**gaYC!IgVf@ zYCo!fY}GWj9!{3kvr6$3FeqqjE=L9;UZmrTetZOlYfJoOgKA3t0)lhJf*-{@2+!sG z_!!*jiqkoHZ$Zf`K%D__H~b!{QhyD@q&?!d!S!zt zpXv}?jyy+Sd4=8hFYgBl+7G)VYM<1PA>%Y^9Bv$_6f(kOg}JrE?Q7xx1kNkerp#Zz zlX0I*&=>_5zK?KV;W-cYpci_?9TJfLk9NFzXJiIaG;UF1NBOmS{?N&?FQ_Iys zrxrB>fUtU6SKeD#c6D`V@i<2d={6+I9>$`8JYKYj+E`v$gN48FmD_{w(hj~0h3}%y zpaV*LnnR@*7aMmSTu$%ef++K_6tH(CuL3{07$z(@DKVULQX=n1$r-{d*B;5sEv8m;oAF?N≈yT!2Bn@oDr1Hs`ehXX3_ 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 diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Transport.dll.mdb.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Transport.dll.mdb.meta index be095f3..b885d8b 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Transport.dll.mdb.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Transport.dll.mdb.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: ecf53dc58e4338e4bb4a383e7499c042 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: ecf53dc58e4338e4bb4a383e7499c042 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Transport.dll.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Transport.dll.meta index 374256e..a00fec2 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Transport.dll.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Transport.dll.meta @@ -1,33 +1,33 @@ -fileFormatVersion: 2 -guid: 2cba5dfccbc5e7c45bf31c4e226fc3aa -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 2cba5dfccbc5e7c45bf31c4e226fc3aa +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Transport.pdb b/Runtime/csharp-kcp/Plugins/DotNetty.Transport.pdb index 544c837c2fa425f52c671f147e720dc32503b778..fb847bbeb0249d717f50354f4ffa12874b37faa0 100644 GIT binary patch literal 105132 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 AVE_OC literal 796160 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 z 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 - - - DotNetty.Transport - - - -

- This is a helper class that makes it easy to bootstrap an . It supports method- - chaining to provide an easy way to configure the . - - When not used in a context, the methods - are useful for connectionless transports such as datagram (UDP). - - - - - Specifies the which will handle events for the being built. - - The which is used to handle all the events for the to-be-created . - The instance. - - - - Specifies the of which will be created. - - The which is used to create instances from. - The instance. - - - - Assigns the which is used to bind the local "end" to. - - The instance to bind the local "end" to. - The instance. - - - - Assigns the local which is used to bind the local "end" to. - This overload binds to a for any IP address on the local machine, given a specific port. - - The port to bind the local "end" to. - The instance. - - - - Assigns the local which is used to bind the local "end" to. - This overload binds to a for a given hostname and port. - - The hostname to bind the local "end" to. - The port to bind the local "end" to. - The instance. - - - - Assigns the local which is used to bind the local "end" to. - This overload binds to a for a given and port. - - The to bind the local "end" to. - The port to bind the local "end" to. - The instance. - - - - Allows the specification of a which is used for the - instances once they get created. Use a value of null to remove - a previously set . - - The to configure. - The value to set the given option. - - - - Allows specification of an initial attribute of the newly created . If the value is - null, the attribute of the specified key is removed. - - - - - Validates all the parameters. Sub-classes may override this, but should call the super method in that case. - - - - - Returns a deep clone of this bootstrap which has the identical configuration. This method is useful when making - multiple s with similar settings. Please note that this method does not clone the - deeply but shallowly, making the group a shared resource. - - - - - Creates a new and registers it with an . - - - - - Creates a new and binds it to the endpoint specified via the methods. - - The bound . - - - - Creates a new and binds it. - This overload binds to a for any IP address on the local machine, given a specific port. - - The port to bind the local "end" to. - The bound . - - - - Creates a new and binds it. - This overload binds to a for a given hostname and port. - - The hostname to bind the local "end" to. - The port to bind the local "end" to. - The bound . - - - - Creates a new and binds it. - This overload binds to a for a given and port. - - The to bind the local "end" to. - The port to bind the local "end" to. - The bound . - - - - Creates a new and binds it. - - The instance to bind the local "end" to. - The bound . - - - - Specifies the to use for serving the requests. - - The to use for serving requests. - The instance. - - - - Returns the configured or null if none is configured yet. - - - - - A that makes it easy to bootstrap an to use for clients. - - The methods are useful - in combination with connectionless transports such as datagram (UDP). For regular TCP connections, - please use the provided methods. - - - - - Sets the which will resolve the address of the unresolved named address. - - The which will resolve the address of the unresolved named address. - The instance. - - - - Assigns the remote to connect to once the method is called. - - The remote to connect to. - The instance. - - - - Assigns the remote to connect to once the method is called. - - The hostname of the endpoint to connect to. - The port at the remote host to connect to. - The instance. - - - - Assigns the remote to connect to once the method is called. - - The of the endpoint to connect to. - The port at the remote host to connect to. - The instance. - - - - Connects an to the remote peer. - - The . - - - - Connects an to the remote peer. - - The hostname of the endpoint to connect to. - The port at the remote host to connect to. - The . - - - - Connects an to the remote peer. - - The of the endpoint to connect to. - The port at the remote host to connect to. - The . - - - - Connects an to the remote peer. - - The remote to connect to. - The . - - - - Connects an to the remote peer. - - The remote to connect to. - The local to connect to. - The . - - - - Performs DNS resolution for the remote endpoint and connects to it. - - The remote to connect to. - The local to connect the remote to. - The . - - - - Returns a deep clone of this bootstrap which has the identical configuration except that it uses - the given . This method is useful when making multiple s with similar - settings. - - - - - A sub-class which allows easy bootstrapping of . - - - - - Specifies the which is used for the parent (acceptor) and the child (client). - - - - - Sets the for the parent (acceptor) and the child (client). These - 's are used to handle all the events and IO for - and 's. - - - - - Allows specification of a which is used for the - instances once they get created (after the acceptor accepted the ). Use a - value of null to remove a previously set . - - - - - Sets the specific with the given value on every child . - If the value is null, the is removed. - - - - - Sets the which is used to serve the request for the 's. - - - - - Returns the configured which will be used for the child channels or null - if none is configured yet. - - - - Cache for the string representation of this channel - - - - Creates a new instance. - - The parent of this channel. Pass null if there's no parent. - - - - Creates a new instance. - - The parent of this channel. Pass null if there's no parent. - An for the new channel. - - - - Resets the stored . - - - - - Returns a new instance. Subclasses may override this method to assign custom - s to s that use the constructor. - - A new instance. - - - Returns a new pipeline instance. - - - - Create a new instance which will be used for the life-time of the - - - - - - Returns the ID of this channel. - - - - - Returns true if and only if the specified object is identical - with this channel (i.e. this == o). - - - - - Returns the string representation of this channel. The returned string contains a hex dump of the - , the , and the of this - channel for easier identification. - - - - - implementation which sub-classes must extend and use. - - - - true if the channel has never been registered, false otherwise /// - - - - This method must NEVER be called directly, but be executed as an - extra task with a clean call stack instead. The reason for this - is that this method calls - directly, which might lead to an unfortunate nesting of independent inbound/outbound - events. See the comments input for more details. - - - - - Prepares to close the . If this method returns an , the - caller must call the method with a task that calls - on the returned . If this method returns null, - must be called from the caller thread. (i.e. ) - - - - - Checks whether a given is compatible with the . - - The to check compatibility. - - true if the given is compatible with this - instance, otherwise false. - - - - - Is called after the is registered with its as part of the - register process. Sub-classes may override this method. - - - - - Binds the to the . - - The to bind. - - - - Disconnects this from its remote peer. - - - - - Closes the . - - - - - Deregisters the from its . Sub-classes may override this - method. - - - - - ScheduleAsync a read operation. - - - - - Flush the content of the given buffer to the remote peer. - - - - - Invoked when a new message is added to a of this - , so that the implementation converts the message to - another. (e.g. heap buffer -> direct buffer). - - The message to be filtered. - The filtered message. - - - Neither nor was called. - - - was called. - - - was called. - - - - Makes best possible effort to detect if was - called - yet. If not return false and if called or could not detect return true. - If this method returns true we will not invoke the but just forward the - event. - This is needed as may already put the in the - linked-list - but not called - - - - - A skeletal server-side implementation. A server-side does not - allow the following operations: , - , , - . - - - - - Creates a new instance. - - - - - The that automatically increases and - decreases the predicted buffer size on feed back. -

- It gradually increases the expected number of readable bytes if the previous - read fully filled the allocated buffer. It gradually decreases the expected - number of readable bytes if the read operation was not able to fill a certain - amount of the allocated buffer two times consecutively. Otherwise, it keeps - returning the same prediction. -

-
- - - Creates a new predictor with the default parameters. With the default - parameters, the expected buffer size starts from 1024, does not - go down below 64, and does not go up above 65536. - - - - Creates a new predictor with the specified parameters. - the inclusive lower bound of the expected buffer size - the initial buffer size when no feed back was received - the inclusive upper bound of the expected buffer size - - - - that works as a wrapper for another providing affinity on call. - - - - - - - - Creates a new instance of . - - serving as an actual provider of s. - - - - If running in a context of an existing , this is returned. - Otherwise, is retrieved from underlying . - - - - - - - - A queue of write operations which are pending for later execution. It also updates the - writability of the associated , so that - the pending write operations are also considered to determine the writability. - - - - Returns true if there are no pending write operations left in this queue. - - - Returns the number of pending write operations. - - - Add the given msg and returns for completion of processing msg. - - - - Remove all pending write operation and fail them with the given . The messages will be - released - via . - - - - - Remove a pending write operation and fail it with the given . The message will be released - via - . - - - - - Remove all pending write operation and performs them via - . - - - if something was written and null if the - is empty. - - - - - Removes a pending write operation and performs it via - . - - - if something was written and null if the - is empty. - - - - - Removes a pending write operation and release it's message via . - - of the pending write or null if the queue is empty. - - - - Return the current message or null if empty. - - - - Holds all meta-data and construct the linked-list structure. - - - - It is a good starting point if your implementation needs to intercept operations and also - state updates. - - - - - A special which offers an easy way to initialize a once it was - registered to its . - - Implementations are most often used in the context of - and to setup the of a . - - Be aware that this class is marked as Sharable (via ) and so the implementation must be safe to be re-used. - - - - public class MyChannelInitializer extends { - public void InitChannel( channel) { - channel.Pipeline().AddLast("myHandler", new MyHandler()); - } - } - bootstrap = ...; - ... - bootstrap.childHandler(new MyChannelInitializer()); - ... - - - A sub-type of . - - - - This method will be called once the was registered. After the method returns this instance - will be removed from the of the . - - The which was registered. - - - Represents the properties of a implementation. - - - Create a new instance - - true if and only if the channel has the DisconnectAsync() operation - that allows a user to disconnect and then call - again, such as UDP/IP. - - - - Create a new instance - - true if and only if the channel has the DisconnectAsync operation - that allows a user to disconnect and then call - again, such as UDP/IP. - - - If a is in use, then this value will be - set for . Must be > 0. - - - - - Returns true if and only if the channel has the DisconnectAsync() operation - that allows a user to disconnect and then call again, - such as UDP/IP. - - - - - If a is in use, then this is the default value for - . - - - - - Returns the of the specified name. - - The type of option being retrieved. - The name of the desired option. - The matching instance. - - - - Returns the of the given pair: (, secondary name) - - The type of option being retrieved. - - A whose name will be used as the first part of the desired option's name. - - - A string representing the second part of the desired option's name. - - The matching instance. - - - - Checks whether a given exists. - - The name of the . - true if a exists for the given , otherwise false. - - - - Creates a new for the given . - - The type of option to create. - The name to associate with the new option. - Thrown if a for the given exists. - The new instance. - - - - Adds the given message to this . The given - will be notified once the message was written. - - The message to add to the buffer. - The size of the message. - The to notify once the message is written. - - - - Add a flush to this . This means all previous added messages are marked - as flushed and so you will be able to handle them. - - - - - Increments the number of pending bytes which will be written at some point. - This method is thread-safe! - - The number of bytes to increment the count by. - - - - Decrements the number of pending bytes which will be written at some point. - This method is thread-safe! - - The number of bytes to decrement the count by. - - - - Returns the current message to write, or null if nothing was flushed before and so is ready to be - written. - - - - - Notify the of the current message about writing progress. - - - - - Removes the current message, marks its as complete, and returns - true. If no flushed message exists at the time this method is called, it returns false to - signal that no more messages are ready to be handled. - - true if a message existed and was removed, otherwise false. - - - - Removes the current message, marks its as complete using the given - , and returns true. If no flushed message exists at the time this method is - called, it returns false to signal that no more messages are ready to be handled. - - The causing the message to be removed. - true if a message existed and was removed, otherwise false. - - - - Removes the fully written entries and updates the reader index of the partially written entry. - This operation assumes all messages in this buffer are instances. - - The number of bytes that have been written so far. - - - - Clears all ByteBuffer from the array so these can be GC'ed. - See https://github.com/netty/netty/issues/3837 - - - - - Returns a list of direct ArraySegment<byte>, if the currently pending messages are made of - instances only. will return the total number of - readable bytes of these buffers. - - Note that the returned array is reused and thus should not escape - . Refer to - for an example. - - - A list of ArraySegment<byte> buffers. - - - - Returns a list of direct ArraySegment<byte>, if the currently pending messages are made of - instances only. will return the total number of - readable bytes of these buffers. - - Note that the returned array is reused and thus should not escape - . Refer to - for an example. - - - The maximum amount of buffers that will be added to the return value. - A hint toward the maximum number of bytes to include as part of the return value. Note that this value maybe exceeded because we make a best effort to include at least 1 in the return value to ensure write progress is made. - A list of ArraySegment<byte> buffers. - - - - Returns the number of bytes that can be written out of the array that was - obtained via . This method MUST be called after - . - - - - - Returns true if and only if the total number of pending bytes () - did not exceed the write watermark of the and no user-defined writability flag - () has been set to false. - - - - - Returns true if and only if the user-defined writability flag at the specified index is set to - true. - - The index to check for user-defined writability. - - true if the user-defined writability flag at the specified index is set to true. - - - - - Sets a user-defined writability flag at the specified index. - - The index where a writability flag should be set. - Whether to set the index as writable or not. - - - - Returns the number of flushed messages in this . - - - - - Returns true if there are flushed messages in this , otherwise - false. - - - - - Gets the number of bytes that can be written before returns false. - This quantity will always be non-negative. If is already false, then 0 is - returned. - - - The number of bytes that can be written before returns false. - - - - - Gets the number of bytes that must be drained from the underlying buffer before - returns true. This quantity will always be non-negative. If is already - true, then 0 is returned. - - - The number of bytes that can be written before returns true. - - - - - Calls for each flushed message in this - until returns - false or there are no more flushed messages to process. - - - The intance to use to process each flushed message. - - - - - Will be called for each flushed message until it either there are no more flushed messages or this method returns false. - - The message to process. - true if the given message was successfully processed, otherwise false. - - - - Shared configuration for SocketAsyncChannel. Provides access to pre-configured resources like ByteBuf allocator and - IO buffer pools - - - - - This is the head of a linked list that is processed by and so - process all the pending . We only keep the head because it is expected that - the list is used infrequently and its size is small. Thus full iterations to do insertions is assumed to be - a good compromised to saving memory and tail management complexity. - - - - - Set to true once the is registered. Once set to true, the - value will never change. - - - - - Returns the string representation of this pipeline. - - - - - Removes all handlers from the pipeline one by one from tail (exclusive) to head (exclusive) to trigger - . Note that we traverse up the pipeline - before traversing down so that the handlers are removed after all events are - handled. - See: https://github.com/netty/netty/issues/3156 - - - - - Called once an hits the end of the without being - handled by the user in . - - - - - Called once a message hits the end of the without being handled by the user - in . This method is responsible - for calling on the given msg at some point. - - - - - Default implementation of which respects - - and also prevents overflow. - - - - Focuses on enforcing the maximum messages per read condition for . - - - Only is used. - - - - Returns the default implementation, which returns 0 for unknown messages. - - - - - Creates a new instance. - - The size which is returned for unknown messages. - - - - Create a new instance with an empty pipeline. - - - - - Create a new instance with an empty pipeline with the specified . - - The of this channel. - - - - Create a new instance with the pipeline initialized with the specified handlers. - - - The s that will be added to the - - - - Create a new instance with the pipeline initialized with the specified handlers. - The of this channel. - - false if this will delegate - to , true otherwise. - - - The s that will be added to the - - - - - Returns the which holds all of the s that - were received by this . - - - - - Returns the which holds all of the s that - were written by this . - - - - - Return received data from this . - - - - - Read data from the outbound. This may return null if nothing is readable. - - - - - Run all tasks (which also includes scheduled tasks) that are pending in the - for this . - - - - - Run all pending scheduled tasks in the for this . - - - The when the next scheduled task is ready to run. If no other task is - scheduled then it will return . - - - - - Write messages to the inbound of this - - The messages to be written. - true if the write operation did add something to the inbound buffer - - - - Write messages to the outbound of this . - - The messages to be written. - true if the write operation did add something to the inbound buffer - - - - Mark this as finished. Any further try to write data to it will fail. - - bufferReadable returns true - - - - Marks this as finished and releases all pending message in the inbound and outbound - buffer. Any futher try to write data to it will fail. - - true if any of the used buffers has something left to read, otherwise false. - - - - Marks this as finished. Any futher attempt to write data to it will fail. - - If true, all pending messages in the inbound and outbound buffer are released. - true if any of the used buffers has something left to read, otherwise false. - - - - Releases all buffered inbound messages. - - true if any were in the inbound buffer, otherwise false. - - - - Releases all buffered outbound messages. - - true if any were in the outbound buffer, otherwise false. - - - - Check to see if there was any and rethrow if so. - - - - - Ensure the is open and if not throw an exception. - - - - - A dummy implementation - - - - - Create a new instance with an empty pipeline. - - - - - Create a new instance with an empty pipeline with the specified . - - The of this channel. - - - - Create a new instance with the pipeline initialized with the specified handlers. - - - The s that will be added to the - - - - Create a new instance with the pipeline initialized with the specified handlers. - The of this channel. - - false if this will delegate - to , true otherwise. - - - The s that will be added to the - - - - - Returns the which holds all of the s that - were received by this . - - - - - Returns the which holds all of the s that - were written by this . - - - - - Return received data from this . - - - - - Read data from the outbound. This may return null if nothing is readable. - - - - - Write messages to the inbound of this - - The messages to be written. - true if the write operation did add something to the inbound buffer - - - - Write messages to the outbound of this . - - The messages to be written. - true if the write operation did add something to the inbound buffer - - - - Mark this as finished. Any further try to write data to it will fail. - - bufferReadable returns true - - - - Marks this as finished and releases all pending message in the inbound and outbound - buffer. Any futher try to write data to it will fail. - - true if any of the used buffers has something left to read, otherwise false. - - - - Marks this as finished. Any futher attempt to write data to it will fail. - - If true, all pending messages in the inbound and outbound buffer are released. - true if any of the used buffers has something left to read, otherwise false. - - - - Releases all buffered inbound messages. - - true if any were in the inbound buffer, otherwise false. - - - - Releases all buffered outbound messages. - - true if any were in the outbound buffer, otherwise false. - - - - Check to see if there was any and rethrow if so. - - - - - Ensure the is open and if not throw an exception. - - - - - The that always yields the same buffer - size prediction. This predictor ignores the feedback from the I/O thread. - - - - - Creates a new predictor that always returns the same prediction of - the specified buffer size. - - - - - Returns the name of this group. A group name is purely for helping - you to distinguish one group from others. - - - - - Return the of the which describe the nature of the - . - - - - - The of the was registered with its - . - - - - - The of the was unregistered from its - . - - - - - Gets called once the writable state of a changed. You can check the state with - . - - - - - Called once a bind operation is made. - - - The for which the bind operation is made. - - The to which it should bind. - An await-able task. - - - - Called once a connect operation is made. - - - The for which the connect operation is made. - - The to which it should connect. - The which is used as source on connect. - An await-able task. - - - - Called once a disconnect operation is made. - - - The for which the disconnect operation is made. - - An await-able task. - - - - Returns the which is used to execute an arbitrary task. - - - - - The unique name of the . - - - The name was used when the was added to the . - This name can also be used to access the registered from the - . - - - - - A was registered to its . This will result in having the - method called of the next - contained in the of the . - - The current . - - - - A was unregistered from its . This will result in having the - method called of the next - contained in the of the . - - The current . - - - - Request to bind to the given . - - This will result in having the method called of the next - contained in the of the - . - - - The to bind to. - An await-able task. - - - - Request to connect to the given . - - This will result in having the method called of the next - contained in the of the - . - - - The to connect to. - An await-able task. - - - - Request to connect to the given while also binding to the localAddress. - - This will result in having the method called of the next - contained in the of the - . - - - The to connect to. - The to bind to. - An await-able task. - - - - Request to disconnect from the remote peer. - - This will result in having the method called of the next - contained in the of the - . - - - An await-able task. - - - - Request to deregister from the previous assigned . - - This will result in having the method called of the next - contained in the of the - . - - - An await-able task. - - -
- A list of s which handles or intercepts inbound events and outbound operations of - a . implements an advanced form of the - Intercepting Filter pattern - to give a user full control over how an event is handled and how the s in a - pipeline interact with each other. - Creation of a pipeline - Each channel has its own pipeline and it is created automatically when a new channel is created. - How an event flows in a pipeline - - The following diagram describes how I/O events are processed by s in a - typically. An I/O event is handled by a and is - forwarded by the which handled the event to the - which is placed right next to it. A can also trigger an arbitrary I/O event if - necessary. To forward or trigger an event, a calls the event propagation methods - defined in , such as - and . - - -
-                    I/O Request
-                    via  or
-                    {@link ChannelHandlerContext} 
-                    |
-                    +---------------------------------------------------+---------------+
-                    |                           ChannelPipeline         |               |
-                    |                                                  \|/              |
-                    |    +----------------------------------------------+----------+    |
-                    |    |                   ChannelHandler  N                     |    |
-                    |    +----------+-----------------------------------+----------+    |
-                    |              /|\                                  |               |
-                    |               |                                  \|/              |
-                    |    +----------+-----------------------------------+----------+    |
-                    |    |                   ChannelHandler N-1                    |    |
-                    |    +----------+-----------------------------------+----------+    |
-                    |              /|\                                  .               |
-                    |               .                                   .               |
-                    | ChannelHandlerContext.fireIN_EVT() ChannelHandlerContext.OUT_EVT()|
-                    |          [method call]                      [method call]         |
-                    |               .                                   .               |
-                    |               .                                  \|/              |
-                    |    +----------+-----------------------------------+----------+    |
-                    |    |                   ChannelHandler  2                     |    |
-                    |    +----------+-----------------------------------+----------+    |
-                    |              /|\                                  |               |
-                    |               |                                  \|/              |
-                    |    +----------+-----------------------------------+----------+    |
-                    |    |                   ChannelHandler  1                     |    |
-                    |    +----------+-----------------------------------+----------+    |
-                    |              /|\                                  |               |
-                    +---------------+-----------------------------------+---------------+
-                    |                                  \|/
-                    +---------------+-----------------------------------+---------------+
-                    |               |                                   |               |
-                    |       [ Socket.read() ]                    [ Socket.write() ]     |
-                    |                                                                   |
-                    |  Netty Internal I/O Threads (Transport Implementation)            |
-                    +-------------------------------------------------------------------+
-                
-
- - An inbound event is handled by the s in the bottom-up direction as shown on the - left side of the diagram. An inbound event is usually triggered by the I/O thread on the bottom of the diagram - so that the s are notified when the state of a changes - (e.g. newly established connections and closed connections) or the inbound data was read from a remote peer. If - an inbound event goes beyond the at the top of the diagram, it is discarded and - logged, depending on your loglevel. - - - An outbound event is handled by the s in the top-down direction as shown on the - right side of the diagram. An outbound event is usually triggered by your code that requests an outbound I/O - operation, such as a write request and a connection attempt. If an outbound event goes beyond the - at the bottom of the diagram, it is handled by an I/O thread associated with the - . The I/O thread often performs the actual output operation such as - . - - Forwarding an event to the next handler - - As explained briefly above, a has to invoke the event propagation methods in - to forward an event to its next handler. Those methods include: -
    -
  • - Inbound event propagation methods: -
      -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    -
  • -
  • - Outbound event propagation methods: -
      -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    -
  • -
-
- - and the following example shows how the event propagation is usually done: - - public class MyInboundHandler : - { - public override void ChannelActive( ctx) - { - Console.WriteLine("Connected!"); - ctx.FireChannelActive(); - } - } - - public class MyOutboundHandler : - { - public override async Task CloseAsync( ctx) - { - Console.WriteLine("Closing..."); - await ctx.CloseAsync(); - } - } - - - Building a pipeline - - A user is supposed to have one or more s in a pipeline to receive I/O events - (e.g. read) and to request I/O operations (e.g. write and close). For example, a typical server will have the - following handlers in each channel's pipeline, but your mileage may vary depending on the complexity and - characteristics of the protocol and business logic: -
    -
  1. Protocol Decoder - translates binary data (e.g. ) into a Java object.
  2. -
  3. Protocol Encoder - translates a Java object into binary data.
  4. -
  5. Business Logic Handler - performs the actual business logic (e.g. database access).
  6. -
-
- - and it could be represented as shown in the following example: - - static readonly group = new (); - ... - pipeline = ch.Pipeline; - pipeline.AddLast("decoder", new MyProtocolDecoder()); - pipeline.AddLast("encoder", new MyProtocolEncoder()); - - // Tell the pipeline to run MyBusinessLogicHandler's event handler methods - // in a different thread than an I/O thread so that the I/O thread is not blocked by - // a time-consuming task. - // If your business logic is fully asynchronous or finished very quickly, you don't - // need to specify a group. - pipeline.AddLast(group, "handler", new MyBusinessLogicHandler()); - - - Thread safety - - An can be added or removed at any time because an - is thread safe. For example, you can insert an encryption handler when sensitive information is about to be - exchanged, and remove it after the exchange. - -
- - - - Inserts an at the first position of this pipeline. - - - The name of the handler to insert first. Pass null to let the name auto-generated. - - The to insert first. - The . - - Thrown if an entry with the same already exists. - - Thrown if the specified handler is null. - - - - Inserts a at the first position of this pipeline. - - - The which invokes the 's event handler methods. - - - The name of the handler to insert first. Pass null to let the name be auto-generated. - - The to insert first. - This . - - Thrown if an entry with the same already exists. - - Thrown if the specified handler is null. - - - - Appends an at the last position of this pipeline. - - - The name of the handler to append. Pass null to let the name be auto-generated. - - The to append. - This . - - Thrown if an entry with the same already exists. - - Thrown if the specified handler is null. - - - - Appends a at the last position of this pipeline. - - - The which invokes the 's event handler methods. - - - The name of the handler to append. Pass null to let the name be auto-generated. - - The to append. - This . - - Thrown if an entry with the same already exists. - - Thrown if the specified handler is null. - - - - Inserts a before an existing handler of this pipeline. - - The name of the existing handler. - - The name of the new handler being appended. Pass null to let the name be auto-generated. - - The to append. - This . - - Thrown if an entry with the same already exists, or if no match was found for the - given . - - Thrown if the specified handler is null. - - - - Inserts a before an existing handler of this pipeline. - - - The which invokes the 's event handler methods. - - The name of the existing handler. - - The name of the new handler being appended. Pass null to let the name be auto-generated. - - The to append. - This . - - Thrown if an entry with the same already exists, or if no match was found for the - given . - - Thrown if the specified handler is null. - - - - Inserts a after an existing handler of this pipeline. - - The name of the existing handler. - - The name of the new handler being appended. Pass null to let the name be auto-generated. - - The handler to insert after. - This . - - Thrown if an entry with the same already exists, or if no match was found for the - given . - - Thrown if the specified handler is null. - - - - Inserts a after an existing handler of this pipeline. - - - The which invokes the 's event handler methods. - - The name of the existing handler. - - The name of the new handler being appended. Pass null to let the name be auto-generated. - - The handler to insert after. - This . - - Thrown if an entry with the same already exists, or if no match was found for the - given . - - Thrown if the specified handler is null. - - - - Inserts multiple s at the first position of this pipeline. - - The s to insert. - This . - - - - Inserts multiple s at the first position of this pipeline. - - - The which invokes the ' event handler methods. - - The s to insert. - This . - - - - Inserts multiple s at the last position of this pipeline. - - The s to insert. - This . - - - - Inserts multiple s at the last position of this pipeline. - - - The which invokes the ' event handler methods. - - The s to insert. - This . - - - - Removes the specified from this pipeline. - - The to remove. - This . - Thrown if the specified handler was not found. - - - - Removes the with the specified name from this pipeline. - - The name under which the was stored. - The removed . - - Thrown if there's no such handler with the specified name in this pipeline. - - - - - Removes the of the specified type from this pipeline. - - The type of handler to remove. - The removed . - Thrown if there's no handler of the specified type in this pipeline. - - - - Removes the first in this pipeline. - - The removed . - Thrown if this pipeline is empty. - - - - Removes the last in this pipeline. - - The removed . - Thrown if this pipeline is empty. - - - - Replaces the specified with a new handler in this pipeline. - - The to be replaced. - - The name of the new handler being inserted. Pass null to let the name be auto-generated. - - The new to be inserted. - This . - - Thrown if an entry with the same already exists, or if the - was not found. - - - - - Replaces the of the specified name with a new handler in this pipeline. - - The name of the to be replaced. - - The name of the new handler being inserted. Pass null to let the name be auto-generated. - - The new to be inserted. - The that was replaced. - - Thrown if an entry with the same already exists, or if no match was found for - the given . - - - - - Replaces the of the specified type with a new handler in this pipeline. - - The type of the handler to be removed. - - The name of the new handler being inserted. Pass null to let the name be auto-generated. - - The new to be inserted. - The that was replaced. - - Thrown if an entry with the same already exists, or if no match was found for - the given type. - - - - - Returns the first in this pipeline. - - The first handler in the pipeline, or null if the pipeline is empty. - - - - Returns the context of the first in this pipeline. - - - The context of the first handler in the pipeline, or null if the pipeline is empty. - - - - - Returns the last in this pipeline. - - The last handler in the pipeline, or null if the pipeline is empty. - - - - Returns the context of the last in this pipeline. - - - The context of the last handler in the pipeline, or null if the pipeline is empty. - - - - - Returns the with the specified name in this pipeline. - - The name of the desired . - - The handler with the specified name, or null if there's no such handler in this pipeline. - - - - - Returns the of the specified type in this pipeline. - - The type of handler to retrieve. - - The handler with the specified type, or null if there's no such handler in this pipeline. - - - - - Returns the context object of the specified in this pipeline. - - The whose context should be retrieved. - - The context object of the specified handler, or null if there's no such handler in this pipeline. - - - - - Returns the context object of the with the specified name in this pipeline. - - The name of the whose context should be retrieved. - - The context object of the handler with the specified name, or null if there's no such handler in - this pipeline. - - - - - Returns the context object of the of the specified type in this pipeline. - - The type of whose context should be retrieved. - - The context object of the handler with the specified type, or null if there's no such handler in - this pipeline. - - - - - Returns the that this pipeline is attached to. - Returns null if this pipeline is not attached to any channel yet. - - - - - An was registered to its . - This will result in having the method - called of the next contained in the of the - . - - This . - - - - An was unregistered from its . - This will result in having the method - called of the next contained in the of the - . - - This . - - - - An is active now, which means it is connected. - This will result in having the method - called of the next contained in the of the - . - - This . - - - - An is inactive now, which means it is closed. - This will result in having the method - called of the next contained in the of the - . - - This . - - - - An received an in one of its inbound operations. - This will result in having the method - called of the next contained in the of the - . - - The that was caught. - This . - - - - An received an user defined event. - This will result in having the method - called of the next contained in the of the - . - - The user-defined event that was triggered. - This . - - - - An received a message. - This will result in having the method - called of the next contained in the of the - . - - The message that was received. - This . - - - - An completed a message after reading it. - This will result in having the method - called of the next contained in the of the - . - - This . - - - - Triggers an event to the next - in the . - - This . - - - - Request to bind to the given . - - This will result in having the method called of the next - contained in the of the - . - - - - - - Request to connect to the given . - - This will result in having the method called of the next - contained in the of the - . - - - The remote to connect to. - An await-able task. - - - - Request to connect to the given . - - This will result in having the method called of the next - contained in the of the - . - - - The remote to connect to. - The local to bind. - An await-able task. - - - - Request to disconnect from the remote peer. - - This will result in having the method called of the next - contained in the of the - . - - - An await-able task. - - - - Request to close the . After it is closed it is not possible to reuse it again. - - This will result in having the method called of the next - contained in the of the - . - - - An await-able task. - - - - Request to deregister the bound this from the - previous assigned . - - This will result in having the method called of the next - contained in the of the - . - - - An await-able task. - - - - Request to Read data from the into the first inbound buffer, triggers an - event if data was read, and triggers a - event so the handler can decide whether to continue - reading. If there's a pending read operation already, this method does nothing. - - This will result in having the method called of the next - contained in the of the - . - - - This . - - - - Request to write a message via this . - This method will not request to actual flush, so be sure to call - once you want to request to flush all pending data to the actual transport. - - An await-able task. - - - - Request to flush all pending messages. - - This . - - - - Shortcut for calling both and . - - - - - specialized to handle I/O operations of assigned s. - - - - - Parent . - - - - - - specialized for handling s. - - - - - Returns list of owned event loops. - - - - - Returns one of owned event loops. - - - - - Register the for this event loop. - - The to register. - The register task. - - - - that limits the number of read operations that will be attempted when a read - operation - is attempted by the event loop. - - - - - Gets or sets the maximum number of messages to read per read loop. - If this value is greater than 1, an event loop might attempt to read multiple times to procure multiple messages. - - - - - Creates a new handle. The handle provides the actual operations. - - - - - Calculates the size of the given message. - - The message for which the size should be calculated. - The size in bytes. The returned size must be >= 0 - - - - Allocates a new receive buffer whose capacity is probably large enough to read all inbound data and small enough - not to waste its space. - - - - - Creates a new handle. The handle provides the actual operations and keeps the internal information which is - required for predicting an optimal buffer capacity. - - - - - Creates a new receive buffer whose capacity is probably large enough to read all inbound data and small - enough not to waste its space. - - - - - Similar to except that it does not allocate anything but just tells the - capacity. - - - - - Reset any counters that have accumulated and recommend how many messages/bytes should be read for the next - read loop. -

- This may be used by to determine if the read operation should complete. -

- This is only ever a hint and may be ignored by the implementation. -
- The channel configuration which may impact this object's behavior. -
- - Increment the number of messages that have been read for the current read loop. - The amount to increment by. - - - - Get or set the bytes that have been read for the last read operation. - This may be used to increment the number of bytes that have been read. - - - Returned value may be negative if an read error - occurs. If a negative value is seen it is expected to be return on the next set to - . A negative value will signal a termination condition enforced externally - to this class and is not required to be enforced in . - - - - Get or set how many bytes the read operation will (or did) attempt to read. - - - Determine if the current read loop should should continue. - true if the read loop should continue reading. false if the read loop is complete. - - - Signals read completion. - - - - A that accepts an incoming connection attempt and creates its child - s by accepting them. is a good example. - - - - - A for the local transport. - - - - - A for the local transport which allows in VM communication. - - - - - A factory method for s. Users may override it to create custom instances of s. - - An existing that will act as a peer for the new channel. - The newly created instance. - - - - backed by a set of instances. - - - - - - - - - - - - - Creates a new instance of . - - - Creates a new instance of . - - - Creates a new instance of . - - - Creates a new instance of . - - - - - - - - - - - - - A queue of write operations which are pending for later execution. It also updates the writability of the - associated (), so that the pending write operations are - also considered to determine the writability. - - - - - Returns true if there are no pending write operations left in this queue. - - - - - Returns the number of pending write operations. - - - - - Adds the given message to this . - - The message to add to the . - An await-able task. - - - - Removes all pending write operations, and fail them with the given . The messages - will be released via . - - The to fail with. - - - - Remove a pending write operation and fail it with the given . The message will be - released via . - - The to fail with. - - - - Removes all pending write operation and performs them via - - An await-able task. - - - - Removes a pending write operation and performs it via . - - An await-able task. - - - - Removes a pending write operation and releases it's message via - . - - - The of the pending write, or null if the queue is empty. - - - - - Return the current message, or null if the queue is empty. - - - - - Holds all meta-data and constructs the linked-list structure. - - - - - implementation based on . - - - - Creates a new instance of . - - - Creates a new instance of . - - - Creates a new instance of . - - - Creates a new instance of . - - - Creates a new instance of . - - - Creates a new instance of . - - - Creates a new instance of . - - - Creates a new instance of . - - - - - - - - - - base class for s that operate on bytes. - - - - Create a new instance - the parent by which this instance was created. May be null - the underlying on which it operates - - - - Reads bytes into the given and returns the number of bytes that were read. - - The to read bytes into. - The number of bytes that were read into the buffer. - - - - Writes bytes from the given to the underlying . - - The from which the bytes should be written. - The number of bytes that were written from the buffer. - - - - Set read pending to false. - - - - state before modification - - - PORT NOTE: matches behavior of NioEventLoop.processSelectedKey - - - - Finish connect - - - - - Read from underlying {@link SelectableChannel} - - - - - Connect to the remote peer - - - - - Finish the connect - - - - - base class for s that operate on messages. - - - - - Creates a new instance. - - The parent . Pass null if there's no parent. - The used by the for communication. - - - - Returns true if we should continue the write loop on a write error. - - - - - Reads messages into the given list and returns the amount which was read. - - The list into which message objects should be inserted. - The number of messages which were read. - - - - Writes a message to the underlying . - - The message to be written. - The destination channel buffer for the message. - true if the message was successfully written, otherwise false. - - - - Special event which will be fired and passed to the - methods once the input of an was shutdown and the - property returns true. - - - - - Singleton instance to use. - - - - - The default implementation. - - - - - Creates a new instance. - - - - - The default implementation. - - - - - A TCP/IP which accepts incoming TCP/IP connections. - - - - - A implementation which uses Socket-based implementation to accept new - connections. - - - - - Create a new instance - - - - - Create a new instance - - - - - Create a new instance using the given . - - - - - which uses Socket-based implementation. - - - - Create a new instance - - - Create a new instance - - - Create a new instance using the given . - - - Create a new instance - - the which created this instance or null if it was created by the - user - - the which will be used - - - - Marks the specified as success. If the - is done already, logs a message. - - The to complete. - The to use to log a failure message. - - - - Marks the specified as failure. If the - is done already, log a message. - - The to complete. - The to fail the with. - The to use to log a failure message. - - - + + + + DotNetty.Transport + + + + + This is a helper class that makes it easy to bootstrap an . It supports method- + chaining to provide an easy way to configure the . + + When not used in a context, the methods + are useful for connectionless transports such as datagram (UDP). + + + + + Specifies the which will handle events for the being built. + + The which is used to handle all the events for the to-be-created . + The instance. + + + + Specifies the of which will be created. + + The which is used to create instances from. + The instance. + + + + Assigns the which is used to bind the local "end" to. + + The instance to bind the local "end" to. + The instance. + + + + Assigns the local which is used to bind the local "end" to. + This overload binds to a for any IP address on the local machine, given a specific port. + + The port to bind the local "end" to. + The instance. + + + + Assigns the local which is used to bind the local "end" to. + This overload binds to a for a given hostname and port. + + The hostname to bind the local "end" to. + The port to bind the local "end" to. + The instance. + + + + Assigns the local which is used to bind the local "end" to. + This overload binds to a for a given and port. + + The to bind the local "end" to. + The port to bind the local "end" to. + The instance. + + + + Allows the specification of a which is used for the + instances once they get created. Use a value of null to remove + a previously set . + + The to configure. + The value to set the given option. + + + + Allows specification of an initial attribute of the newly created . If the value is + null, the attribute of the specified key is removed. + + + + + Validates all the parameters. Sub-classes may override this, but should call the super method in that case. + + + + + Returns a deep clone of this bootstrap which has the identical configuration. This method is useful when making + multiple s with similar settings. Please note that this method does not clone the + deeply but shallowly, making the group a shared resource. + + + + + Creates a new and registers it with an . + + + + + Creates a new and binds it to the endpoint specified via the methods. + + The bound . + + + + Creates a new and binds it. + This overload binds to a for any IP address on the local machine, given a specific port. + + The port to bind the local "end" to. + The bound . + + + + Creates a new and binds it. + This overload binds to a for a given hostname and port. + + The hostname to bind the local "end" to. + The port to bind the local "end" to. + The bound . + + + + Creates a new and binds it. + This overload binds to a for a given and port. + + The to bind the local "end" to. + The port to bind the local "end" to. + The bound . + + + + Creates a new and binds it. + + The instance to bind the local "end" to. + The bound . + + + + Specifies the to use for serving the requests. + + The to use for serving requests. + The instance. + + + + Returns the configured or null if none is configured yet. + + + + + A that makes it easy to bootstrap an to use for clients. + + The methods are useful + in combination with connectionless transports such as datagram (UDP). For regular TCP connections, + please use the provided methods. + + + + + Sets the which will resolve the address of the unresolved named address. + + The which will resolve the address of the unresolved named address. + The instance. + + + + Assigns the remote to connect to once the method is called. + + The remote to connect to. + The instance. + + + + Assigns the remote to connect to once the method is called. + + The hostname of the endpoint to connect to. + The port at the remote host to connect to. + The instance. + + + + Assigns the remote to connect to once the method is called. + + The of the endpoint to connect to. + The port at the remote host to connect to. + The instance. + + + + Connects an to the remote peer. + + The . + + + + Connects an to the remote peer. + + The hostname of the endpoint to connect to. + The port at the remote host to connect to. + The . + + + + Connects an to the remote peer. + + The of the endpoint to connect to. + The port at the remote host to connect to. + The . + + + + Connects an to the remote peer. + + The remote to connect to. + The . + + + + Connects an to the remote peer. + + The remote to connect to. + The local to connect to. + The . + + + + Performs DNS resolution for the remote endpoint and connects to it. + + The remote to connect to. + The local to connect the remote to. + The . + + + + Returns a deep clone of this bootstrap which has the identical configuration except that it uses + the given . This method is useful when making multiple s with similar + settings. + + + + + A sub-class which allows easy bootstrapping of . + + + + + Specifies the which is used for the parent (acceptor) and the child (client). + + + + + Sets the for the parent (acceptor) and the child (client). These + 's are used to handle all the events and IO for + and 's. + + + + + Allows specification of a which is used for the + instances once they get created (after the acceptor accepted the ). Use a + value of null to remove a previously set . + + + + + Sets the specific with the given value on every child . + If the value is null, the is removed. + + + + + Sets the which is used to serve the request for the 's. + + + + + Returns the configured which will be used for the child channels or null + if none is configured yet. + + + + Cache for the string representation of this channel + + + + Creates a new instance. + + The parent of this channel. Pass null if there's no parent. + + + + Creates a new instance. + + The parent of this channel. Pass null if there's no parent. + An for the new channel. + + + + Resets the stored . + + + + + Returns a new instance. Subclasses may override this method to assign custom + s to s that use the constructor. + + A new instance. + + + Returns a new pipeline instance. + + + + Create a new instance which will be used for the life-time of the + + + + + + Returns the ID of this channel. + + + + + Returns true if and only if the specified object is identical + with this channel (i.e. this == o). + + + + + Returns the string representation of this channel. The returned string contains a hex dump of the + , the , and the of this + channel for easier identification. + + + + + implementation which sub-classes must extend and use. + + + + true if the channel has never been registered, false otherwise /// + + + + This method must NEVER be called directly, but be executed as an + extra task with a clean call stack instead. The reason for this + is that this method calls + directly, which might lead to an unfortunate nesting of independent inbound/outbound + events. See the comments input for more details. + + + + + Prepares to close the . If this method returns an , the + caller must call the method with a task that calls + on the returned . If this method returns null, + must be called from the caller thread. (i.e. ) + + + + + Checks whether a given is compatible with the . + + The to check compatibility. + + true if the given is compatible with this + instance, otherwise false. + + + + + Is called after the is registered with its as part of the + register process. Sub-classes may override this method. + + + + + Binds the to the . + + The to bind. + + + + Disconnects this from its remote peer. + + + + + Closes the . + + + + + Deregisters the from its . Sub-classes may override this + method. + + + + + ScheduleAsync a read operation. + + + + + Flush the content of the given buffer to the remote peer. + + + + + Invoked when a new message is added to a of this + , so that the implementation converts the message to + another. (e.g. heap buffer -> direct buffer). + + The message to be filtered. + The filtered message. + + + Neither nor was called. + + + was called. + + + was called. + + + + Makes best possible effort to detect if was + called + yet. If not return false and if called or could not detect return true. + If this method returns true we will not invoke the but just forward the + event. + This is needed as may already put the in the + linked-list + but not called + + + + + A skeletal server-side implementation. A server-side does not + allow the following operations: , + , , + . + + + + + Creates a new instance. + + + + + The that automatically increases and + decreases the predicted buffer size on feed back. +

+ It gradually increases the expected number of readable bytes if the previous + read fully filled the allocated buffer. It gradually decreases the expected + number of readable bytes if the read operation was not able to fill a certain + amount of the allocated buffer two times consecutively. Otherwise, it keeps + returning the same prediction. +

+
+ + + Creates a new predictor with the default parameters. With the default + parameters, the expected buffer size starts from 1024, does not + go down below 64, and does not go up above 65536. + + + + Creates a new predictor with the specified parameters. + the inclusive lower bound of the expected buffer size + the initial buffer size when no feed back was received + the inclusive upper bound of the expected buffer size + + + + that works as a wrapper for another providing affinity on call. + + + + + + + + Creates a new instance of . + + serving as an actual provider of s. + + + + If running in a context of an existing , this is returned. + Otherwise, is retrieved from underlying . + + + + + + + + A queue of write operations which are pending for later execution. It also updates the + writability of the associated , so that + the pending write operations are also considered to determine the writability. + + + + Returns true if there are no pending write operations left in this queue. + + + Returns the number of pending write operations. + + + Add the given msg and returns for completion of processing msg. + + + + Remove all pending write operation and fail them with the given . The messages will be + released + via . + + + + + Remove a pending write operation and fail it with the given . The message will be released + via + . + + + + + Remove all pending write operation and performs them via + . + + + if something was written and null if the + is empty. + + + + + Removes a pending write operation and performs it via + . + + + if something was written and null if the + is empty. + + + + + Removes a pending write operation and release it's message via . + + of the pending write or null if the queue is empty. + + + + Return the current message or null if empty. + + + + Holds all meta-data and construct the linked-list structure. + + + + It is a good starting point if your implementation needs to intercept operations and also + state updates. + + + + + A special which offers an easy way to initialize a once it was + registered to its . + + Implementations are most often used in the context of + and to setup the of a . + + Be aware that this class is marked as Sharable (via ) and so the implementation must be safe to be re-used. + + + + public class MyChannelInitializer extends { + public void InitChannel( channel) { + channel.Pipeline().AddLast("myHandler", new MyHandler()); + } + } + bootstrap = ...; + ... + bootstrap.childHandler(new MyChannelInitializer()); + ... + + + A sub-type of . + + + + This method will be called once the was registered. After the method returns this instance + will be removed from the of the . + + The which was registered. + + + Represents the properties of a implementation. + + + Create a new instance + + true if and only if the channel has the DisconnectAsync() operation + that allows a user to disconnect and then call + again, such as UDP/IP. + + + + Create a new instance + + true if and only if the channel has the DisconnectAsync operation + that allows a user to disconnect and then call + again, such as UDP/IP. + + + If a is in use, then this value will be + set for . Must be > 0. + + + + + Returns true if and only if the channel has the DisconnectAsync() operation + that allows a user to disconnect and then call again, + such as UDP/IP. + + + + + If a is in use, then this is the default value for + . + + + + + Returns the of the specified name. + + The type of option being retrieved. + The name of the desired option. + The matching instance. + + + + Returns the of the given pair: (, secondary name) + + The type of option being retrieved. + + A whose name will be used as the first part of the desired option's name. + + + A string representing the second part of the desired option's name. + + The matching instance. + + + + Checks whether a given exists. + + The name of the . + true if a exists for the given , otherwise false. + + + + Creates a new for the given . + + The type of option to create. + The name to associate with the new option. + Thrown if a for the given exists. + The new instance. + + + + Adds the given message to this . The given + will be notified once the message was written. + + The message to add to the buffer. + The size of the message. + The to notify once the message is written. + + + + Add a flush to this . This means all previous added messages are marked + as flushed and so you will be able to handle them. + + + + + Increments the number of pending bytes which will be written at some point. + This method is thread-safe! + + The number of bytes to increment the count by. + + + + Decrements the number of pending bytes which will be written at some point. + This method is thread-safe! + + The number of bytes to decrement the count by. + + + + Returns the current message to write, or null if nothing was flushed before and so is ready to be + written. + + + + + Notify the of the current message about writing progress. + + + + + Removes the current message, marks its as complete, and returns + true. If no flushed message exists at the time this method is called, it returns false to + signal that no more messages are ready to be handled. + + true if a message existed and was removed, otherwise false. + + + + Removes the current message, marks its as complete using the given + , and returns true. If no flushed message exists at the time this method is + called, it returns false to signal that no more messages are ready to be handled. + + The causing the message to be removed. + true if a message existed and was removed, otherwise false. + + + + Removes the fully written entries and updates the reader index of the partially written entry. + This operation assumes all messages in this buffer are instances. + + The number of bytes that have been written so far. + + + + Clears all ByteBuffer from the array so these can be GC'ed. + See https://github.com/netty/netty/issues/3837 + + + + + Returns a list of direct ArraySegment<byte>, if the currently pending messages are made of + instances only. will return the total number of + readable bytes of these buffers. + + Note that the returned array is reused and thus should not escape + . Refer to + for an example. + + + A list of ArraySegment<byte> buffers. + + + + Returns a list of direct ArraySegment<byte>, if the currently pending messages are made of + instances only. will return the total number of + readable bytes of these buffers. + + Note that the returned array is reused and thus should not escape + . Refer to + for an example. + + + The maximum amount of buffers that will be added to the return value. + A hint toward the maximum number of bytes to include as part of the return value. Note that this value maybe exceeded because we make a best effort to include at least 1 in the return value to ensure write progress is made. + A list of ArraySegment<byte> buffers. + + + + Returns the number of bytes that can be written out of the array that was + obtained via . This method MUST be called after + . + + + + + Returns true if and only if the total number of pending bytes () + did not exceed the write watermark of the and no user-defined writability flag + () has been set to false. + + + + + Returns true if and only if the user-defined writability flag at the specified index is set to + true. + + The index to check for user-defined writability. + + true if the user-defined writability flag at the specified index is set to true. + + + + + Sets a user-defined writability flag at the specified index. + + The index where a writability flag should be set. + Whether to set the index as writable or not. + + + + Returns the number of flushed messages in this . + + + + + Returns true if there are flushed messages in this , otherwise + false. + + + + + Gets the number of bytes that can be written before returns false. + This quantity will always be non-negative. If is already false, then 0 is + returned. + + + The number of bytes that can be written before returns false. + + + + + Gets the number of bytes that must be drained from the underlying buffer before + returns true. This quantity will always be non-negative. If is already + true, then 0 is returned. + + + The number of bytes that can be written before returns true. + + + + + Calls for each flushed message in this + until returns + false or there are no more flushed messages to process. + + + The intance to use to process each flushed message. + + + + + Will be called for each flushed message until it either there are no more flushed messages or this method returns false. + + The message to process. + true if the given message was successfully processed, otherwise false. + + + + Shared configuration for SocketAsyncChannel. Provides access to pre-configured resources like ByteBuf allocator and + IO buffer pools + + + + + This is the head of a linked list that is processed by and so + process all the pending . We only keep the head because it is expected that + the list is used infrequently and its size is small. Thus full iterations to do insertions is assumed to be + a good compromised to saving memory and tail management complexity. + + + + + Set to true once the is registered. Once set to true, the + value will never change. + + + + + Returns the string representation of this pipeline. + + + + + Removes all handlers from the pipeline one by one from tail (exclusive) to head (exclusive) to trigger + . Note that we traverse up the pipeline + before traversing down so that the handlers are removed after all events are + handled. + See: https://github.com/netty/netty/issues/3156 + + + + + Called once an hits the end of the without being + handled by the user in . + + + + + Called once a message hits the end of the without being handled by the user + in . This method is responsible + for calling on the given msg at some point. + + + + + Default implementation of which respects + + and also prevents overflow. + + + + Focuses on enforcing the maximum messages per read condition for . + + + Only is used. + + + + Returns the default implementation, which returns 0 for unknown messages. + + + + + Creates a new instance. + + The size which is returned for unknown messages. + + + + Create a new instance with an empty pipeline. + + + + + Create a new instance with an empty pipeline with the specified . + + The of this channel. + + + + Create a new instance with the pipeline initialized with the specified handlers. + + + The s that will be added to the + + + + Create a new instance with the pipeline initialized with the specified handlers. + The of this channel. + + false if this will delegate + to , true otherwise. + + + The s that will be added to the + + + + + Returns the which holds all of the s that + were received by this . + + + + + Returns the which holds all of the s that + were written by this . + + + + + Return received data from this . + + + + + Read data from the outbound. This may return null if nothing is readable. + + + + + Run all tasks (which also includes scheduled tasks) that are pending in the + for this . + + + + + Run all pending scheduled tasks in the for this . + + + The when the next scheduled task is ready to run. If no other task is + scheduled then it will return . + + + + + Write messages to the inbound of this + + The messages to be written. + true if the write operation did add something to the inbound buffer + + + + Write messages to the outbound of this . + + The messages to be written. + true if the write operation did add something to the inbound buffer + + + + Mark this as finished. Any further try to write data to it will fail. + + bufferReadable returns true + + + + Marks this as finished and releases all pending message in the inbound and outbound + buffer. Any futher try to write data to it will fail. + + true if any of the used buffers has something left to read, otherwise false. + + + + Marks this as finished. Any futher attempt to write data to it will fail. + + If true, all pending messages in the inbound and outbound buffer are released. + true if any of the used buffers has something left to read, otherwise false. + + + + Releases all buffered inbound messages. + + true if any were in the inbound buffer, otherwise false. + + + + Releases all buffered outbound messages. + + true if any were in the outbound buffer, otherwise false. + + + + Check to see if there was any and rethrow if so. + + + + + Ensure the is open and if not throw an exception. + + + + + A dummy implementation + + + + + Create a new instance with an empty pipeline. + + + + + Create a new instance with an empty pipeline with the specified . + + The of this channel. + + + + Create a new instance with the pipeline initialized with the specified handlers. + + + The s that will be added to the + + + + Create a new instance with the pipeline initialized with the specified handlers. + The of this channel. + + false if this will delegate + to , true otherwise. + + + The s that will be added to the + + + + + Returns the which holds all of the s that + were received by this . + + + + + Returns the which holds all of the s that + were written by this . + + + + + Return received data from this . + + + + + Read data from the outbound. This may return null if nothing is readable. + + + + + Write messages to the inbound of this + + The messages to be written. + true if the write operation did add something to the inbound buffer + + + + Write messages to the outbound of this . + + The messages to be written. + true if the write operation did add something to the inbound buffer + + + + Mark this as finished. Any further try to write data to it will fail. + + bufferReadable returns true + + + + Marks this as finished and releases all pending message in the inbound and outbound + buffer. Any futher try to write data to it will fail. + + true if any of the used buffers has something left to read, otherwise false. + + + + Marks this as finished. Any futher attempt to write data to it will fail. + + If true, all pending messages in the inbound and outbound buffer are released. + true if any of the used buffers has something left to read, otherwise false. + + + + Releases all buffered inbound messages. + + true if any were in the inbound buffer, otherwise false. + + + + Releases all buffered outbound messages. + + true if any were in the outbound buffer, otherwise false. + + + + Check to see if there was any and rethrow if so. + + + + + Ensure the is open and if not throw an exception. + + + + + The that always yields the same buffer + size prediction. This predictor ignores the feedback from the I/O thread. + + + + + Creates a new predictor that always returns the same prediction of + the specified buffer size. + + + + + Returns the name of this group. A group name is purely for helping + you to distinguish one group from others. + + + + + Return the of the which describe the nature of the + . + + + + + The of the was registered with its + . + + + + + The of the was unregistered from its + . + + + + + Gets called once the writable state of a changed. You can check the state with + . + + + + + Called once a bind operation is made. + + + The for which the bind operation is made. + + The to which it should bind. + An await-able task. + + + + Called once a connect operation is made. + + + The for which the connect operation is made. + + The to which it should connect. + The which is used as source on connect. + An await-able task. + + + + Called once a disconnect operation is made. + + + The for which the disconnect operation is made. + + An await-able task. + + + + Returns the which is used to execute an arbitrary task. + + + + + The unique name of the . + + + The name was used when the was added to the . + This name can also be used to access the registered from the + . + + + + + A was registered to its . This will result in having the + method called of the next + contained in the of the . + + The current . + + + + A was unregistered from its . This will result in having the + method called of the next + contained in the of the . + + The current . + + + + Request to bind to the given . + + This will result in having the method called of the next + contained in the of the + . + + + The to bind to. + An await-able task. + + + + Request to connect to the given . + + This will result in having the method called of the next + contained in the of the + . + + + The to connect to. + An await-able task. + + + + Request to connect to the given while also binding to the localAddress. + + This will result in having the method called of the next + contained in the of the + . + + + The to connect to. + The to bind to. + An await-able task. + + + + Request to disconnect from the remote peer. + + This will result in having the method called of the next + contained in the of the + . + + + An await-able task. + + + + Request to deregister from the previous assigned . + + This will result in having the method called of the next + contained in the of the + . + + + An await-able task. + + + + A list of s which handles or intercepts inbound events and outbound operations of + a . implements an advanced form of the + Intercepting Filter pattern + to give a user full control over how an event is handled and how the s in a + pipeline interact with each other. + Creation of a pipeline + Each channel has its own pipeline and it is created automatically when a new channel is created. + How an event flows in a pipeline + + The following diagram describes how I/O events are processed by s in a + typically. An I/O event is handled by a and is + forwarded by the which handled the event to the + which is placed right next to it. A can also trigger an arbitrary I/O event if + necessary. To forward or trigger an event, a calls the event propagation methods + defined in , such as + and . + + +
+                    I/O Request
+                    via  or
+                    {@link ChannelHandlerContext} 
+                    |
+                    +---------------------------------------------------+---------------+
+                    |                           ChannelPipeline         |               |
+                    |                                                  \|/              |
+                    |    +----------------------------------------------+----------+    |
+                    |    |                   ChannelHandler  N                     |    |
+                    |    +----------+-----------------------------------+----------+    |
+                    |              /|\                                  |               |
+                    |               |                                  \|/              |
+                    |    +----------+-----------------------------------+----------+    |
+                    |    |                   ChannelHandler N-1                    |    |
+                    |    +----------+-----------------------------------+----------+    |
+                    |              /|\                                  .               |
+                    |               .                                   .               |
+                    | ChannelHandlerContext.fireIN_EVT() ChannelHandlerContext.OUT_EVT()|
+                    |          [method call]                      [method call]         |
+                    |               .                                   .               |
+                    |               .                                  \|/              |
+                    |    +----------+-----------------------------------+----------+    |
+                    |    |                   ChannelHandler  2                     |    |
+                    |    +----------+-----------------------------------+----------+    |
+                    |              /|\                                  |               |
+                    |               |                                  \|/              |
+                    |    +----------+-----------------------------------+----------+    |
+                    |    |                   ChannelHandler  1                     |    |
+                    |    +----------+-----------------------------------+----------+    |
+                    |              /|\                                  |               |
+                    +---------------+-----------------------------------+---------------+
+                    |                                  \|/
+                    +---------------+-----------------------------------+---------------+
+                    |               |                                   |               |
+                    |       [ Socket.read() ]                    [ Socket.write() ]     |
+                    |                                                                   |
+                    |  Netty Internal I/O Threads (Transport Implementation)            |
+                    +-------------------------------------------------------------------+
+                
+
+ + An inbound event is handled by the s in the bottom-up direction as shown on the + left side of the diagram. An inbound event is usually triggered by the I/O thread on the bottom of the diagram + so that the s are notified when the state of a changes + (e.g. newly established connections and closed connections) or the inbound data was read from a remote peer. If + an inbound event goes beyond the at the top of the diagram, it is discarded and + logged, depending on your loglevel. + + + An outbound event is handled by the s in the top-down direction as shown on the + right side of the diagram. An outbound event is usually triggered by your code that requests an outbound I/O + operation, such as a write request and a connection attempt. If an outbound event goes beyond the + at the bottom of the diagram, it is handled by an I/O thread associated with the + . The I/O thread often performs the actual output operation such as + . + + Forwarding an event to the next handler + + As explained briefly above, a has to invoke the event propagation methods in + to forward an event to its next handler. Those methods include: +
    +
  • + Inbound event propagation methods: +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
  • + Outbound event propagation methods: +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
+
+ + and the following example shows how the event propagation is usually done: + + public class MyInboundHandler : + { + public override void ChannelActive( ctx) + { + Console.WriteLine("Connected!"); + ctx.FireChannelActive(); + } + } + + public class MyOutboundHandler : + { + public override async Task CloseAsync( ctx) + { + Console.WriteLine("Closing..."); + await ctx.CloseAsync(); + } + } + + + Building a pipeline + + A user is supposed to have one or more s in a pipeline to receive I/O events + (e.g. read) and to request I/O operations (e.g. write and close). For example, a typical server will have the + following handlers in each channel's pipeline, but your mileage may vary depending on the complexity and + characteristics of the protocol and business logic: +
    +
  1. Protocol Decoder - translates binary data (e.g. ) into a Java object.
  2. +
  3. Protocol Encoder - translates a Java object into binary data.
  4. +
  5. Business Logic Handler - performs the actual business logic (e.g. database access).
  6. +
+
+ + and it could be represented as shown in the following example: + + static readonly group = new (); + ... + pipeline = ch.Pipeline; + pipeline.AddLast("decoder", new MyProtocolDecoder()); + pipeline.AddLast("encoder", new MyProtocolEncoder()); + + // Tell the pipeline to run MyBusinessLogicHandler's event handler methods + // in a different thread than an I/O thread so that the I/O thread is not blocked by + // a time-consuming task. + // If your business logic is fully asynchronous or finished very quickly, you don't + // need to specify a group. + pipeline.AddLast(group, "handler", new MyBusinessLogicHandler()); + + + Thread safety + + An can be added or removed at any time because an + is thread safe. For example, you can insert an encryption handler when sensitive information is about to be + exchanged, and remove it after the exchange. + +
+
+ + + Inserts an at the first position of this pipeline. + + + The name of the handler to insert first. Pass null to let the name auto-generated. + + The to insert first. + The . + + Thrown if an entry with the same already exists. + + Thrown if the specified handler is null. + + + + Inserts a at the first position of this pipeline. + + + The which invokes the 's event handler methods. + + + The name of the handler to insert first. Pass null to let the name be auto-generated. + + The to insert first. + This . + + Thrown if an entry with the same already exists. + + Thrown if the specified handler is null. + + + + Appends an at the last position of this pipeline. + + + The name of the handler to append. Pass null to let the name be auto-generated. + + The to append. + This . + + Thrown if an entry with the same already exists. + + Thrown if the specified handler is null. + + + + Appends a at the last position of this pipeline. + + + The which invokes the 's event handler methods. + + + The name of the handler to append. Pass null to let the name be auto-generated. + + The to append. + This . + + Thrown if an entry with the same already exists. + + Thrown if the specified handler is null. + + + + Inserts a before an existing handler of this pipeline. + + The name of the existing handler. + + The name of the new handler being appended. Pass null to let the name be auto-generated. + + The to append. + This . + + Thrown if an entry with the same already exists, or if no match was found for the + given . + + Thrown if the specified handler is null. + + + + Inserts a before an existing handler of this pipeline. + + + The which invokes the 's event handler methods. + + The name of the existing handler. + + The name of the new handler being appended. Pass null to let the name be auto-generated. + + The to append. + This . + + Thrown if an entry with the same already exists, or if no match was found for the + given . + + Thrown if the specified handler is null. + + + + Inserts a after an existing handler of this pipeline. + + The name of the existing handler. + + The name of the new handler being appended. Pass null to let the name be auto-generated. + + The handler to insert after. + This . + + Thrown if an entry with the same already exists, or if no match was found for the + given . + + Thrown if the specified handler is null. + + + + Inserts a after an existing handler of this pipeline. + + + The which invokes the 's event handler methods. + + The name of the existing handler. + + The name of the new handler being appended. Pass null to let the name be auto-generated. + + The handler to insert after. + This . + + Thrown if an entry with the same already exists, or if no match was found for the + given . + + Thrown if the specified handler is null. + + + + Inserts multiple s at the first position of this pipeline. + + The s to insert. + This . + + + + Inserts multiple s at the first position of this pipeline. + + + The which invokes the ' event handler methods. + + The s to insert. + This . + + + + Inserts multiple s at the last position of this pipeline. + + The s to insert. + This . + + + + Inserts multiple s at the last position of this pipeline. + + + The which invokes the ' event handler methods. + + The s to insert. + This . + + + + Removes the specified from this pipeline. + + The to remove. + This . + Thrown if the specified handler was not found. + + + + Removes the with the specified name from this pipeline. + + The name under which the was stored. + The removed . + + Thrown if there's no such handler with the specified name in this pipeline. + + + + + Removes the of the specified type from this pipeline. + + The type of handler to remove. + The removed . + Thrown if there's no handler of the specified type in this pipeline. + + + + Removes the first in this pipeline. + + The removed . + Thrown if this pipeline is empty. + + + + Removes the last in this pipeline. + + The removed . + Thrown if this pipeline is empty. + + + + Replaces the specified with a new handler in this pipeline. + + The to be replaced. + + The name of the new handler being inserted. Pass null to let the name be auto-generated. + + The new to be inserted. + This . + + Thrown if an entry with the same already exists, or if the + was not found. + + + + + Replaces the of the specified name with a new handler in this pipeline. + + The name of the to be replaced. + + The name of the new handler being inserted. Pass null to let the name be auto-generated. + + The new to be inserted. + The that was replaced. + + Thrown if an entry with the same already exists, or if no match was found for + the given . + + + + + Replaces the of the specified type with a new handler in this pipeline. + + The type of the handler to be removed. + + The name of the new handler being inserted. Pass null to let the name be auto-generated. + + The new to be inserted. + The that was replaced. + + Thrown if an entry with the same already exists, or if no match was found for + the given type. + + + + + Returns the first in this pipeline. + + The first handler in the pipeline, or null if the pipeline is empty. + + + + Returns the context of the first in this pipeline. + + + The context of the first handler in the pipeline, or null if the pipeline is empty. + + + + + Returns the last in this pipeline. + + The last handler in the pipeline, or null if the pipeline is empty. + + + + Returns the context of the last in this pipeline. + + + The context of the last handler in the pipeline, or null if the pipeline is empty. + + + + + Returns the with the specified name in this pipeline. + + The name of the desired . + + The handler with the specified name, or null if there's no such handler in this pipeline. + + + + + Returns the of the specified type in this pipeline. + + The type of handler to retrieve. + + The handler with the specified type, or null if there's no such handler in this pipeline. + + + + + Returns the context object of the specified in this pipeline. + + The whose context should be retrieved. + + The context object of the specified handler, or null if there's no such handler in this pipeline. + + + + + Returns the context object of the with the specified name in this pipeline. + + The name of the whose context should be retrieved. + + The context object of the handler with the specified name, or null if there's no such handler in + this pipeline. + + + + + Returns the context object of the of the specified type in this pipeline. + + The type of whose context should be retrieved. + + The context object of the handler with the specified type, or null if there's no such handler in + this pipeline. + + + + + Returns the that this pipeline is attached to. + Returns null if this pipeline is not attached to any channel yet. + + + + + An was registered to its . + This will result in having the method + called of the next contained in the of the + . + + This . + + + + An was unregistered from its . + This will result in having the method + called of the next contained in the of the + . + + This . + + + + An is active now, which means it is connected. + This will result in having the method + called of the next contained in the of the + . + + This . + + + + An is inactive now, which means it is closed. + This will result in having the method + called of the next contained in the of the + . + + This . + + + + An received an in one of its inbound operations. + This will result in having the method + called of the next contained in the of the + . + + The that was caught. + This . + + + + An received an user defined event. + This will result in having the method + called of the next contained in the of the + . + + The user-defined event that was triggered. + This . + + + + An received a message. + This will result in having the method + called of the next contained in the of the + . + + The message that was received. + This . + + + + An completed a message after reading it. + This will result in having the method + called of the next contained in the of the + . + + This . + + + + Triggers an event to the next + in the . + + This . + + + + Request to bind to the given . + + This will result in having the method called of the next + contained in the of the + . + + + + + + Request to connect to the given . + + This will result in having the method called of the next + contained in the of the + . + + + The remote to connect to. + An await-able task. + + + + Request to connect to the given . + + This will result in having the method called of the next + contained in the of the + . + + + The remote to connect to. + The local to bind. + An await-able task. + + + + Request to disconnect from the remote peer. + + This will result in having the method called of the next + contained in the of the + . + + + An await-able task. + + + + Request to close the . After it is closed it is not possible to reuse it again. + + This will result in having the method called of the next + contained in the of the + . + + + An await-able task. + + + + Request to deregister the bound this from the + previous assigned . + + This will result in having the method called of the next + contained in the of the + . + + + An await-able task. + + + + Request to Read data from the into the first inbound buffer, triggers an + event if data was read, and triggers a + event so the handler can decide whether to continue + reading. If there's a pending read operation already, this method does nothing. + + This will result in having the method called of the next + contained in the of the + . + + + This . + + + + Request to write a message via this . + This method will not request to actual flush, so be sure to call + once you want to request to flush all pending data to the actual transport. + + An await-able task. + + + + Request to flush all pending messages. + + This . + + + + Shortcut for calling both and . + + + + + specialized to handle I/O operations of assigned s. + + + + + Parent . + + + + + + specialized for handling s. + + + + + Returns list of owned event loops. + + + + + Returns one of owned event loops. + + + + + Register the for this event loop. + + The to register. + The register task. + + + + that limits the number of read operations that will be attempted when a read + operation + is attempted by the event loop. + + + + + Gets or sets the maximum number of messages to read per read loop. + If this value is greater than 1, an event loop might attempt to read multiple times to procure multiple messages. + + + + + Creates a new handle. The handle provides the actual operations. + + + + + Calculates the size of the given message. + + The message for which the size should be calculated. + The size in bytes. The returned size must be >= 0 + + + + Allocates a new receive buffer whose capacity is probably large enough to read all inbound data and small enough + not to waste its space. + + + + + Creates a new handle. The handle provides the actual operations and keeps the internal information which is + required for predicting an optimal buffer capacity. + + + + + Creates a new receive buffer whose capacity is probably large enough to read all inbound data and small + enough not to waste its space. + + + + + Similar to except that it does not allocate anything but just tells the + capacity. + + + + + Reset any counters that have accumulated and recommend how many messages/bytes should be read for the next + read loop. +

+ This may be used by to determine if the read operation should complete. +

+ This is only ever a hint and may be ignored by the implementation. +
+ The channel configuration which may impact this object's behavior. +
+ + Increment the number of messages that have been read for the current read loop. + The amount to increment by. + + + + Get or set the bytes that have been read for the last read operation. + This may be used to increment the number of bytes that have been read. + + + Returned value may be negative if an read error + occurs. If a negative value is seen it is expected to be return on the next set to + . A negative value will signal a termination condition enforced externally + to this class and is not required to be enforced in . + + + + Get or set how many bytes the read operation will (or did) attempt to read. + + + Determine if the current read loop should should continue. + true if the read loop should continue reading. false if the read loop is complete. + + + Signals read completion. + + + + A that accepts an incoming connection attempt and creates its child + s by accepting them. is a good example. + + + + + A for the local transport. + + + + + A for the local transport which allows in VM communication. + + + + + A factory method for s. Users may override it to create custom instances of s. + + An existing that will act as a peer for the new channel. + The newly created instance. + + + + backed by a set of instances. + + + + + + + + + + + + + Creates a new instance of . + + + Creates a new instance of . + + + Creates a new instance of . + + + Creates a new instance of . + + + + + + + + + + + + + A queue of write operations which are pending for later execution. It also updates the writability of the + associated (), so that the pending write operations are + also considered to determine the writability. + + + + + Returns true if there are no pending write operations left in this queue. + + + + + Returns the number of pending write operations. + + + + + Adds the given message to this . + + The message to add to the . + An await-able task. + + + + Removes all pending write operations, and fail them with the given . The messages + will be released via . + + The to fail with. + + + + Remove a pending write operation and fail it with the given . The message will be + released via . + + The to fail with. + + + + Removes all pending write operation and performs them via + + An await-able task. + + + + Removes a pending write operation and performs it via . + + An await-able task. + + + + Removes a pending write operation and releases it's message via + . + + + The of the pending write, or null if the queue is empty. + + + + + Return the current message, or null if the queue is empty. + + + + + Holds all meta-data and constructs the linked-list structure. + + + + + implementation based on . + + + + Creates a new instance of . + + + Creates a new instance of . + + + Creates a new instance of . + + + Creates a new instance of . + + + Creates a new instance of . + + + Creates a new instance of . + + + Creates a new instance of . + + + Creates a new instance of . + + + + + + + + + + base class for s that operate on bytes. + + + + Create a new instance + the parent by which this instance was created. May be null + the underlying on which it operates + + + + Reads bytes into the given and returns the number of bytes that were read. + + The to read bytes into. + The number of bytes that were read into the buffer. + + + + Writes bytes from the given to the underlying . + + The from which the bytes should be written. + The number of bytes that were written from the buffer. + + + + Set read pending to false. + + + + state before modification + + + PORT NOTE: matches behavior of NioEventLoop.processSelectedKey + + + + Finish connect + + + + + Read from underlying {@link SelectableChannel} + + + + + Connect to the remote peer + + + + + Finish the connect + + + + + base class for s that operate on messages. + + + + + Creates a new instance. + + The parent . Pass null if there's no parent. + The used by the for communication. + + + + Returns true if we should continue the write loop on a write error. + + + + + Reads messages into the given list and returns the amount which was read. + + The list into which message objects should be inserted. + The number of messages which were read. + + + + Writes a message to the underlying . + + The message to be written. + The destination channel buffer for the message. + true if the message was successfully written, otherwise false. + + + + Special event which will be fired and passed to the + methods once the input of an was shutdown and the + property returns true. + + + + + Singleton instance to use. + + + + + The default implementation. + + + + + Creates a new instance. + + + + + The default implementation. + + + + + A TCP/IP which accepts incoming TCP/IP connections. + + + + + A implementation which uses Socket-based implementation to accept new + connections. + + + + + Create a new instance + + + + + Create a new instance + + + + + Create a new instance using the given . + + + + + which uses Socket-based implementation. + + + + Create a new instance + + + Create a new instance + + + Create a new instance using the given . + + + Create a new instance + + the which created this instance or null if it was created by the + user + + the which will be used + + + + Marks the specified as success. If the + is done already, logs a message. + + The to complete. + The to use to log a failure message. + + + + Marks the specified as failure. If the + is done already, log a message. + + The to complete. + The to fail the with. + The to use to log a failure message. + +
+
diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Transport.xml.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Transport.xml.meta index fa202eb..0a47e42 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Transport.xml.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Transport.xml.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 312af1fcd31a2ef4a8ef4ed76e440da1 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 312af1fcd31a2ef4a8ef4ed76e440da1 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Unity.dll.mdb.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Unity.dll.mdb.meta index 82d5aac..4a0d707 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Unity.dll.mdb.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Unity.dll.mdb.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: cdb39fee38ded5b408550015cdae617b -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: cdb39fee38ded5b408550015cdae617b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Unity.dll.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Unity.dll.meta index fe4f3fa..be6c2e3 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Unity.dll.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Unity.dll.meta @@ -1,33 +1,33 @@ -fileFormatVersion: 2 -guid: 4db51436488319e45a2ca4dabf4edc99 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 4db51436488319e45a2ca4dabf4edc99 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Unity.pdb.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Unity.pdb.meta index 4f5c9d8..9473fab 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Unity.pdb.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Unity.pdb.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: ffb2d4af7be12054db81762b2d585887 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: ffb2d4af7be12054db81762b2d585887 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Unity.xml b/Runtime/csharp-kcp/Plugins/DotNetty.Unity.xml index dda424b..b82c3ca 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Unity.xml +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Unity.xml @@ -1,8 +1,8 @@ - - - - DotNetty.Unity - - - - + + + + DotNetty.Unity + + + + diff --git a/Runtime/csharp-kcp/Plugins/DotNetty.Unity.xml.meta b/Runtime/csharp-kcp/Plugins/DotNetty.Unity.xml.meta index bf6366e..1805ece 100644 --- a/Runtime/csharp-kcp/Plugins/DotNetty.Unity.xml.meta +++ b/Runtime/csharp-kcp/Plugins/DotNetty.Unity.xml.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 6957bfcee5d34ae4987f8c9817282acd -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 6957bfcee5d34ae4987f8c9817282acd +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/LICENSE.txt.meta b/Runtime/csharp-kcp/Plugins/LICENSE.txt.meta index abddea6..3e879d4 100644 --- a/Runtime/csharp-kcp/Plugins/LICENSE.txt.meta +++ b/Runtime/csharp-kcp/Plugins/LICENSE.txt.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 38df922502fef2a4d8e81048b1d7ef61 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 38df922502fef2a4d8e81048b1d7ef61 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/csharp-kcp/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta b/Runtime/csharp-kcp/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta index e40bae4..5447d3b 100644 --- a/Runtime/csharp-kcp/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta +++ b/Runtime/csharp-kcp/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta @@ -1,33 +1,33 @@ -fileFormatVersion: 2 -guid: 1b39c08ffc7e2004495f915f82d909ef -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 1b39c08ffc7e2004495f915f82d909ef +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: