singrdk/base/Kernel/Native/Monitoring.cpp

185 lines
5.7 KiB
C++

////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: Monitoring.cpp
//
// Note: Kernel & Process
//
#include "hal.h"
#include "eventing.h"
#define MONITORING_BUFFER_SIZE (6 * 1024 * 1024)
#define MONITORING_TEXT_SIZE (2 * 1024 * 1024)
UIntPtr MonitoringStorageHandle = 0;
PSOURCE_DESCRIPTOR MonitoringSource = NULL;
UIntPtr MonitoringTypeHandle = 0;
const UINT32 Monitoring_ControlFlag_Active = 0x00010000;
void
Class_Microsoft_Singularity_Monitoring::
g_Initialize()
{
#if SINGULARITY_KERNEL
g_InitPages((UIntPtr)(MONITORING_BUFFER_SIZE));
if (c_buffer != NULL) {
MonitoringStorageHandle = Class_Microsoft_Singularity_Eventing_MemoryStorage::
g_MemoryStorageCreateImpl(MEMORY_STORAGE_FLAGS_RECYCLE_MEMORY,
(uint8 *)c_buffer,
(uint32)MONITORING_BUFFER_SIZE,
0);
if (MonitoringStorageHandle) {
UIntPtr sourceHandle = RegisterNativeSource("Monitoring",
MonitoringStorageHandle,
Monitoring_ControlFlag_Active);
MonitoringSource = GetSourceFromHandle(sourceHandle);
}
}
#elif SINGULARITY_PROCESS
Struct_Microsoft_Singularity_V1_Services_ProcessService::
g_GetSharedSourceHandles(Class_Microsoft_Singularity_Eventing_Controller_MonitoringInfo,
&MonitoringStorageHandle,
(UIntPtr *)&MonitoringSource,
&MonitoringTypeHandle);
#else
#error "File should be compiled with SINGULARITY_KERNEL or SINGULARITY_PROCESS"
#endif
}
bool GetMonitoringHandles(UIntPtr * storageHandle,
UIntPtr * sourceHandle,
UIntPtr * eventTypeHandle)
{
*storageHandle = MonitoringStorageHandle;
*sourceHandle = (UIntPtr)MonitoringSource;
*eventTypeHandle = MonitoringTypeHandle;
return true;
}
bool __inline IsMonitoringEnabled()
{
return ((MonitoringSource != NULL) &&
(MonitoringSource->ControlFlags & Monitoring_ControlFlag_Active));
}
void Class_Microsoft_Singularity_Monitoring::
g_Log(uint16 provider, uint16 type)
{
if (IsMonitoringEnabled()) {
Struct_Microsoft_Singularity_ThreadContext *threadContext =
Class_Microsoft_Singularity_Processor::g_GetCurrentThreadContext();
MONITORING_ENTRY entry = {threadContext->processId, provider,type,0,0,0,0,0,0};
InternalLogFixedRecord(MonitoringStorageHandle,
MonitoringSource->ControlFlags,
MonitoringTypeHandle,
&entry,
sizeof(entry));
}
}
void Class_Microsoft_Singularity_Monitoring::
g_Log(uint16 provider, uint16 type, uint16 version,
uint32 a0, uint32 a1, uint32 a2, uint32 a3, uint32 a4)
{
if (IsMonitoringEnabled()) {
Struct_Microsoft_Singularity_ThreadContext *threadContext =
Class_Microsoft_Singularity_Processor::g_GetCurrentThreadContext();
MONITORING_ENTRY entry = {threadContext->processId, provider,type,version,a0,a1,a2,a3,a4};
InternalLogFixedRecord(MonitoringStorageHandle,
MonitoringSource->ControlFlags,
MonitoringTypeHandle,
&entry,
sizeof(entry));
}
}
void Class_Microsoft_Singularity_Monitoring::
g_Log(uint16 provider, uint16 type, Class_System_String *s)
{
if (IsMonitoringEnabled()) {
Struct_Microsoft_Singularity_ThreadContext *threadContext =
Class_Microsoft_Singularity_Processor::g_GetCurrentThreadContext();
MONITORING_ENTRY entry = {threadContext->processId, provider,type,0,0,0,0,0,0,1};
Struct_Microsoft_Singularity_Eventing_ArrayType array[] = {
{s->m_stringLength,
sizeof(char),
Class_Microsoft_Singularity_Eventing_DataType___string,
&s->m_firstChar}};
InternalLogVariableRecord(true,
MonitoringStorageHandle,
MonitoringSource->ControlFlags,
MonitoringTypeHandle,
&entry,
sizeof(entry),
sizeof(array)/sizeof(array[0]),
array);
}
}
bool Class_Microsoft_Singularity_Monitoring::
g_isActive()
{
return IsMonitoringEnabled();
}
void Class_Microsoft_Singularity_Monitoring::
g_setActive(bool active)
{
if (MonitoringSource != NULL) {
if (active) {
MonitoringSource->ControlFlags |= Monitoring_ControlFlag_Active;
} else {
MonitoringSource->ControlFlags &= ~Monitoring_ControlFlag_Active;
}
}
}
int Class_Microsoft_Singularity_Monitoring::
g_FillLogEntry(Struct_Microsoft_Singularity_Monitoring_LogEntry * log,
UINT64 * min_counter)
{
//
// TODO: impplement it to fix monnet
//
return 0;
}
int Class_Microsoft_Singularity_Monitoring::
g_FillTextEntry(uint8 * src, UINT64 counter, uint8 * dst, int max_size)
{
//
// TODO: impplement it to fix monnet
//
return 0;
}
//
///////////////////////////////////////////////////////////////// End of File.