93 lines
3.0 KiB
Plaintext
93 lines
3.0 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft Research Singularity
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// Note: Simple ping-pong test child app #1
|
|
//
|
|
|
|
using Microsoft.SingSharp;
|
|
using Microsoft.SingSharp.Runtime;
|
|
using Microsoft.Singularity;
|
|
using Microsoft.Singularity.Diagnostics.Contracts;
|
|
using Microsoft.Singularity.Channels;
|
|
using Microsoft.Singularity.Directory;
|
|
using Microsoft.Singularity.PingPong.Contracts;
|
|
using System;
|
|
using System.Diagnostics;
|
|
|
|
namespace Microsoft.Singularity.Applications
|
|
{
|
|
public class CPing
|
|
{
|
|
public static int Main(String[]! args)
|
|
{
|
|
int links = 0;
|
|
if (args.Length == 2) {
|
|
links = Int32.Parse(args[1]);
|
|
}
|
|
if (args.Length > 1 && links == 0) {
|
|
Console.WriteLine("Usage:\n" +
|
|
" ping [links]\n" +
|
|
"Summary\n" +
|
|
" Starts one cpong process and 'links' clink processes.");
|
|
return 1;
|
|
}
|
|
|
|
// Start up the pong process.
|
|
PongContract.Imp! pongImp;
|
|
PongContract.Exp! pongExp;
|
|
|
|
PongContract.NewChannel(out pongImp, out pongExp);
|
|
|
|
Console.WriteLine("CPing : Starting cpong.");
|
|
|
|
string[] cargs = new string[1];
|
|
cargs[0] = "CPong";
|
|
Process child = new Process(cargs, null, 1);
|
|
child.SetStartupEndpoint(0, (Endpoint * in ExHeap)pongExp);
|
|
child.Start();
|
|
|
|
// Start up each link process.
|
|
for (int i = 0; i < links; i++) {
|
|
PongContract.Imp! linkImp;
|
|
PongContract.Exp! linkExp;
|
|
|
|
PongContract.NewChannel(out linkImp, out linkExp);
|
|
|
|
Console.WriteLine("CPing : Starting clink[{0}].", i);
|
|
cargs = new string[2];
|
|
cargs[0] = "CLink";
|
|
cargs[1] = i.ToString();
|
|
|
|
child = new Process(cargs, null, 2);
|
|
child.SetStartupEndpoint(0, (Endpoint * in ExHeap)linkExp);
|
|
child.SetStartupEndpoint(1, (Endpoint * in ExHeap)pongImp);
|
|
child.Start();
|
|
|
|
pongImp = linkImp;
|
|
}
|
|
|
|
Console.WriteLine("CPing : Waiting for cpong.");
|
|
pongImp.RecvPongReady();
|
|
|
|
try {
|
|
for (int i = 1; i <= 5; ++i) {
|
|
int data = i * 1000;
|
|
Console.WriteLine("CPing : Ping({0}).", data);
|
|
pongImp.SendPing(data);
|
|
pongImp.RecvPong(out data);
|
|
Console.WriteLine("CPing : Pong({0}).", data);
|
|
}
|
|
Console.WriteLine("CPing : Finished.");
|
|
return 0;
|
|
}
|
|
finally {
|
|
delete pongImp;
|
|
}
|
|
return 1;
|
|
}
|
|
}
|
|
}
|