core: Keep track of telemetry for the current emulation session.
This commit is contained in:
		@@ -174,6 +174,7 @@ set(SRCS
 | 
			
		||||
            memory.cpp
 | 
			
		||||
            perf_stats.cpp
 | 
			
		||||
            settings.cpp
 | 
			
		||||
            telemetry_session.cpp
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
set(HEADERS
 | 
			
		||||
@@ -366,6 +367,7 @@ set(HEADERS
 | 
			
		||||
            mmio.h
 | 
			
		||||
            perf_stats.h
 | 
			
		||||
            settings.h
 | 
			
		||||
            telemetry_session.h
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
include_directories(../../externals/dynarmic/include)
 | 
			
		||||
 
 | 
			
		||||
@@ -132,6 +132,8 @@ System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) {
 | 
			
		||||
        cpu_core = std::make_unique<ARM_DynCom>(USER32MODE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    telemetry_session = std::make_unique<Core::TelemetrySession>();
 | 
			
		||||
 | 
			
		||||
    CoreTiming::Init();
 | 
			
		||||
    HW::Init();
 | 
			
		||||
    Kernel::Init(system_mode);
 | 
			
		||||
@@ -162,6 +164,7 @@ void System::Shutdown() {
 | 
			
		||||
    CoreTiming::Shutdown();
 | 
			
		||||
    cpu_core = nullptr;
 | 
			
		||||
    app_loader = nullptr;
 | 
			
		||||
    telemetry_session = nullptr;
 | 
			
		||||
 | 
			
		||||
    LOG_DEBUG(Core, "Shutdown OK");
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "core/memory.h"
 | 
			
		||||
#include "core/perf_stats.h"
 | 
			
		||||
#include "core/telemetry_session.h"
 | 
			
		||||
 | 
			
		||||
class EmuWindow;
 | 
			
		||||
class ARM_Interface;
 | 
			
		||||
@@ -80,6 +81,14 @@ public:
 | 
			
		||||
        return cpu_core != nullptr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a reference to the telemetry session for this emulation session.
 | 
			
		||||
     * @returns Reference to the telemetry session.
 | 
			
		||||
     */
 | 
			
		||||
    Core::TelemetrySession& TelemetrySession() const {
 | 
			
		||||
        return *telemetry_session;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Prepare the core emulation for a reschedule
 | 
			
		||||
    void PrepareReschedule();
 | 
			
		||||
 | 
			
		||||
@@ -117,6 +126,9 @@ private:
 | 
			
		||||
    /// When true, signals that a reschedule should happen
 | 
			
		||||
    bool reschedule_pending{};
 | 
			
		||||
 | 
			
		||||
    /// Telemetry session for this emulation session
 | 
			
		||||
    std::unique_ptr<Core::TelemetrySession> telemetry_session;
 | 
			
		||||
 | 
			
		||||
    static System s_instance;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -124,4 +136,8 @@ inline ARM_Interface& CPU() {
 | 
			
		||||
    return System::GetInstance().CPU();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline TelemetrySession& Telemetry() {
 | 
			
		||||
    return System::GetInstance().TelemetrySession();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Core
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										24
									
								
								src/core/telemetry_session.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/core/telemetry_session.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
// Copyright 2017 Citra Emulator Project
 | 
			
		||||
// Licensed under GPLv2 or any later version
 | 
			
		||||
// Refer to the license.txt file included.
 | 
			
		||||
 | 
			
		||||
#include "common/scm_rev.h"
 | 
			
		||||
#include "core/telemetry_session.h"
 | 
			
		||||
 | 
			
		||||
namespace Core {
 | 
			
		||||
 | 
			
		||||
TelemetrySession::TelemetrySession() {
 | 
			
		||||
    // TODO(bunnei): Replace with a backend that logs to our web service
 | 
			
		||||
    backend = std::make_unique<Telemetry::NullVisitor>();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TelemetrySession::~TelemetrySession() {
 | 
			
		||||
    // Complete the session, submitting to web service if necessary
 | 
			
		||||
    // This is just a placeholder to wrap up the session once the core completes and this is
 | 
			
		||||
    // destroyed. This will be moved elsewhere once we are actually doing real I/O with the service.
 | 
			
		||||
    field_collection.Accept(*backend);
 | 
			
		||||
    backend->Complete();
 | 
			
		||||
    backend = nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Core
 | 
			
		||||
							
								
								
									
										38
									
								
								src/core/telemetry_session.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/core/telemetry_session.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
// Copyright 2017 Citra Emulator Project
 | 
			
		||||
// Licensed under GPLv2 or any later version
 | 
			
		||||
// Refer to the license.txt file included.
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include "common/telemetry.h"
 | 
			
		||||
 | 
			
		||||
namespace Core {
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Instruments telemetry for this emulation session. Creates a new set of telemetry fields on each
 | 
			
		||||
 * session, logging any one-time fields. Interfaces with the telemetry backend used for submitting
 | 
			
		||||
 * data to the web service. Submits session data on close.
 | 
			
		||||
 */
 | 
			
		||||
class TelemetrySession : NonCopyable {
 | 
			
		||||
public:
 | 
			
		||||
    TelemetrySession();
 | 
			
		||||
    ~TelemetrySession();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Wrapper around the Telemetry::FieldCollection::AddField method.
 | 
			
		||||
     * @param type Type of the field to add.
 | 
			
		||||
     * @param name Name of the field to add.
 | 
			
		||||
     * @param value Value for the field to add.
 | 
			
		||||
     */
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    void AddField(Telemetry::FieldType type, const char* name, T value) {
 | 
			
		||||
        field_collection.AddField(type, name, std::move(value));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    Telemetry::FieldCollection field_collection; ///< Field collection, tracks all added fields
 | 
			
		||||
    std::unique_ptr<Telemetry::VisitorInterface> backend; ///< Backend interface that logs fields
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace Core
 | 
			
		||||
		Reference in New Issue
	
	Block a user