Browse Source

Started work on hierarchical profiler for Linux.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7121 8c9fc860-2736-0410-a75d-ab315db34111
skoster 8 years ago
parent
commit
75e3e9b693
3 changed files with 162 additions and 147 deletions
  1. 147 145
      source/Generic.Linux.I386.Unix.Mod
  2. 14 2
      source/Generic.Unix.Objects.Mod
  3. 1 0
      source/HierarchicalProfiler.Mod

+ 147 - 145
source/Generic.Linux.I386.Unix.Mod

@@ -79,13 +79,13 @@ CONST
 
 	(* access modes *)
 	rwrwr* = {2, 4, 5, 7, 8};  rwxrwxrwx* = {0..8};
-	
+
 	F_OK* = {};  X_Ok* = {0};  W_OK* = {1};  R_OK* = {2};
 
 	SCHED_OTHER = 0;
 
 	T_SIGRESUME = SIGUSR1;
-	T_SIGSUSPEND = SIGUSR2; 
+	T_SIGSUSPEND = SIGUSR2;
 
 	SIGHUP = 1;
 	SIGINT = 2;
@@ -121,7 +121,7 @@ CONST
 	SIGPWR = 30;
 	SIGSYS = 31;
 	SIGUNUSED =31;
-	
+
 	SIG_BLOCK = 0;
 	SIG_UNBLOCK=1;
 	SIG_SETMASK=2;
@@ -132,7 +132,7 @@ CONST
 	SA_RESTART  =    0x10000000;
 	SA_NODEFER  =     0x40000000;
 	SA_RESETHAND  =  0x80000000;
-	
+
   PTHREAD_CANCEL_ENABLE 	= 0;
   PTHREAD_CANCEL_DISABLE	= 1;
 
@@ -144,7 +144,7 @@ CONST
 TYPE
 	Thread_t* = ADDRESS;
 	Mutex_t* = ADDRESS;
