Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №3 / Sources / SAMPLER
.CPP/* -------------------------------------------------------------------- */
/* */
/* FILE : sampler.h */
/* */
/* DESC : Head file for sampler routine. */
/* */
/* PROJ : CSA\sampler. */
/* */
/* CREATED 16.02.98 19:55 by L&M. */
/* MODIFIED 05.02.99 13:28 by A.V. */
/* */
/* 1995-98 (c) by Leonid Moiseichuk */
/* -------------------------------------------------------------------- */
/* ==========================[ includes ]============================== */
#include <ctype.h>
#include <conio.h>
#ifndef __DOS_H
#include <Dos.h>
#endif
#ifndef __STDIO_H
#include <StdIO.h>
#endif
#ifndef __STRING_H
#include <String.h>
#endif
#ifndef __PROCESS_H
#include <Process.h>
#endif
#ifndef __STDLIB_H
#include <StdLib.h>
#endif
#ifndef __MATH_H
#include <Math.h>
#endif
#ifndef __BIOS_H
#include <bios.h>
#endif
#ifndef __trap_h
#include "trap.h"
#endif
#ifndef __sdata_h
#include "SData.h"
#endif
#ifndef __timer_h
#include "timer.h"
#endif
#define NSAMPLER
#include "Sampler.h"
#include <windows.h> //IV
extern unsigned _stklen = 0x1000 ;
class SamplerTrap : public Trap
{
public :
SamplerTrap(int, CallsHandler* );
virtual ~SamplerTrap() {}
virtual int InterruptHandler();
protected :
CallsHandler* Handler ;
/* Переменные задания времени */
TIME tmEnter ; /* время момента входа в функцию измерения */
TIME tmEscape; /* время момента выхода из функции измерения */
public :
TIME TrueTime () const ;
void TrueTime(TIME);
Tscl CorrScale () const;
void CorrScale (Tscl Scale);
int UsedInterrupt ;
}; // Class SamplerTrap
SamplerTrap :: SamplerTrap( int nVect, CallsHandler* handler )
: Trap(nVect), Handler(handler)
{
tmEnter = tmEscape = NTIME ;
UsedInterrupt = 0;
}
inline void SamplerTrap :: TrueTime (TIME tmTrue)
{
if (Handler) Handler->TrueTime(tmTrue);
}
TIME SamplerTrap :: TrueTime () const
{
return ( Handler ? Handler->TrueTime() : 0ul) ;
}
inline void SamplerTrap :: CorrScale (Tscl Scale)
{
if (Handler) Handler->CorrScale (Scale);
}
Tscl SamplerTrap :: CorrScale () const
{
return ( Handler ? Handler->CorrScale () : 0) ;
}
int SamplerTrap :: InterruptHandler()
{
PSamplerMessage pMsg = __CAST(PSamplerMessage, MK_FP(di,si)) ;
// Проверка на корректный указатель
if ( !(pMsg && pMsg -> m_Code == SamplerUniqueCode) )
{
UsedInterrupt = 1 ;
return 0 ;
}
// Обработка измерительного сообщения
if ( pMsg->m_What == scmdMeasure && pMsg->m_Size == sizeof(TmsgMeasure) )
{
// обрабатываем измерение
TmsgMeasure far* msg = __CAST(TmsgMeasure far*,pMsg);
Handler->Handle (msg->m_Time,msg->m_File,msg->m_Line);
msg->m_Code = ~sMAGIC ;
return 1 ;
}
// Обработка сообщения времени коррекции
if ( pMsg->m_What == scmdPrecise && pMsg->m_Size == sizeof(TmsgPrecise))
{
// задаем время коррекции на вызов функции измерения
TrueTime (__CAST(TmsgPrecise far*,pMsg)->m_Time);
pMsg->m_Code = ~sMAGIC ;
return 1 ;
}
// Обработка сообщения запроса указателя времени входа функции измерения
if ( pMsg->m_What == scmdEnterTime && pMsg->m_Size == sizeof(TmsgEnterTime))
{
__CAST(TmsgEnterTime far*,pMsg) -> p_Time = __CAST(LPTIME,&tmEnter);
pMsg->m_Code = ~sMAGIC ;
return 1 ;
}
// Обработка сообщения запроса указателя времени выхода функции измерения
if ( pMsg->m_What == scmdEscapeTime && pMsg->m_Size == sizeof(TmsgEscapeTime))
{
__CAST(TmsgEscapeTime far*,pMsg) -> p_Time = __CAST(LPTIME,&tmEscape);
pMsg->m_Code = ~sMAGIC ;
return 1 ;
}
// Обработка сообщения запроса соответствия версии
if ( pMsg->m_What == scmdVersion && pMsg->m_Size == sizeof(TmsgVersion))
{
TmsgVersion far* ver = __CAST(TmsgVersion far*,pMsg);
if (stricmp(ver->m_Version,sVERSION) > 0) // SAMPLER too old
ver->m_Version = NULL ;
pMsg->m_Code = ~sMAGIC ;
return 1 ;
}
// Обработка сообщения масштаба коррекции
if ( pMsg->m_What == scmdScale && pMsg->m_Size == sizeof(TmsgScale))
{
// задаем время коррекции на вызов функции измерения
CorrScale (__CAST(TmsgScale far*,pMsg)->m_Scale);
pMsg->m_Code = ~sMAGIC ;
return 1 ;
}
return 0 ; // Error in use
} // InterruptHandler
class Sampler
{
public :
Sampler( int nVectInt );
int Run();
~Sampler();
private :
int nVect ;
CallsHandler Handler;
}; // Class Sampler
Sampler :: Sampler( int nV )
: nVect( nV )
{
printf ( "\n\tПрограмма Sampler запущена." );
printf ( "\n\tВы пользуетесь версией программы от %s (%s).",__DATE__,__TIME__ );
printf ( "\n\t1995-98 (c) СПбГЭТУ, Мойсейчук Леонид." );
printf ( "\n\t2006 (c) СПбГЭТУ, Рыжов Иван (МОДЕРНИЗАЦИЯ).\n" );
} // Sampler
Sampler :: ~Sampler()
{
puts( "\nHave a nice WINDOWS!" );
} // ~Sampler
static char* ForceExt(const char* szSrc,const char* szExt,char* szDst)
{
char* pszDot ;
strcpy(szDst,szSrc);
pszDot = strrchr(szDst,'.');
if (pszDot)
strcpy(pszDot,szExt);
else
strcat(szDst, szExt);
return szDst ;
} /* ForceExt */
int Sampler :: Run()
{
/* SamplerTrap trap( nVect,&Handler );
__asm int 65h;
return 1; */
if ( _argc>1 )
{
if ( Handler != 1 )
{
puts("\n*** Нет свободной памяти для размещения таблицы трассировочных записей. ***");
return 1 ;
}
/* Переменные */
auto char AppPath[0x80];
auto char SmpPath[0x80];
auto char SmvPath[0x80];
auto char CsaPath[0x80];
SamplerTrap trap( nVect,&Handler );
// GO !!!
ForceExt(_argv[1],".exe",AppPath);
ForceExt(_argv[1],".smp",SmpPath);
ForceExt(_argv[1],".smv",SmvPath);
ForceExt(_argv[1],".xml",CsaPath);
printf( "\n\nПРОФИЛИРОВАНИЕ ПРОГРАММЫ %s С ИСПОЛЬЗОВАНИЕМ ПРЕРЫВАНИЯ %x ...",AppPath,nVect );
struct LOADPARMS {
WORD segEnv; // child environment
LPSTR lpszCmdLine; // child command tail
LPWORD lpwShow; // how to show child
LPWORD lpwReserved; // must be NULL
};
HINSTANCE hinstMod;
struct LOADPARMS parms;
WORD awShow[2] = { 2, SW_SHOWMINIMIZED };
parms.segEnv = 0; // child inherits environment
parms.lpszCmdLine = (LPSTR) ""; // no command line
parms.lpwShow = (LPWORD) awShow; // shows child as an icon
parms.lpwReserved = (LPWORD) NULL; // must be NULL
hinstMod = LoadModule(AppPath, &parms);
if ( (UINT) hinstMod < 32 )
{
printf ( "\n\n*** Ошибка : %s ***",sys_errlist[errno] );
return 1 ;
};
if ( trap.UsedInterrupt )
{
printf
(
"\n\n***\nНа данной машине прерывание %x занято."
"\nНе рекомендуется использовать занятые прерывания во избежание"
"\nконфликтов и некорректных результатов работы."
"\n\nИзмените значение SamplerInterrupt (Sampler.h) и перестройте Sampler."
"\n***\n" , nVect
);
return 1 ;
}
//IV Map probabilities
Handler.SamplerAccess->MapProbs();
// cout << "!!!" << Handler.SamplerAccess->At(0)->InArcs << "!!!";
// Обработка результатов
printf ( "\nУСТАНОВЛЕНО ВРЕМЯ КОРРЕКЦИИ %lu [минитиков] <==> %.2lf [микросекунд].", UINT32(trap.TrueTime()), TimeAsMicroSeconds(trap.TrueTime(),trap.CorrScale()) );
printf ("\nНАЖМИТЕ <Escape> ДЛЯ ЕГО ИЗМЕНЕНИЯ ИЛИ ЛЮБУЮ ДРУГУЮ КЛАВИШУ ДЛЯ ПРОДОЛЖЕНИЯ.");
int key = getch();
if ( key == 27 )
{
TIME tmNew ;
printf("\nНОВОЕ ВРЕМЯ КОРРЕКЦИИ [в минитиках] : ");
scanf("%lu", &tmNew);
trap.TrueTime(tmNew);
}
printf ( "\n\nИДЕТ ГЕНЕРАЦИЯ ФАЙЛА ОТЧЕТА ... " );
FILE* Stream = fopen(SmpPath,"wt");
if ( Stream )
{
Handler.Print(Stream,_argv[1]);
fclose( Stream );
printf ( "Ok." );
}
else
{
printf( "\n*** Не могу сбросить отчет в '%s' ***\n",SmpPath );
return 1 ;
}
printf( "\nИДЕТ ГЕНЕРАЦИЯ ФАЙЛА ГРАФА ... " );
Stream = fopen(SmvPath,"wb");
if ( Stream )
{
Handler.Put(Stream);
fclose( Stream );
printf ( "Ok." );
}
else
{
printf( "\n*** Не могу сбросить граф в '%s' ***\n",SmvPath );
return 1 ;
}
if (_argc > 2 ) //IV && _argv[2] == "-csa"
{
printf( "\nИДЕТ ГЕНЕРАЦИЯ ФАЙЛА CSA... " );
Stream = fopen(CsaPath,"wt");
if ( Stream )
{
Handler.PrintCSA(Stream, AppPath);
fclose( Stream );
printf ( "Ok." );
}
else
{
printf( "\n*** Не могу сбросить отчет в '%s' ***\n",CsaPath );
return 1 ;
}
}
return 0 ;
}
else
{
/* static const char szHelp [] =
{
#include "help.hex"
,char(0)
};
puts (szHelp);*/ //IV
printf("г======================================================================¬"
"\n¦ ПРОГРАММА SAMPLER ПРЕДНАЗНАЧЕНА ДЛЯ СНЯТИЯ ПРОФИЛЕЙ С ПРОГРАММ, ¦"
"\n¦ РАБОТАЮЩИХ ПОД ЕЕ МОНИТОРИНГОМ. ДЛЯ ИСПОЛЬЗОВАНИЯ SAMPLER'A ВЫ ¦"
"\n¦ ОБЯЗАНЫ ДОЛЖНЫМ ОБРАЗОМ ОФОРМИТЬ СВОЮ ПРОГРАММУ И ЗАПУСТИТЬ ЕЕ ПОД ¦"
"\n¦ УПРАВЛЕНИЕМ SAMPLER'A: ¦"
"\n¦ SAMPLER.EXE YOURPROG.EXE [ПАРАМ1...ПАРАМN] ¦"
"\n¦ ПОСЛЕ ОТРАБОТКИ ВАШЕЙ ПРОГРАММЫ ПОЯВИТСЯ ФАЙЛ YOURPROG.SMP СО ¦"
"\n¦ СНЯТЫМ ПРОФИЛЕМ. ДАННЫЙ ФАЙЛ ЯВЛЯЕТСЯ ТЕКСТОВЫМ И ДЛЯ ЕГО ¦"
"\n¦ ПРОСМОТРА МОЖНО ВОСПОЛЬЗОВАТЬСЯ ЛЮБЫМ ASCII-РЕДАКТОРОМ. ¦"
"\n¦ ¦"
"\n¦ ДАННАЯ ПРОГРАММА НАПИСАНА СПЕЦИАЛЬНО ДЛЯ КУРСА ЛАБОРАТОРНЫХ РАБОТ ¦"
"\n¦ ПРЕДМЕТА 'АНАЛИЗ ПРОИЗВОДИТЕЛЬНОСТИ ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ'. ¦"
"\n¦----------------------------------------------------------------------¦"
"\n¦ ПО ВОПРОСАМ ЕЕ ИСПОЛЬЗОВАНИЯ ОБРАЩАЙТЕСЬ ПО АДРЕСУ: ¦"
"\n¦ САНКТ-ПЕТЕРБУРГ, УЛ. ПРОФ.ПОПОВА 5, СПбГЭТУ, КАФЕДРА МОЭВМ ¦"
"\n¦ КИРЬЯНЧИКОВ ВЛАДИМИР АНДРЕЕВИЧ, МОЙСЕЙЧУК ЛЕОНИД ИЛИ РЫЖОВ ИВАН. ¦"
"\nL======================================================================-");
}
return 1;
} // Run
int main( int /* argc */, char* /* argv */[] )
{
Sampler sampler( SamplerInterrupt );
return sampler.Run();
} // int main
/* --- End of file Sampler.cpp --- */