Auto status change to "Under Review"
@@ -0,0 +1,17 | |||||
|
1 | <?xml version="1.0"?> | |||
|
2 | <package > | |||
|
3 | <metadata> | |||
|
4 | <id>Implab</id> | |||
|
5 | <version>$version$</version> | |||
|
6 | <title>$title$</title> | |||
|
7 | <authors>Implab team</authors> | |||
|
8 | <owners>Implab team</owners> | |||
|
9 | <projectUrl>https://implab.org/</projectUrl> | |||
|
10 | <!-- <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl> --> | |||
|
11 | <requireLicenseAcceptance>false</requireLicenseAcceptance> | |||
|
12 | <description>Common components for asynchronous applications, tracing, logging, json and xml traits.</description> | |||
|
13 | <releaseNotes>Added strong name.</releaseNotes> | |||
|
14 | <copyright>Copyright 2017</copyright> | |||
|
15 | <tags>async xml json</tags> | |||
|
16 | </metadata> | |||
|
17 | </package> No newline at end of file |
1 | NO CONTENT: new file 100644, binary diff hidden |
|
NO CONTENT: new file 100644, binary diff hidden |
@@ -0,0 +1,22 | |||||
|
1 | Copyright 2012 Sergey Smirnov | |||
|
2 | ||||
|
3 | Redistribution and use in source and binary forms, with or without | |||
|
4 | modification, are permitted provided that the following conditions are met: | |||
|
5 | ||||
|
6 | 1. Redistributions of source code must retain the above copyright notice, this | |||
|
7 | list of conditions and the following disclaimer. | |||
|
8 | ||||
|
9 | 2. Redistributions in binary form must reproduce the above copyright notice, | |||
|
10 | this list of conditions and the following disclaimer in the documentation | |||
|
11 | and/or other materials provided with the distribution. | |||
|
12 | ||||
|
13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |||
|
14 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |||
|
15 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
|
16 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |||
|
17 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||
|
18 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||
|
19 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |||
|
20 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
|
21 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
|
22 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. No newline at end of file |
@@ -49,7 +49,6 namespace Implab.Playground { | |||||
49 | return actual != 0; |
|
49 | return actual != 0; | |
50 | } |
|
50 | } | |
51 |
|
51 | |||
52 | /* |
|
|||
53 | static void EnqueueRange<T>(AsyncQueue<T> q, T[] data, int offset, int len) { |
|
52 | static void EnqueueRange<T>(AsyncQueue<T> q, T[] data, int offset, int len) { | |
54 | for (var i = offset; i < offset + len; i++) |
|
53 | for (var i = offset; i < offset + len; i++) | |
55 | q.Enqueue(data[i]); |
|
54 | q.Enqueue(data[i]); | |
@@ -66,15 +65,15 namespace Implab.Playground { | |||||
66 | } |
|
65 | } | |
67 | return actual != 0; |
|
66 | return actual != 0; | |
68 | } |
|
67 | } | |
69 |
|
|
68 | ||
70 |
|
69 | |||
71 | static void EnqueueRange<T>(AsyncQueue<T> q, T[] data, int offset, int len) { |
|
70 | /*static void EnqueueRange<T>(AsyncQueue<T> q, T[] data, int offset, int len) { | |
72 | q.EnqueueRange(data, offset, len); |
|
71 | q.EnqueueRange(data, offset, len); | |
73 | } |
|
72 | } | |
74 |
|
|
73 | ||
75 | static bool TryDequeueRange<T>(AsyncQueue<T> q, T[] buffer, int offset, int len, out int actual) { |
|
74 | static bool TryDequeueRange<T>(AsyncQueue<T> q, T[] buffer, int offset, int len, out int actual) { | |
76 | return q.TryDequeueRange(buffer, offset, len, out actual); |
|
75 | return q.TryDequeueRange(buffer, offset, len, out actual); | |
77 |
|
|
76 | }*/ | |
78 |
|
77 | |||
79 |
|
78 | |||
80 | static void Main(string[] args) { |
|
79 | static void Main(string[] args) { |
@@ -67,6 +67,12 | |||||
67 | <WarningLevel>4</WarningLevel> |
|
67 | <WarningLevel>4</WarningLevel> | |
68 | <ConsolePause>false</ConsolePause> |
|
68 | <ConsolePause>false</ConsolePause> | |
69 | </PropertyGroup> |
|
69 | </PropertyGroup> | |
|
70 | <PropertyGroup> | |||
|
71 | <SignAssembly>true</SignAssembly> | |||
|
72 | </PropertyGroup> | |||
|
73 | <PropertyGroup> | |||
|
74 | <AssemblyOriginatorKeyFile>implab.snk</AssemblyOriginatorKeyFile> | |||
|
75 | </PropertyGroup> | |||
70 | <ItemGroup> |
|
76 | <ItemGroup> | |
71 | <Reference Include="System" /> |
|
77 | <Reference Include="System" /> | |
72 | <Reference Include="System.Xml" /> |
|
78 | <Reference Include="System.Xml" /> | |
@@ -207,7 +213,12 | |||||
207 | <Compile Include="Xml\XmlNameContext.cs" /> |
|
213 | <Compile Include="Xml\XmlNameContext.cs" /> | |
208 | </ItemGroup> |
|
214 | </ItemGroup> | |
209 | <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> |
|
215 | <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> | |
210 |
<ItemGroup |
|
216 | <ItemGroup> | |
|
217 | <None Include="Implab.nuspec"> | |||
|
218 | <SubType>Designer</SubType> | |||
|
219 | </None> | |||
|
220 | <None Include="implab.snk" /> | |||
|
221 | </ItemGroup> | |||
211 | <ProjectExtensions> |
|
222 | <ProjectExtensions> | |
212 | <MonoDevelop> |
|
223 | <MonoDevelop> | |
213 | <Properties> |
|
224 | <Properties> | |
@@ -279,5 +290,7 | |||||
279 | </Properties> |
|
290 | </Properties> | |
280 | </MonoDevelop> |
|
291 | </MonoDevelop> | |
281 | </ProjectExtensions> |
|
292 | </ProjectExtensions> | |
282 |
<ItemGroup |
|
293 | <ItemGroup> | |
|
294 | <Content Include="license.txt" /> | |||
|
295 | </ItemGroup> | |||
283 | </Project> No newline at end of file |
|
296 | </Project> |
@@ -3,6 +3,7 using System.Collections.Generic; | |||||
3 | using System; |
|
3 | using System; | |
4 | using System.Collections; |
|
4 | using System.Collections; | |
5 | using System.Diagnostics; |
|
5 | using System.Diagnostics; | |
|
6 | using System.Runtime.CompilerServices; | |||
6 |
|
7 | |||
7 | namespace Implab.Parallels { |
|
8 | namespace Implab.Parallels { | |
8 | public class AsyncQueue<T> : IEnumerable<T> { |
|
9 | public class AsyncQueue<T> : IEnumerable<T> { | |
@@ -51,6 +52,16 namespace Implab.Parallels { | |||||
51 | get { return m_size; } |
|
52 | get { return m_size; } | |
52 | } |
|
53 | } | |
53 |
|
54 | |||
|
55 | [MethodImpl(MethodImplOptions.AggressiveInlining)] | |||
|
56 | void AwaitWrites(int mark) { | |||
|
57 | if (m_hi != mark) { | |||
|
58 | SpinWait spin = new SpinWait(); | |||
|
59 | do { | |||
|
60 | spin.SpinOnce(); | |||
|
61 | } while (m_hi != mark); | |||
|
62 | } | |||
|
63 | } | |||
|
64 | ||||
54 | public bool TryEnqueue(T value) { |
|
65 | public bool TryEnqueue(T value) { | |
55 | int alloc; |
|
66 | int alloc; | |
56 | do { |
|
67 | do { | |
@@ -61,12 +72,7 namespace Implab.Parallels { | |||||
61 |
|
72 | |||
62 | m_data[alloc] = value; |
|
73 | m_data[alloc] = value; | |
63 |
|
74 | |||
64 |
|
|
75 | AwaitWrites(alloc); | |
65 | // m_hi is volatile |
|
|||
66 | while (alloc != m_hi) { |
|
|||
67 | // spin wait for commit |
|
|||
68 | spin.SpinOnce(); |
|
|||
69 | } |
|
|||
70 | m_hi = alloc + 1; |
|
76 | m_hi = alloc + 1; | |
71 |
|
77 | |||
72 | return true; |
|
78 | return true; | |
@@ -77,10 +83,7 namespace Implab.Parallels { | |||||
77 | /// </summary> |
|
83 | /// </summary> | |
78 | public void Seal() { |
|
84 | public void Seal() { | |
79 | var actual = Math.Min(Interlocked.Exchange(ref m_alloc, m_size), m_size); |
|
85 | var actual = Math.Min(Interlocked.Exchange(ref m_alloc, m_size), m_size); | |
80 |
|
|
86 | AwaitWrites(actual); | |
81 | while (m_hi != actual) { |
|
|||
82 | spin.SpinOnce(); |
|
|||
83 | } |
|
|||
84 | } |
|
87 | } | |
85 |
|
88 | |||
86 | public bool TryDequeue(out T value, out bool recycle) { |
|
89 | public bool TryDequeue(out T value, out bool recycle) { | |
@@ -114,11 +117,7 namespace Implab.Parallels { | |||||
114 |
|
117 | |||
115 | Array.Copy(batch, offset, m_data, alloc, enqueued); |
|
118 | Array.Copy(batch, offset, m_data, alloc, enqueued); | |
116 |
|
119 | |||
117 |
|
|
120 | AwaitWrites(alloc); | |
118 | while (alloc != m_hi) { |
|
|||
119 | spin.SpinOnce(); |
|
|||
120 | } |
|
|||
121 |
|
||||
122 | m_hi = alloc + enqueued; |
|
121 | m_hi = alloc + enqueued; | |
123 | return true; |
|
122 | return true; | |
124 | } |
|
123 | } | |
@@ -361,9 +360,7 namespace Implab.Parallels { | |||||
361 | } |
|
360 | } | |
362 |
|
361 | |||
363 | public List<T> Drain() { |
|
362 | public List<T> Drain() { | |
364 | // start the new queue |
|
363 | Chunk chunk = null; | |
365 | var chunk = new Chunk(DEFAULT_CHUNK_SIZE); |
|
|||
366 |
|
||||
367 | do { |
|
364 | do { | |
368 | var first = m_first; |
|
365 | var first = m_first; | |
369 | // first.next is volatile |
|
366 | // first.next is volatile | |
@@ -374,6 +371,10 namespace Implab.Parallels { | |||||
374 | return new List<T>(); |
|
371 | return new List<T>(); | |
375 | } |
|
372 | } | |
376 |
|
373 | |||
|
374 | // start the new queue | |||
|
375 | if (chunk == null) | |||
|
376 | chunk = new Chunk(DEFAULT_CHUNK_SIZE); | |||
|
377 | ||||
377 | // here we will create inconsistency which will force others to spin |
|
378 | // here we will create inconsistency which will force others to spin | |
378 | // and prevent from fetching. chunk.next = null |
|
379 | // and prevent from fetching. chunk.next = null | |
379 | if (first != Interlocked.CompareExchange(ref m_first, chunk, first)) |
|
380 | if (first != Interlocked.CompareExchange(ref m_first, chunk, first)) |
@@ -1,5 +1,4 | |||||
1 | using System.Reflection; |
|
1 | using System.Reflection; | |
2 | using System.Runtime.CompilerServices; |
|
|||
3 | using System.Runtime.InteropServices; |
|
2 | using System.Runtime.InteropServices; | |
4 |
|
3 | |||
5 | // Information about this assembly is defined by the following attributes. |
|
4 | // Information about this assembly is defined by the following attributes. | |
@@ -7,11 +6,9 using System.Runtime.InteropServices; | |||||
7 |
|
6 | |||
8 | [assembly: AssemblyTitle("Implab")] |
|
7 | [assembly: AssemblyTitle("Implab")] | |
9 | [assembly: AssemblyDescription("Tools")] |
|
8 | [assembly: AssemblyDescription("Tools")] | |
10 |
[assembly: AssemblyCo |
|
9 | [assembly: AssemblyCompany("Implab.org")] | |
11 | [assembly: AssemblyCompany("")] |
|
|||
12 | [assembly: AssemblyProduct("")] |
|
|||
13 | [assembly: AssemblyCopyright("Implab")] |
|
10 | [assembly: AssemblyCopyright("Implab")] | |
14 | [assembly: AssemblyTrademark("")] |
|
11 | [assembly: AssemblyTrademark("Implab")] | |
15 | // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". |
|
12 | // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". | |
16 | // The form "{Major}.{Minor}.*" will automatically update the build and revision, |
|
13 | // The form "{Major}.{Minor}.*" will automatically update the build and revision, | |
17 | // and "{Major}.{Minor}.{Build}.*" will update just the revision. |
|
14 | // and "{Major}.{Minor}.{Build}.*" will update just the revision. |
General Comments 3
ok, latest stable version should be in default
You need to be logged in to leave comments.
Login now