Skip to content

Instantly share code, notes, and snippets.

@Drawaes
Created March 31, 2020 23:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Drawaes/c95f59ac6590fa6e6d11f7f5457ace8b to your computer and use it in GitHub Desktop.
Save Drawaes/c95f59ac6590fa6e6d11f7f5457ace8b to your computer and use it in GitHub Desktop.
Log Interface
using System;
using System.Threading.Channels;
using System.Threading.Tasks;
using System.Threading.Tasks.Sources;
namespace RockR.Storage
{
public class WriteAheadLog
{
private Channel<QueueItem> _workQueue = Channel.CreateUnbounded<QueueItem>(new System.Threading.Channels.UnboundedChannelOptions()
{
SingleReader = true,
SingleWriter = false,
AllowSynchronousContinuations = false,
});
private ChannelWriter<QueueItem> Writer => _workQueue.Writer;
public ValueTask LogDataWaitForQueuedAsync(ReadOnlyMemory<byte> data)
{
var queueItem = new QueueItem() { Memory = data };
return Writer.WriteAsync(queueItem);
}
public ValueTask LogDataWaitForCommitAsync(ReadOnlyMemory<byte> data)
{
var taskReset = new ValueTaskSource();
var queueItem = new QueueItem() { Memory = data, Source = taskReset };
if(Writer.TryWrite(queueItem))
{
return new ValueTask(taskReset, 0);
}
return new ValueTask(LoadDataWaitForQueuedAsync(queueItem));
async Task LoadDataWaitForQueuedAsync(QueueItem queueItem)
{
await Writer.WriteAsync(queueItem);
await (new ValueTask(queueItem.Source, 0));
}
}
private struct QueueItem
{
public ReadOnlyMemory<byte> Memory;
public ValueTaskSource Source;
}
private class ValueTaskSource : IValueTaskSource
{
private ManualResetValueTaskSourceCore<bool> _source = new ManualResetValueTaskSourceCore<bool>();
public void GetResult(short token)
{
}
public ValueTaskSourceStatus GetStatus(short token)
{
throw new NotImplementedException();
}
public void OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags)
{
throw new NotImplementedException();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment