97 lines
5.5 KiB
C++
97 lines
5.5 KiB
C++
![]() |
/*
|
||
|
** Command & Conquer Red Alert(tm)
|
||
|
** Copyright 2025 Electronic Arts Inc.
|
||
|
**
|
||
|
** This program is free software: you can redistribute it and/or modify
|
||
|
** it under the terms of the GNU General Public License as published by
|
||
|
** the Free Software Foundation, either version 3 of the License, or
|
||
|
** (at your option) any later version.
|
||
|
**
|
||
|
** This program is distributed in the hope that it will be useful,
|
||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
** GNU General Public License for more details.
|
||
|
**
|
||
|
** You should have received a copy of the GNU General Public License
|
||
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||
|
***********************************************************************************************
|
||
|
* *
|
||
|
* Project Name : Library profiler *
|
||
|
* *
|
||
|
* File Name : PROFILE.CPP *
|
||
|
* *
|
||
|
* Programmer : Steve Tall *
|
||
|
* *
|
||
|
* Start Date : 11/17/95 *
|
||
|
* *
|
||
|
* Last Update : November 20th 1995 [ST] *
|
||
|
* *
|
||
|
*---------------------------------------------------------------------------------------------*
|
||
|
* Overview: *
|
||
|
* The profiler works by using the function prologue and epilogue hooks available in Watcom *
|
||
|
* to register the current functions address in a global variable and then sampling the *
|
||
|
* contents of the variable using a windows timer which runs at up to 1000 samples per second. *
|
||
|
* *
|
||
|
* Compile the code to be sampled with the -ep and -ee flags to enable the prologue (__PRO) *
|
||
|
* and epilogue (__EPI) calls to be generated. *
|
||
|
* At the beginning of the section to be profiled (just before main loop normally) call the *
|
||
|
* Start_Profiler function to start sampling. At the end of the section, call Stop_Profiler *
|
||
|
* which will stop the timer and write the profile data to disk in the PROFILE.BIN file. *
|
||
|
* Use *
|
||
|
* *
|
||
|
*---------------------------------------------------------------------------------------------*
|
||
|
* *
|
||
|
* Functions: *
|
||
|
* Start_Profiler -- initialises the profiler data and starts gathering data *
|
||
|
* Stop_Profiler -- stops the timer and writes the profile data to disk *
|
||
|
* *
|
||
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||
|
|
||
|
#define WIN32
|
||
|
#ifndef _WIN32 // Denzil 6/2/98 Watcom 11.0 complains without this check
|
||
|
#define _WIN32
|
||
|
#endif // _WIN32
|
||
|
#include <windows.h>
|
||
|
#include <windowsx.h>
|
||
|
|
||
|
#include <wwstd.h>
|
||
|
#include <rawfile.h>
|
||
|
#include <file.h>
|
||
|
#include "profile.h"
|
||
|
|
||
|
extern "C"{
|
||
|
unsigned ProfileList [PROFILE_RATE*60*MAX_PROFILE_TIME];
|
||
|
unsigned ProfilePtr;
|
||
|
}
|
||
|
|
||
|
extern "C" void Profiler_Callback ( UINT, UINT , DWORD, DWORD, DWORD );
|
||
|
|
||
|
unsigned ProfilerEvent;
|
||
|
|
||
|
void Start_Profiler (void)
|
||
|
{
|
||
|
memset (&ProfileList[0],-1,PROFILE_RATE*60*MAX_PROFILE_TIME*4);
|
||
|
Copy_CHK();
|
||
|
ProfilerEvent = timeSetEvent (1000/PROFILE_RATE , 1 , (void CALLBACK (UINT,UINT,DWORD,DWORD,DWORD))Profiler_Callback , 0 , TIME_PERIODIC);
|
||
|
}
|
||
|
|
||
|
void Stop_Profiler (void)
|
||
|
{
|
||
|
if (ProfilerEvent){
|
||
|
timeKillEvent(ProfilerEvent);
|
||
|
ProfilerEvent=NULL;
|
||
|
|
||
|
int handle = Open_File ( "profile.bin" , WRITE );
|
||
|
if (handle != WW_ERROR){
|
||
|
Write_File (handle , &ProfileList[0] , ProfilePtr*4);
|
||
|
Close_File (handle);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|