Скачиваний:
21
Добавлен:
01.05.2014
Размер:
11.53 Кб
Скачать
/* -------------------------------------------------------------------- */
/*                                                                      */
/* 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 --- */
Соседние файлы в папке Sources