-	MutexType = ARRAY 8 OF ADDRESS; 
+	MutexType = ARRAY 8 OF ADDRESS;
 	(*
 	Mutex = ARRAY 8 OF ADDRESS;
 	Mutex_t* = POINTER TO Mutex;
@@ -152,15 +152,15 @@ TYPE
 	Condition_t* = ADDRESS;
 	ConditionType = ARRAY 12 OF WORD;
 
-	Sigset_t= ARRAY 32 OF ADDRESS; 
-	SignalHandler = PROCEDURE ( sig: LONGINT; scp, ucp, dum: ADDRESS );  
-	
+	Sigset_t= ARRAY 32 OF ADDRESS;
+	SignalHandler = PROCEDURE ( sig: LONGINT; scp, ucp, dum: ADDRESS );
+
 	MutexAttributeType = ARRAY 1 OF WORD;
 
-	
+
 CONST
 	(* Thread priorities *)
-	ThreadLow* = 1; ThreadNormal* = 20; ThreadHigh* = 99;	
+	ThreadLow* = 1; ThreadNormal* = 20; ThreadHigh* = 99;
 	NumPriorities* = 99;	(* number of priority levels *)
 
 
@@ -170,14 +170,14 @@ CONST
 	(* domain *)
 		AFINET* = 2;
 		AFINET6* = 26;
-		
+
 		PFINET* = AFINET;
 		PFINET6* = AFINET6;
-		
+
 	(* types of connection*)
 		SockStream*	= 1;
 		SockDGram*	= 2;
-		
+
 	(* Protocols *)
 		IpProtoUDP*	= 17;
 		IpProtoTCP*		=  6;
@@ -190,11 +190,11 @@ CONST
 
 	(* ioctl *)
 		FioNRead*		= 541BH;	(* something to read ? *)
-		
+
 	(* recv *)
 		MsgPeek*		= 2;
 		MsgDontWait*	= 40H;		(* non blocking read *)
-		
+
 	(* shutdown *)
 		ShutRDWR*	= 2;
 
@@ -202,34 +202,34 @@ CONST
 	SockAddrSizeV6*	= 28;
 
 	(*----------------------- seral line, cf Unix.V24.Mod -----------------------*)
-	
+
 	FIONREAD*	= 541BH;
 	TIOCMGET*		= 5415H;
 	TIOCMBIS*		= 5416H;
 	TIOCMBIC*		= 5417H;
 	TIOCMSET*		= 5418H;
-	
+
 	(* speeds *)
 	B0*	= 0;
 	B50*	= 1;
-	B75*	= 2; 
-	B110*	= 3; 
-	B134*	= 4; 
-	B150*	= 5; 
-	B200*	= 6; 
-	B300*	= 7; 
-	B600*	= 8; 
-	B1200* 	= 9; 
-	B1800* 	= 10; 
-	B2400* 	= 11; 
-	B4800* 	= 12; 
-	B9600* 	= 13; 
-	B19200*	= 14; 
-	B38400*	= 15; 
-
-	B57600* 	= 1001H; 
-	B115200*	= 1002H; 
-	B230400*	= 1003H; 
+	B75*	= 2;
+	B110*	= 3;
+	B134*	= 4;
+	B150*	= 5;
+	B200*	= 6;
+	B300*	= 7;
+	B600*	= 8;
+	B1200* 	= 9;
+	B1800* 	= 10;
+	B2400* 	= 11;
+	B4800* 	= 12;
+	B9600* 	= 13;
+	B19200*	= 14;
+	B38400*	= 15;
+
+	B57600* 	= 1001H;
+	B115200*	= 1002H;
+	B230400*	= 1003H;
 
 
 
@@ -245,7 +245,7 @@ CONST
 	PARODD*	= {9};
 	HUPCL*		= {10};
 	CLOCAL*	= {11};
-	
+
 	(*
 	PTRACE_TRACEME     =        0;
 	PTRACE_PEEKTEXT    =        1;
@@ -262,7 +262,7 @@ CONST
 	PTRACE_GETREGS  = 12;
 	PTRACE_SETREGS    = 13;
 	*)
-	
+
 TYPE
 	Termios* = RECORD
 		iflags*, oflags*, cflags*, lflags*: SET;
@@ -295,7 +295,7 @@ TYPE
 				ctime-	: Timeval;
 				unused-	: ARRAY 2 OF LONGINT;
 			END;
-
+	tvPtr* = POINTER TO Timeval;
 	Timeval* = RECORD
 				sec*	: LONGINT;
 				usec*	: LONGINT
@@ -322,7 +322,7 @@ TYPE
 
 CONST
 	FdSetLen* = 32;
-	
+
 TYPE
 	FdSet* = ARRAY FdSetLen OF SET;
 
@@ -383,15 +383,15 @@ TYPE
 		reserved1-: ARRAY 5 OF ADDRESS;
 		reserved2-: ARRAY 4 OF WORD;
 	END;
-	
+
 	PtraceRegsStruct = RECORD
 		ebx, ecx, edx, esi, edi, ebp, eax: WORD;
 		DS, ES, FS, GS, AX, IP, CS: WORD;
-		flags: SET; 
+		flags: SET;
 		esp: WORD;
 		ss: WORD;
 	END;
-	
+
 	Sigaction = RECORD
 		sa_handler: ADDRESS;
 		(*filler1: ADDRESS;*)
@@ -399,47 +399,47 @@ TYPE
 		sa_flags: ADDRESS;
 		filler: ADDRESS;
 	END;
-	
+
 	Sched_param = RECORD
 		sched_priority: LONGINT;
-		safety: ARRAY 8 OF ADDRESS; 
+		safety: ARRAY 8 OF ADDRESS;
 	END;
-	
 
-VAR 
+
+VAR
 	suspend_mutex: MutexType;
 	mainthread: Thread_t;
 	suspend_done: LONGINT;
 	resume_done: LONGINT;
 	sasuspend, saresume: Sigaction;
-	
+
 	argc-: LONGINT;  argv-: ADDRESS;  environ-: ADDRESS;
 
 	sysinfo-: RECORD
 		sysname-, nodename-, release-, version-, machine-: ARRAY 65 OF CHAR;
 	END;
-			
+
 	sigstack-: ARRAY 32*4096 OF CHAR;
-	
+
 	ptrace: PROCEDURE {C} (request: WORD; pid: Thread_t; adr, data: ADDRESS): WORD;
-	getcontext-: PROCEDURE {C} (context: ADDRESS): WORD; 
+	getcontext-: PROCEDURE {C} (context: ADDRESS): WORD;
+
+	sysconf: PROCEDURE {C} (name: LONGINT):WORD;
+
 
-	sysconf: PROCEDURE {C} (name: LONGINT):WORD;	
-	
-	
 	pthread_mutex_init: PROCEDURE {C} (mutex: ADDRESS; mutexattr: ADDRESS): WORD;
 	pthread_mutex_destroy: PROCEDURE {C} (mutex: ADDRESS): WORD;
 	pthread_mutex_lock: PROCEDURE {C} (mutex: ADDRESS): WORD;
 	pthread_mutex_unlock: PROCEDURE {C} (mutex: ADDRESS): WORD;
-	
+
 	pthread_mutexattr_init: PROCEDURE {C} (mutexattr: ADDRESS): WORD;
 	pthread_mutexattr_settype: PROCEDURE {C} (mutexattr: ADDRESS; type: WORD): WORD;
 
 	pthread_cond_init: PROCEDURE {C} (cond: ADDRESS; condAttr: ADDRESS): WORD;
 	pthread_cond_destroy: PROCEDURE {C} (cond: ADDRESS): WORD;
 	pthread_cond_wait: PROCEDURE {C} (cond: ADDRESS; mutex: ADDRESS): WORD;
-	pthread_cond_signal: PROCEDURE {C} (cond: ADDRESS): WORD; 
-	
+	pthread_cond_signal: PROCEDURE {C} (cond: ADDRESS): WORD;
+
 	pthread_create: PROCEDURE {C} (newthread: ADDRESS; attr: ADDRESS; start_routine: PROCEDURE {C} (arg: PROCEDURE):ADDRESS; arg:PROCEDURE): WORD;
 	pthread_exit: PROCEDURE {C} (thr: ADDRESS);
 	pthread_detach: PROCEDURE {C} (thr: ADDRESS);
@@ -465,18 +465,18 @@ VAR
 	sigaddset: PROCEDURE {C} (set: ADDRESS; signo: LONGINT);
 	sigdelset: PROCEDURE {C} (set: ADDRESS; signo: LONGINT);
 	nanosleep: PROCEDURE {C} (req, rem: ADDRESS): LONGINT;
-	sigaltstack: PROCEDURE {C} (ss, oss: ADDRESS): LONGINT; 
+	sigaltstack: PROCEDURE {C} (ss, oss: ADDRESS): LONGINT;
 	pthread_sigmask: PROCEDURE {C}(how: LONGINT; set: ADDRESS; oldset: ADDRESS): LONGINT;
-	
+
 	(*pid: return param for process id. Only set if initialized non-null. path: pointer to string denoting the executable. file_actions: modify which files are open for the new process, if NIL it inherits open files from parent process. attrp: sets process groups, scheduler, signals etc, leave NIL. argv, evp: char** to the arguments and env. variables*)
 	posix_spawnp- 	: PROCEDURE{C}(pid: ADDRESS; path: ADDRESS; file_actions: ADDRESS; attrp: ADDRESS; argv: ADDRESS ; envp: ADDRESS): LONGINT;
 	(*more restrictive than spawnp*)
 	posix_spawn- 	: PROCEDURE{C}(pid: ADDRESS; path: ADDRESS; file_actions: ADDRESS; attrp: ADDRESS; argv: ADDRESS ; envp: ADDRESS): LONGINT;
 	waitpid-			: PROCEDURE{C}(pid: pid_t; status: ADDRESS; options: LONGINT): pid_t;
-	pipe-				:PROCEDURE{C}(pipefd: ADDRESS): LONGINT; (*pipefd is assumed to be a pointer to a C array of 2 elements, after pipe creation the array will contain file descriptors for the input and output end of the pipe. returns 0 on success, or -1 on fail*)	
+	pipe-				:PROCEDURE{C}(pipefd: ADDRESS): LONGINT; (*pipefd is assumed to be a pointer to a C array of 2 elements, after pipe creation the array will contain file descriptors for the input and output end of the pipe. returns 0 on success, or -1 on fail*)
 	dup2-				:PROCEDURE{C}(oldfd,newfd: LONGINT): LONGINT; (*overwrites file descriptor newfd with a copy of oldfd. useful for redirecting pipes.*)
 	dup-				:PROCEDURE{C}(oldfd: LONGINT): LONGINT;
-	
+
 	read-			: PROCEDURE {C} ( fd: LONGINT; buf: ADDRESS; n: SIZE ): LONGINT;
 	write-			: PROCEDURE {C} ( fd: LONGINT; buf: ADDRESS; n: SIZE ): LONGINT;
 	open-			: PROCEDURE {C} ( name: ADDRESS;  flags, mode: SET ): LONGINT;
@@ -512,6 +512,7 @@ VAR
 	alarm-		: PROCEDURE {C} ( ms: LONGINT ): LONGINT;
 	setitimer-		: PROCEDURE {C} ( which: LONGINT;  VAR value, ovalue: Itimerval ): LONGINT;
 	getitimer-		: PROCEDURE {C} ( which: LONGINT;  VAR value: Itimerval ): LONGINT;
+	clock_gettime-	: PROCEDURE{C}	(clk_id: LONGINT; tp: tvPtr): LONGINT;
 
 	gettimeofday-	: PROCEDURE {C} ( VAR tv: Timeval;  VAR tz: Timezone ): LONGINT;
 	mktime-			: PROCEDURE {C} ( VAR tm: Tm ): LONGINT;
@@ -562,7 +563,7 @@ VAR
 	conDestroy:	PROCEDURE {REALTIME, C}  ( cond: Unix.Condition_t );
 	conWait: 		PROCEDURE {REALTIME, C}  ( cond: Unix.Condition_t;  mtx: Unix.Mutex_t );
 	conSignal: 	PROCEDURE {REALTIME, C}  ( cond: Unix.Condition_t );
-	
+
 	thrStart: 			PROCEDURE {REALTIME, C} ( p: PROCEDURE;  stackLen: LONGINT ): Unix.Thread_t;
 	thrThis: 			PROCEDURE {REALTIME, C} ( dummy: LONGINT ): Unix.Thread_t;
 	thrSleep: 			PROCEDURE {REALTIME, C} ( ms: LONGINT );
@@ -574,18 +575,18 @@ VAR
 	thrGetPriority: 	PROCEDURE {REALTIME, C} ( t: Unix.Thread_t ): LONGINT;
 	thrKill: 			PROCEDURE {REALTIME, C} ( t: Unix.Thread_t );
 	*)
