Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 497 → Rev 496

/shark/trunk/tracer/include/FTrace_types.h
File deleted
/shark/trunk/tracer/include/FTrace_chunk.h
File deleted
/shark/trunk/tracer/include/FTrace_OSD.h
File deleted
/shark/trunk/tracer/include/tracer.h
62,18 → 62,128
#include <ll/sys/types.h>
#include <ll/i386/hw-instr.h>
#include "FTrace.h"
#include "FTrace_chunk.h"
#include "FTrace_OSD.h"
 
#define TRACER_NO_OUTPUT 0x00
#define TRACER_UDP_OUTPUT 0x01
#define TRACER_NO_OUTPUT 0
#define TRACER_UDP_OUTPUT 1
 
#define TRACER_LOGEVENT FTrace_safe_ipoint
#define FAST_TRACER_LOGEVENT FTrace_unsafe_ipoint
#define TRACER_LOGEVENT fast_logevent
 
void FTrace_unsafe_ipoint(BYTE type, BYTE flags, DWORD par1, DWORD par2);
void FTrace_safe_ipoint(BYTE type, BYTE flags, DWORD par1, DWORD par2);
int tracer_initialize(int MemorySize);
void tracer_enable();
void tracer_disable();
void tracer_print_statistics();
 
int tracer_send_logged_events(int NumberOfEvents);
void tracer_flush_sent_events();
 
//UDP
 
int tracer_init_udp(int flag, char *local_ip, char *target_ip);
int tracer_create_udp_task(void *m, int EventsForPeriod);
 
#define TRACER_SERIALIZE
 
/* Save bytes => 1(type) + 4(tsc_high) + 4(tsc_low) + 1(size)
if (flag & 1) + 4(par1)
if (flag & 3) + 4(par2)
* Return 0 -> Success
* Return 1 -> Inactive
* Return 2 -> Error
*/
extern __inline__ int fast_logevent(BYTE type, BYTE flag, DWORD par1, DWORD par2)
{
 
extern void *StartTracerBuffer;
extern void *EndTracerBuffer;
extern void *LastBeforeEndTracerBuffer;
extern void *CurrentTracerBuffer;
extern void *FirstTracerBuffer;
 
extern int TracerActive;
extern unsigned long long TracerEventsRecorded;
extern unsigned int TracerEventsPresent;
 
SYS_FLAGS f;
 
DWORD tsc_low, tsc_high;
BYTE size = 10;
 
f = ll_fsave();
 
if (!TracerActive) {
ll_frestore(f);
return 1;
}
 
#ifdef TRACER_SERIALIZE
__asm__("xorl %%eax,%%eax\n\t"
"cpuid\n\t"
"rdtsc\n\t"
:"=a" (tsc_low), "=d" (tsc_high)
:
:"ebx","ecx");
#else
__asm__("rdtsc\n\t"
:"=a" (tsc_low), "=d" (tsc_high)
::);
#endif
 
if (flag & 1) size += 4;
if (flag & 2) size += 4;
 
// Adjust FirstTracerBuffer
if (FirstTracerBuffer >= CurrentTracerBuffer && TracerEventsPresent != 0) {
while ((CurrentTracerBuffer + size - 1) >= FirstTracerBuffer &&
FirstTracerBuffer != StartTracerBuffer) {
FirstTracerBuffer += *(BYTE *)(FirstTracerBuffer + 9);
if (FirstTracerBuffer >= LastBeforeEndTracerBuffer) FirstTracerBuffer = StartTracerBuffer;
}
} else {
TracerEventsPresent++;
}
 
// Check if we overcome EndTracerBuffer
if ((CurrentTracerBuffer + size - 1) > EndTracerBuffer) {
//Cyclical Buffer implementation
LastBeforeEndTracerBuffer = CurrentTracerBuffer;
CurrentTracerBuffer = StartTracerBuffer;
//Set the First Event
while ((CurrentTracerBuffer + size - 1) >= FirstTracerBuffer) {
FirstTracerBuffer += *(BYTE *)(FirstTracerBuffer + 9);
if (FirstTracerBuffer >= LastBeforeEndTracerBuffer) FirstTracerBuffer = StartTracerBuffer;
}
}
 
// Add the new event
*(BYTE *)CurrentTracerBuffer = type;
CurrentTracerBuffer++;
*(DWORD *)(CurrentTracerBuffer) = tsc_high;
CurrentTracerBuffer+=4;
*(DWORD *)(CurrentTracerBuffer) = tsc_low;
CurrentTracerBuffer+=4;
*(BYTE *)(CurrentTracerBuffer) = size;
CurrentTracerBuffer++;
if (flag & 1) {
*(DWORD *)(CurrentTracerBuffer) = par1;
CurrentTracerBuffer+=4;
}
if (flag & 2) {
*(DWORD *)(CurrentTracerBuffer) = par2;
CurrentTracerBuffer+=4;
}
if (CurrentTracerBuffer > EndTracerBuffer) {
ll_frestore(f);
return 2;
}
 
TracerEventsRecorded++;
 
ll_frestore(f);
return 0;
 
}
 
#else
 
#include "FTrace.h"