using System; using System.Collections.Generic; using System.Linq; using System.Text; using Cosmos.Kernel.API; using Cosmos.Kernel.Dispatch; namespace Cosmos.Kernel.MM { /// /// Memory manager /// /// Fascade class to make it easy to use MM , note only thing exposed /// /// Note can easily replace entire MM /// /// TODO put in a seperate Assembly /// TODO if context swithc cheap run in its own thread /// public class MemoryManagerService : Service { private event EventHandler> memoryPressureChanged; //event static IMessageEndPoint instance; private MemoryManagerService() { var mm = new MemoryManager(); mm.PagingManager.MemoryPressureChanged += new EventHandler>(OnMemoryPressureChanged); instance = mm; messageReceived += new EventHandler(MemoryManagerService_messageReceived); } void MemoryManagerService_messageReceived(object sender, EventArgs e) { var message = InputQueue.Dequeue(); instance.Send(message); } /// /// Internal so only can be set from Kernel /// /// If make public need to add some security /// internal static IMessageEndPoint SetCustomMM { set { MemoryManagerService.instance = value; } } protected void OnMemoryPressureChanged(object sender, EventArgs args) { if (memoryPressureChanged != null) memoryPressureChanged(sender, args); } event EventHandler> MemoryPressureChanged { add { memoryPressureChanged += value; } remove { memoryPressureChanged -= value; } } } }