72 lines
2.2 KiB
Plaintext
72 lines
2.2 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft Research Singularity
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// File: TulipEventRelay.sg
|
|
//
|
|
//
|
|
// Note: Right now this interface waits for acks from the receiver.
|
|
// This adds an unnecessary context switch. At some future point
|
|
// we may be able to have something more akin to a one-way single
|
|
// buffer-slot notification system, but for now we ack.
|
|
|
|
using Microsoft.SingSharp;
|
|
using Microsoft.Singularity;
|
|
using Microsoft.Singularity.Channels;
|
|
using Microsoft.Singularity.Io;
|
|
using Microsoft.Singularity.Io.Net;
|
|
using Microsoft.Singularity.Directory;
|
|
using Microsoft.Singularity.V1.Services;
|
|
|
|
using System;
|
|
using System.Threading;
|
|
|
|
namespace Microsoft.Singularity.Drivers.Network.Tulip
|
|
{
|
|
internal struct TulipEvent
|
|
{
|
|
internal const uint NoEvent = (uint) NicEventType.NoEvent;
|
|
internal const uint ReceiveEvent = (uint) NicEventType.ReceiveEvent;
|
|
internal const uint TransmitEvent = (uint) NicEventType.TransmitEvent;
|
|
internal const uint LinkEvent = (uint) NicEventType.LinkEvent;
|
|
}
|
|
|
|
internal class TulipEventRelay
|
|
{
|
|
TRef<NicDeviceEventContract.Exp:RUNNING>! channel;
|
|
bool channelClosed;
|
|
|
|
internal TulipEventRelay([Claims]
|
|
NicDeviceEventContract.Exp:READY! ep)
|
|
{
|
|
channel = new TRef<NicDeviceEventContract.Exp:RUNNING>(ep);
|
|
channelClosed = false;
|
|
}
|
|
|
|
internal void ForwardEvent(uint tulipEvent)
|
|
{
|
|
if (channelClosed)
|
|
{
|
|
return;
|
|
}
|
|
|
|
NicDeviceEventContract.Exp! exp = channel.Acquire();
|
|
exp.SendNicDeviceEvent((NicEventType)tulipEvent);
|
|
try
|
|
{
|
|
exp.RecvAckNicDeviceEvent();
|
|
}
|
|
catch (ChannelClosedException)
|
|
{
|
|
channelClosed = true;
|
|
}
|
|
finally
|
|
{
|
|
channel.Release(exp);
|
|
}
|
|
}
|
|
}
|
|
}
|