-	
-	TYPE 
-	
-	
+
+	TYPE
+
+
 	PROCEDURE getnprocs* (): LONGINT;
 	BEGIN
 		RETURN sysconf(0x54); (*0x53 for number of processors configured, 0x54 for number of processors online *)
 	END getnprocs;
 
-	
+
 	PROCEDURE MtxInit*(dummy: LONGINT): Mutex_t;
-	VAR 
+	VAR
 		mtx: Mutex_t;
 	BEGIN
 		mtx := malloc(SIZEOF(MutexType));
@@ -595,24 +596,24 @@ VAR
 	END MtxInit;
 
 	PROCEDURE RecursiveMtxInit*(dummy: LONGINT): Mutex_t;
-	VAR 
+	VAR
 		mtx: Mutex_t;
 		attr: MutexAttributeType;
 		res: WORD;
-	CONST 
+	CONST
 		Recursive = 1;
 	BEGIN
 		mtx := malloc(SIZEOF(MutexType));
 		res := pthread_mutexattr_init(ADDRESS OF attr);
 		res := pthread_mutexattr_settype(ADDRESS OF attr, Recursive);
-		
+
 		ASSERT(mtx # 0);
 		ASSERT(pthread_mutex_init(mtx, ADDRESS OF attr) = 0);
 		RETURN mtx;
 	END RecursiveMtxInit;
-	
-	
-	
+
+
+
 	PROCEDURE MtxDestroy*(mtx: Mutex_t);
 	BEGIN
 		ASSERT(pthread_mutex_destroy(mtx) = 0);
@@ -627,7 +628,7 @@ VAR
 	BEGIN
 		ASSERT(pthread_mutex_unlock(mtx) = 0);
 	END MtxUnlock;
-	
+
 	PROCEDURE ConInit* (dummy: LONGINT): Condition_t;
 	VAR cond: Condition_t;
 	BEGIN
@@ -636,7 +637,7 @@ VAR
 		ASSERT(pthread_cond_init(cond, NIL)=0);
 		RETURN cond;
 	END ConInit;
-	
+
 	PROCEDURE ConDestroy*(con: Condition_t);
 	BEGIN
 		ASSERT(pthread_cond_destroy(con) = 0);
@@ -651,7 +652,7 @@ VAR
 	BEGIN
 		ASSERT(pthread_cond_signal(cond) = 0);
 	END ConSignal;
-	
+
 	PROCEDURE ThrThis*(dummy: LONGINT): Thread_t;
 	BEGIN
 		RETURN pthread_self();
@@ -666,9 +667,9 @@ VAR
 	BEGIN
 		pthread_exit(0);
 	END ThrExit;
-	
+
 	PROCEDURE ThrSetPriority*(thr: Thread_t; prio: LONGINT);
-	VAR 
+	VAR
 		param: Sched_param;
 		policy: LONGINT;
 	BEGIN
@@ -680,28 +681,28 @@ VAR
 	END ThrSetPriority;
 
 	PROCEDURE ThrGetPriority*(thr: Thread_t):LONGINT;
-	VAR 
+	VAR
 		param: Sched_param;
 		policy: LONGINT;
 	BEGIN
 	    IF pthread_getschedparam( thr, ADDRESS OF policy, ADDRESS OF param ) # 0 THEN END;
 	    RETURN  param.sched_priority;
 	END ThrGetPriority;
-	
-	VAR 
+
+	VAR
 		sigstk: Stack;
-	
+
 	PROCEDURE SetSigaltstack;
 	BEGIN
 		IF sigaltstack(ADDRESS OF sigstk, NIL) < 0 THEN
 			Perror("sigaltstack")
 		END;
 	END SetSigaltstack;
-	
+
 	PROCEDURE {C} Starter(proc: PROCEDURE): ADDRESS;
-	VAR 
+	VAR
 		me: Thread_t;
-		
+
 		old, new: Sigset_t;
 
 		param: Sched_param;
@@ -710,7 +711,7 @@ VAR
 	BEGIN
 		me := pthread_self();
 		SetSigaltstack();
-		
+
 	    IF sigfillset( ADDRESS OF new ) < 0 THEN
 	    	Perror("sigfillset");
 	    END;
@@ -732,13 +733,13 @@ VAR
 	    pthread_exit( NIL );
 	    RETURN NIL;
 	END Starter;
-	
+
 	PROCEDURE ThrStart*(p: PROCEDURE; stackSize: SIZE): Thread_t;
-	VAR 
+	VAR
 		attr: PThreadAttr;
 		id: Thread_t;
 		res,i: LONGINT;
-	CONST 
+	CONST
 		PTHREAD_SCOPE_SYSTEM = 0;
 		PTHREAD_CREATE_DETACHED = 1;
 	BEGIN
@@ -765,7 +766,7 @@ VAR
 			sltime := rem;
 		END;
 	END ThrSleep;
-	
+
 	PROCEDURE ThrKill*(thr: Thread_t);
 	BEGIN
 	    IF (thr # mainthread) THEN
@@ -775,26 +776,26 @@ VAR
 			ELSE
 	    	    pthread_cancel( thr );
 	        END
-	    END;  
+	    END;
     END ThrKill;
-    
-    (* did not work 
+
+    (* did not work
     PROCEDURE TraceThread*(p: Thread_t);
     VAR regs: PtraceRegsStruct; res: WORD;
     BEGIN
-       	res := ptrace(PTRACE_ATTACH, p , NIL, NIL); 
-    	IF res < 0 THEN Perror("attach") END; 
+       	res := ptrace(PTRACE_ATTACH, p , NIL, NIL);
+    	IF res < 0 THEN Perror("attach") END;
     	TRACE(res);
     	res := ptrace(PTRACE_GETREGS,p,NIL, ADDRESS OF regs);
-    	IF res < 0 THEN Perror("getregs") END; 
-    	TRACE(res); 
-    	TRACE(regs.ebx, regs.ecx, regs.edx, regs.eax); 
+    	IF res < 0 THEN Perror("getregs") END;
+    	TRACE(res);
+    	TRACE(regs.ebx, regs.ecx, regs.edx, regs.eax);
     	TRACE(regs.ebp, regs.esp, regs.IP, regs.flags);
     	res := ptrace(PTRACE_DETACH, p, NIL, NIL);
     END TraceThread;
     *)
-	
-	
+
+
 	PROCEDURE {C} resume_handler(sig: LONGINT);
 	BEGIN
 	END resume_handler;
@@ -804,9 +805,9 @@ VAR
 	BEGIN
 	    res := pthread_mutex_lock( ADDRESS OF suspend_mutex );
 	    resume_done := 0; n := 1;
-	    res := pthread_kill( thr, T_SIGRESUME ); 
-	    
-	    WHILE (resume_done # 1) & (n < 50) DO ThrSleep(1); INC(n) END; 
+	    res := pthread_kill( thr, T_SIGRESUME );
+
+	    WHILE (resume_done # 1) & (n < 50) DO ThrSleep(1); INC(n) END;
 	    res := pthread_mutex_unlock( ADDRESS OF suspend_mutex );
 	END ThrResume;
 
@@ -842,17 +843,17 @@ VAR
 		param: Sched_param;
 		BEGIN
 	    (*struct sched_param param;*)
-	    
+
 		ASSERT(pthread_mutex_init( ADDRESS OF suspend_mutex, NIL ) = 0);
 	    mainthread := pthread_self();
 	    high := sched_get_priority_max(SCHED_OTHER);
 	    low := sched_get_priority_min(SCHED_OTHER);
-	    
+
 	    param.sched_priority := high;
 		IF pthread_setschedparam( mainthread, SCHED_OTHER, ADDRESS OF param)#0 THEN
 			Perror("ThrInitialize: setparam");
 		END;
-		
+
 	    sigemptyset( ADDRESS OF sasuspend.sa_mask );
 	    sigaddset(  ADDRESS OF sasuspend.sa_mask, T_SIGRESUME );
 	    sasuspend.sa_flags := SA_SIGINFO + (*SA_ONSTACK +*) SA_NODEFER;;
@@ -871,7 +872,7 @@ VAR
 	BEGIN
 		S.MOVE(ADDRESS OF from, ADDRESS OF to, SIZE OF McontextDesc);
 	END CopyContext;
-	
+
 
 	PROCEDURE ModifyContext*( cont: Ucontext;  pc, bp, sp: LONGINT );
 	BEGIN
@@ -980,10 +981,10 @@ VAR
 		sigstk.size := LEN(sigstack);
 		sigstk.flags := {};
 	END CreateSignalStack;
-	
+
 	(*
 static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
-	
+
 	if (debug | (AosTrap == NULL)) {
 	    printf("\nhandler for signal %d got called, ucp = %p\n", sig, ucp);
 	    if (AosTrap == NULL) exit(1);
@@ -991,27 +992,27 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 	AosTrap(0, ucp, scp, sig); /* rev. order: Oberon <--> C */
 }
 	*)
-	
-	VAR trap: SignalHandler; 
-	
+
+	VAR trap: SignalHandler;
+
 	PROCEDURE {C} SigHandler  ( sig: LONGINT; scp: ADDRESS; ucp: ADDRESS); (* reversed arguments !! *)
 	BEGIN
-		IF trap # NIL THEN 
-			trap(sig, scp, ucp, 0);  
+		IF trap # NIL THEN
+			trap(sig, scp, ucp, 0);
 		ELSE
 			TRACE(sig, scp, ucp)
 		END;
 	END SigHandler;
-	
+
 	PROCEDURE InstallSignalHandler* ( h: SignalHandler );
 	BEGIN
 		trap := h;
 	END InstallSignalHandler;
 
-	
-	
+
+
 	PROCEDURE InstallHandler(sig: LONGINT);
-	VAR 
+	VAR
 		act: Sigaction;
 		mask: Sigset_t;
 	BEGIN
@@ -1028,11 +1029,11 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		END;
 
 	END InstallHandler;
-	
+
 	PROCEDURE fstat*  ( fd: LONGINT;  VAR buf: Status ): LONGINT;
 	VAR res: LONGINT;
 	BEGIN
-		(* 
+		(*
 						dev-		: DevT;
 				unused1-	: LONGINT;
 				ino-		: LONGINT;
@@ -1059,8 +1060,8 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		RETURN xstat( 3, path, buf );
 	END stat;
 
-	
-	
+
+
 	PROCEDURE InitSignalHandler;
 	VAR i: LONGINT;
 	BEGIN
@@ -1068,19 +1069,19 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 			IF i # 9 THEN InstallHandler(i) END;
 		END;
 	END InitSignalHandler;
-	
+
 	PROCEDURE errno*(): LONGINT;
 	VAR loc: ADDRESS;
 	BEGIN
 		loc := errno_location();
 		RETURN S.GET32(loc);
 	END errno;
-	
+
 	TYPE OberonXErrorHandler* = PROCEDURE (disp, err: ADDRESS): LONGINT;
 	TYPE OberonXIOErrorHandler* = PROCEDURE (disp: ADDRESS): LONGINT;
-	VAR oberonXErrorHandler:OberonXErrorHandler; 
+	VAR oberonXErrorHandler:OberonXErrorHandler;
 	VAR oberonXIOErrorHandler: OberonXIOErrorHandler;
-	
+
 	TYPE pid_t *= LONGINT;
 	TYPE path_t *= ARRAY OF CHAR;
 	TYPE arg_t *= ARRAY OF CHAR;
@@ -1090,7 +1091,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 	VAR res: LONGINT;
 	BEGIN
 		TRACE(d,err);
-		IF oberonXErrorHandler # NIL THEN 
+		IF oberonXErrorHandler # NIL THEN
 			res := oberonXErrorHandler(d, err);
 		END;
 		RETURN 0;
@@ -1114,10 +1115,10 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		res := xSetErrorHandler(ADDRESS OF X11ErrorHandler);
 		res := xSetIOErrorHandler(ADDRESS OF X11IOErrorHandler);
 	END InitXErrorHandlers;
-	
+
 	PROCEDURE Init;
 	VAR test: ADDRESS; i: LONGINT; s: ARRAY 256 OF CHAR;
-	BEGIN		
+	BEGIN
 		argc := Glue.argc;
 		argv := Glue.argv;
 		environ := Glue.environ;
@@ -1129,23 +1130,23 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		noPaths := 4;
 
 		libc := Dlopen( libcname, 2 );
-		libp := Dlopen( libpthreadname, 2); 
-		
+		libp := Dlopen( libpthreadname, 2);
+
 		Dlsym( libc, "exit",		ADDRESSOF( exit ) );
-		
+
 		Dlsym( libc, "ptrace", ADDRESSOF(ptrace));
 		Dlsym( libc, "getcontext", ADDRESSOF(getcontext));
 		Dlsym( libc, "sysconf", ADDRESSOF(sysconf));
-		
+
 		Dlsym( libc, "pthread_mutex_init", ADDRESSOF(pthread_mutex_init));
 		Dlsym( libc, "pthread_mutex_destroy", ADDRESSOF(pthread_mutex_destroy));
 		Dlsym( libc, "pthread_mutex_lock", ADDRESSOF(pthread_mutex_lock));
 		Dlsym( libc, "pthread_mutex_unlock", ADDRESSOF(pthread_mutex_unlock));
-		
+
 		Dlsym( libp, "pthread_mutexattr_init", ADDRESSOF(pthread_mutexattr_init));
 		Dlsym( libp, "pthread_mutexattr_settype", ADDRESSOF(pthread_mutexattr_settype));
-		
-		
+
+
 		Dlsym( libc, "pthread_cond_init", ADDRESSOF(pthread_cond_init));
 		Dlsym( libc, "pthread_cond_destroy", ADDRESSOF(pthread_cond_destroy));
 		Dlsym( libc, "pthread_cond_wait", ADDRESSOF(pthread_cond_wait));
@@ -1165,15 +1166,15 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libp, "pthread_attr_setdetachstate", ADDRESSOF(pthread_attr_setdetachstate));
 		Dlsym( libp, "pthread_attr_setstacksize", ADDRESSOF(pthread_attr_setstacksize));
 		Dlsym( libp, "pthread_self", ADDRESSOF(pthread_self));
-		
+
 		Dlsym( libc, "posix_spawnp", ADDRESSOF(posix_spawnp));
 		Dlsym( libc, "posix_spawn", ADDRESSOF(posix_spawn));
 
-		Dlsym( libc, "waitpid", ADDRESSOF(waitpid));		
+		Dlsym( libc, "waitpid", ADDRESSOF(waitpid));
 		Dlsym( libc, "pipe", ADDRESSOF(pipe));
 		Dlsym( libc, "dup2",ADDRESSOF(dup2));
 		Dlsym( libc, "dup", ADDRESSOF(dup));
-		
+
 		Dlsym( libc, "sched_get_priority_max", ADDRESSOF(sched_get_priority_max));
 		Dlsym( libc, "sched_get_priority_min", ADDRESSOF(sched_get_priority_min));
 		Dlsym( libc, "pthread_setschedparam", ADDRESSOF(pthread_setschedparam));
@@ -1186,7 +1187,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libc, "nanosleep", ADDRESSOF(nanosleep));
 		Dlsym( libc, "sigaltstack", ADDRESSOF(sigaltstack));
 		Dlsym( libc, "sigsuspend", ADDRESSOF(sigsuspend));
-				
+
 		Dlsym( libc, "read",		ADDRESSOF( read ) );
 		Dlsym( libc, "write",	ADDRESSOF( write ) );
 		Dlsym( libc, "open",		ADDRESSOF( open ) );
@@ -1217,6 +1218,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libc, "alarm",	ADDRESSOF( alarm ) );
 		Dlsym( libc, "setitimer",	ADDRESSOF( setitimer ) );
 		Dlsym( libc, "getitimer",	ADDRESSOF( getitimer ) );
+		Dlsym( libc, "clock_gettime", ADDRESSOF(clock_gettime) );
 
 		Dlsym( libc, "gettimeofday", ADDRESSOF( gettimeofday ) );
 		Dlsym( libc, "mktime",		ADDRESSOF( mktime ) );
@@ -1247,22 +1249,22 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libc, "kill",		ADDRESSOF( kill ) );
 		Dlsym( libc, "perror",	ADDRESSOF( perror ) );
 		Dlsym( libc, "__errno_location",	ADDRESSOF(errno_location ) );
-		
+
 		getSysinfo;
-				
+
 		CreateSignalStack;
 		InitSignalHandler;
 	END Init;
-	
+
 	(* load X11 related libaries only on demand *)
 	PROCEDURE LinkToX*;
 	BEGIN
-		libx := Dlopen( libX11name, 2); 
+		libx := Dlopen( libX11name, 2);
 
 		Dlsym( libx, "XSetErrorHandler", ADDRESS OF xSetErrorHandler);
 		Dlsym( libx, "XSetIOErrorHandler", ADDRESS OF xSetIOErrorHandler);
 	END LinkToX;
-	
+
 
 	PROCEDURE {INITIAL} Init0;
 	BEGIN

+ 14 - 2
source/Generic.Unix.Objects.Mod

@@ -589,10 +589,22 @@ TYPE
 
 	
 	PROCEDURE GetCpuCycles*( process : Process; VAR cpuCycles: CpuCyclesArray; all: BOOLEAN );
-	VAR i: LONGINT;
+	VAR
+		i,res: LONGINT;
+		time: Unix.tvPtr;
 	BEGIN
 		ASSERT( process # NIL );
-		FOR i := 0 TO Machine.MaxCPU-1 DO  cpuCycles[i] := 0  END;
+		NEW(time);
+		(*res:=Unix.clock_gettime(3,time);
+		cpuCycles[0]:=time.usec;*)
+		cpuCycles[0]:=5;
+		(*todo*)
+		
+		(*FOR i := 0 TO Machine.MaxCPU-1 DO  
+		
+			cpuCycles[i] := 0  
+			
+		END;*)
 	END GetCpuCycles;
 	
 	

+ 1 - 0
source/HierarchicalProfiler.Mod

@@ -575,6 +575,7 @@ BEGIN {EXCLUSIVE}
 		maxNofSamples := maxTime * Kernel.Second * Machine.NumberOfProcessors();
 		NEW(samples, maxNofSamples);
 		NEW(sampleInfos, maxNofSamples);
+		TRACE('enabling hprop0');
 		HierarchicalProfiler0.Enable(HandleTimer);
 		state := Running;
 		res := Ok;