From 3b44919d0b03f8f0a1033ac2d4b89f51c1718a63 Mon Sep 17 00:00:00 2001
From: laurent <laurent.thomas@free.fr>
Date: Tue, 27 Dec 2016 15:48:56 +0100
Subject: [PATCH] better performance measurements

---
 openair2/UTIL/LOG/log.h    | 435 +++++++++++++++++++++----------------
 openair2/UTIL/LOG/log_if.h |  59 +----
 targets/RT/USER/lte-ue.c   | 120 +---------
 3 files changed, 258 insertions(+), 356 deletions(-)

diff --git a/openair2/UTIL/LOG/log.h b/openair2/UTIL/LOG/log.h
index 171f74da41..b15f7064ac 100644
--- a/openair2/UTIL/LOG/log.h
+++ b/openair2/UTIL/LOG/log.h
@@ -53,26 +53,6 @@
 extern "C" {
 #endif
 
-  extern double cpuf;
-  static inline unsigned long long rdtsc(void) {
-    unsigned long long a, d;
-    __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
-    return (d<<32) | a;
-  }
-  static inline unsigned long long checkT(int timeout, char * file, int line) {
-    static unsigned long long __thread last=0;
-    unsigned long long cur=rdtsc();
-    int microCycles=(int)(cpuf*1000);
-    int duration=(int)((cur-last)/microCycles);
-    if ( last!=0 && duration > timeout )
-      printf("%s:%d lte-ue delay %d (exceed %d)\n", file, line,
-	     duration, timeout);
-    last=cur;
-    return cur;
-  }
-
-#define check(a) checkT(a,__FILE__,__LINE__)
-  
 /** @defgroup _LOG LOG Generator
  * @{*/
 /* @}*/
@@ -96,41 +76,197 @@ extern "C" {
  *  @ingroup _macro
  *  @brief LOG defines 9 levels of messages for users. Importance of these levels decrease gradually from 0 to 8
  * @{*/
-#ifndef LOG_EMERG
 # define  LOG_EMERG 0 /*!< \brief system is unusable */
-#endif
-#ifndef LOG_ALERT
 # define  LOG_ALERT 1 /*!< \brief action must be taken immediately */
-#endif
-#ifndef LOG_CRIT
 # define  LOG_CRIT  2 /*!< \brief critical conditions */
-#endif
-#ifndef LOG_ERR
 # define  LOG_ERR   3 /*!< \brief error conditions */
-#endif
-#ifndef LOG_WARNING
 # define  LOG_WARNING 4 /*!< \brief warning conditions */
-#endif
-#ifndef LOG_NOTICE
 # define  LOG_NOTICE  5 /*!< \brief normal but significant condition */
-#endif
-#ifndef LOG_INFO
 # define  LOG_INFO  6 /*!< \brief informational */
-#endif
-#ifndef LOG_DEBUG
 # define  LOG_DEBUG 7 /*!< \brief debug-level messages */
-#endif
-#ifndef LOG_FILE
 # define  LOG_FILE        8 /*!< \brief message sequence chart -level  */
-#endif
-#ifndef LOG_TRACE
 # define  LOG_TRACE 9 /*!< \brief trace-level messages */
-#endif
-
 #define NUM_LOG_LEVEL  10 /*!< \brief the number of message levels users have with LOG */
 /* @}*/
 
 
+/** @defgroup _log_format Defined log format
+ *  @ingroup _macro
+ *  @brief Macro of log formats defined by LOG
+ * @{*/
+
+/* .log_format = 0x13 uncolored standard messages
+ * .log_format = 0x93 colored standard messages */
+
+#define LOG_RED "\033[1;31m"  /*!< \brief VT100 sequence for bold red foreground */
+#define LOG_GREEN "\033[32m"  /*!< \brief VT100 sequence for green foreground */
+#define LOG_ORANGE "\033[93m"   /*!< \brief VT100 sequence for orange foreground */
+#define LOG_BLUE "\033[34m" /*!< \brief VT100 sequence for blue foreground */
+#define LOG_CYBL "\033[40;36m"  /*!< \brief VT100 sequence for cyan foreground on black background */
+#define LOG_RESET "\033[0m" /*!< \brief VT100 sequence for reset (black) foreground */
+/* @}*/
+
+
+/** @defgroup _syslog_conf Macros for write in syslog.conf
+ *  @ingroup _macro
+ *  @brief Macros used to write lines (local/remote) in syslog.conf
+ * @{*/
+#define LOG_LOCAL      0x01
+#define LOG_REMOTE     0x02
+
+#define FLAG_COLOR     0x001  /*!< \brief defaults */
+#define FLAG_PID       0x002  /*!< \brief defaults */
+#define FLAG_COMP      0x004
+#define FLAG_THREAD    0x008  /*!< \brief all : 255/511 */
+#define FLAG_LEVEL     0x010
+#define FLAG_FUNCT     0x020
+#define FLAG_FILE_LINE 0x040
+#define FLAG_TIME      0x100
+
+#define LOG_NONE        0x00
+#define LOG_LOW         0x5
+#define LOG_MED         0x15
+#define LOG_HIGH        0x35
+#define LOG_FULL        0x75
+
+#define OAI_OK 0    /*!< \brief all ok */
+#define OAI_ERR 1   /*!< \brief generic error */
+#define OAI_ERR_READ_ONLY 2 /*!< \brief tried to write to read-only item */
+#define OAI_ERR_NOTFOUND 3  /*!< \brief something wasn't found */
+/* @}*/
+
+
+//static char *log_level_highlight_start[] = {LOG_RED, LOG_RED, LOG_RED, LOG_RED, LOG_BLUE, "", "", "", LOG_GREEN}; /*!< \brief Optional start-format strings for highlighting */
+
+//static char *log_level_highlight_end[]   = {LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, "", "", "", LOG_RESET};  /*!< \brief Optional end-format strings for highlighting */
+
+typedef enum {
+    MIN_LOG_COMPONENTS = 0,
+    PHY = MIN_LOG_COMPONENTS,
+    MAC,
+    EMU,
+    OCG,
+    OMG,
+    OPT,
+    OTG,
+    OTG_LATENCY,
+    OTG_LATENCY_BG,
+    OTG_GP,
+    OTG_GP_BG,
+    OTG_JITTER,
+    RLC,
+    PDCP,
+    RRC,
+    NAS,
+    PERF,
+    OIP,
+    CLI,
+    MSC,
+    OCM,
+    UDP_,
+    GTPU,
+    SPGW,
+    S1AP,
+    SCTP,
+    HW,
+    OSA,
+    RAL_ENB,
+    RAL_UE,
+    ENB_APP,
+    FLEXRAN_AGENT,
+    TMR,
+    USIM,
+    LOCALIZE,
+    RRH,
+    X2AP,
+    MAX_LOG_COMPONENTS,
+}
+comp_name_t;
+
+//#define msg printf
+
+typedef struct {
+    char *name; /*!< \brief string name of item */
+    int value;  /*!< \brief integer value of mapping */
+} mapping;
+
+
+typedef struct  {
+    const char *name;
+    int         level;
+    int         flag;
+    int         interval;
+    int         fd;
+    int         filelog;
+    char       *filelog_name;
+
+    /* SR: make the log buffer component relative */
+    char        log_buffer[MAX_LOG_TOTAL];
+} log_component_t;
+
+typedef struct  {
+    unsigned int remote_ip;
+    unsigned int audit_ip;
+    int  remote_level;
+    int  facility;
+    int  audit_facility;
+    int  format;
+} log_config_t;
+
+
+typedef struct {
+    log_component_t         log_component[MAX_LOG_COMPONENTS];
+    log_config_t            config;
+    char*                   level2string[NUM_LOG_LEVEL];
+    int                     level;
+    int                     onlinelog;
+    int                     flag;
+    int                     syslog;
+    int                     filelog;
+    char*                   filelog_name;
+} log_t;
+
+typedef struct LOG_params {
+    const char *file;
+    const char *func;
+    int line;
+    int comp;
+    int level;
+    const char *format;
+    char l_buff_info [MAX_LOG_INFO];
+    int len;
+} LOG_params;
+
+#if defined(ENABLE_ITTI)
+typedef enum log_instance_type_e {
+    LOG_INSTANCE_UNKNOWN,
+    LOG_INSTANCE_ENB,
+    LOG_INSTANCE_UE,
+} log_instance_type_t;
+
+void log_set_instance_type (log_instance_type_t instance);
+#endif
+
+
+/*--- INCLUDES ---------------------------------------------------------------*/
+#    include "log_if.h"
+/*----------------------------------------------------------------------------*/
+int  logInit (void);
+void logRecord_mt(const char *file, const char *func, int line,int comp, int level, const char *format, ...);
+void logRecord(const char *file, const char *func, int line,int comp, int level, const char *format, ...);
+int  set_comp_log(int component, int level, int verbosity, int interval);
+int  set_log(int component, int level, int interval);
+void set_glog(int level, int verbosity);
+void set_log_syslog(int enable);
+void set_log_onlinelog(int enable);
+void set_log_filelog(int enable);
+void set_component_filelog(int comp);
+int  map_str_to_int(mapping *map, const char *str);
+char *map_int_to_str(mapping *map, int val);
+void logClean (void);
+int  is_newline( char *str, int size);
+void *log_thread_function(void * list);
+
 /** @defgroup _logIt logIt function
  *  @ingroup _macro
  *  @brief Macro used to call tr_log_full_ex with file, function and line information
@@ -206,169 +342,82 @@ extern "C" {
 #define LOG_RETURN(c,x) do {uint32_t __rv;__rv=(unsigned int)(x);LOG_T(c,"Returning %08x\n", __rv);return((typeof(x))__rv);}while(0)  /*!< \brief Macro to log a function exit, including integer value, then to return a value to the calling function */
 /* @}*/
 
-
-/** @defgroup _log_format Defined log format
- *  @ingroup _macro
- *  @brief Macro of log formats defined by LOG
- * @{*/
-
-/* .log_format = 0x13 uncolored standard messages
- * .log_format = 0x93 colored standard messages */
-
-#define LOG_RED "\033[1;31m"  /*!< \brief VT100 sequence for bold red foreground */
-#define LOG_GREEN "\033[32m"  /*!< \brief VT100 sequence for green foreground */
-#define LOG_ORANGE "\033[93m"   /*!< \brief VT100 sequence for orange foreground */
-#define LOG_BLUE "\033[34m" /*!< \brief VT100 sequence for blue foreground */
-#define LOG_CYBL "\033[40;36m"  /*!< \brief VT100 sequence for cyan foreground on black background */
-#define LOG_RESET "\033[0m" /*!< \brief VT100 sequence for reset (black) foreground */
-/* @}*/
-
-
-/** @defgroup _syslog_conf Macros for write in syslog.conf
- *  @ingroup _macro
- *  @brief Macros used to write lines (local/remote) in syslog.conf
- * @{*/
-#define LOG_LOCAL      0x01
-#define LOG_REMOTE     0x02
-
-#define FLAG_COLOR     0x001  /*!< \brief defaults */
-#define FLAG_PID       0x002  /*!< \brief defaults */
-#define FLAG_COMP      0x004
-#define FLAG_THREAD    0x008  /*!< \brief all : 255/511 */
-#define FLAG_LEVEL     0x010
-#define FLAG_FUNCT     0x020
-#define FLAG_FILE_LINE 0x040
-#define FLAG_TIME      0x100
-
-#define LOG_NONE        0x00
-#define LOG_LOW         0x5
-#define LOG_MED         0x15
-#define LOG_HIGH        0x35
-#define LOG_FULL        0x75
-
-#define OAI_OK 0    /*!< \brief all ok */
-#define OAI_ERR 1   /*!< \brief generic error */
-#define OAI_ERR_READ_ONLY 2 /*!< \brief tried to write to read-only item */
-#define OAI_ERR_NOTFOUND 3  /*!< \brief something wasn't found */
-/* @}*/
-
-
-//static char *log_level_highlight_start[] = {LOG_RED, LOG_RED, LOG_RED, LOG_RED, LOG_BLUE, "", "", "", LOG_GREEN}; /*!< \brief Optional start-format strings for highlighting */
-
-//static char *log_level_highlight_end[]   = {LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, "", "", "", LOG_RESET};  /*!< \brief Optional end-format strings for highlighting */
-
-typedef enum {
-  MIN_LOG_COMPONENTS = 0,
-  PHY = MIN_LOG_COMPONENTS,
-  MAC,
-  EMU,
-  OCG,
-  OMG,
-  OPT,
-  OTG,
-  OTG_LATENCY,
-  OTG_LATENCY_BG,
-  OTG_GP,
-  OTG_GP_BG,
-  OTG_JITTER,
-  RLC,
-  PDCP,
-  RRC,
-  NAS,
-  PERF,
-  OIP,
-  CLI,
-  MSC,
-  OCM,
-  UDP_,
-  GTPU,
-  SPGW,
-  S1AP,
-  SCTP,
-  HW,
-  OSA,
-  RAL_ENB,
-  RAL_UE,
-  ENB_APP,
-  FLEXRAN_AGENT,
-  TMR,
-  USIM,
-  LOCALIZE,
-  RRH,
-  X2AP,
-  MAX_LOG_COMPONENTS,
+static inline unsigned long long rdtsc(void) {
+    unsigned long long a, d;
+    __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
+    return (d<<32) | a;
 }
-comp_name_t;
-
-//#define msg printf
-
-typedef struct {
-  char *name; /*!< \brief string name of item */
-  int value;  /*!< \brief integer value of mapping */
-} mapping;
-
 
-typedef struct  {
-  const char *name;
-  int         level;
-  int         flag;
-  int         interval;
-  int         fd;
-  int         filelog;
-  char       *filelog_name;
-
-  /* SR: make the log buffer component relative */
-  char        log_buffer[MAX_LOG_TOTAL];
-} log_component_t;
+#define DEBUG_REALTIME 1
+#if DEBUG_REALTIME
 
-typedef struct  {
-  unsigned int remote_ip;
-  unsigned int audit_ip;
-  int  remote_level;
-  int  facility;
-  int  audit_facility;
-  int  format;
-} log_config_t;
+extern double cpuf;
 
+static inline unsigned long long checkT(int timeout, char * file, int line) {
+    static unsigned long long __thread last=0;
+    unsigned long long cur=rdtsc();
+    int microCycles=(int)(cpuf*1000);
+    int duration=(int)((cur-last)/microCycles);
+    if ( last!=0 && duration > timeout )
+        printf("%s:%d lte-ue delay %d (exceed %d)\n", file, line,
+               duration, timeout);
+    last=cur;
+    return cur;
+}
 
-typedef struct {
-  log_component_t         log_component[MAX_LOG_COMPONENTS];
-  log_config_t            config;
-  char*                   level2string[NUM_LOG_LEVEL];
-  int                     level;
-  int                     onlinelog;
-  int                     flag;
-  int                     syslog;
-  int                     filelog;
-  char*                   filelog_name;
-} log_t;
+typedef struct m {
+    unsigned long long iterations;
+    unsigned long long sum;
+    unsigned long long maxArray[11];
+} Meas;
+
+static inline void printMeas(char * txt, Meas *M, int period) {
+    if (M->iterations%period == 0 ) {
+        char txt2[512];
+        sprintf(txt2,"%s avg=%llu, iterations=%llu, max=%llu/%llu/%llu/%llu/%llu/%llu/%llu/%llu/%llu/%llu\n",
+                txt, M->sum/M->iterations,M->iterations,
+                M->maxArray[1],M->maxArray[2], M->maxArray[3],M->maxArray[4],
+                M->maxArray[5], M->maxArray[6],M->maxArray[7], M->maxArray[8],M->maxArray[9],M->maxArray[10]);
+        LOG_W(PHY,txt2);
+    }
+}
 
-typedef struct LOG_params {
-  const char *file;
-  const char *func;
-  int line;
-  int comp;
-  int level;
-  const char *format;
-  char l_buff_info [MAX_LOG_INFO];
-  int len;
-} LOG_params;
+static inline int cmpint(const void* a, const void* b) {
+    unsigned long long* aa=(unsigned long long*)a;
+    unsigned long long* bb=(unsigned long long*)b;
+    return (int)(*aa-*bb);
+}
 
+static inline void updateTimes(unsigned long long start, Meas *M, int period, char * txt) {
+    if (start!=0) {
+        unsigned long long end=rdtsc();
+        long long diff=(end-start)/(cpuf*1000);
+        M->maxArray[0]=diff;
+        M->sum+=diff;
+        M->iterations++;
+        qsort(M->maxArray, 11, sizeof(unsigned long long), cmpint);
+        printMeas(txt,M,period);
+    }
+}
 
-#if defined(ENABLE_ITTI)
-typedef enum log_instance_type_e {
-  LOG_INSTANCE_UNKNOWN,
-  LOG_INSTANCE_ENB,
-  LOG_INSTANCE_UE,
-} log_instance_type_t;
+#define check(a) checkT(a,__FILE__,__LINE__)
+#define initRefTimes(a) static __thread Meas a= {0}
+#define pickTime(a) unsigned long long a=rdtsc()
+#define readTime(a) a
+#define initStaticTime(a) static __thread unsigned long long a={0}
+#define pickStaticTime(a) a=rdtsc()
 
-void log_set_instance_type (log_instance_type_t instance);
+#else
+#define check(a) do {} while (0)
+#define initRefTimes(a) do {} while (0)
+#define initStaticTime(a) do {} while (0)
+#define pickTime(a) do {} while (0)
+#define readTime(a) 0
+#define pickStaticTime(a) do {} while (0)
+#define updateTimes(a,b,c,d) do {} while (0)
+#define printMeas(a,b,c) do {} while (0)
 #endif
-int logInit (void);
 
-/*--- INCLUDES ---------------------------------------------------------------*/
-#    include "log_if.h"
-/*----------------------------------------------------------------------------*/
 #ifdef __cplusplus
 }
 #endif
diff --git a/openair2/UTIL/LOG/log_if.h b/openair2/UTIL/LOG/log_if.h
index 1b447a7f60..6338fab829 100644
--- a/openair2/UTIL/LOG/log_if.h
+++ b/openair2/UTIL/LOG/log_if.h
@@ -27,59 +27,8 @@
 * \warning This component can be runned only in user-space
 * @ingroup routing
 */
-#ifndef __LOG_IF_H__
-#    define __LOG_IF_H__
-
-
-/*--- INCLUDES ---------------------------------------------------------------*/
-#    include "log.h"
-/*----------------------------------------------------------------------------*/
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#    ifdef COMPONENT_LOG
-#        ifdef COMPONENT_LOG_IF
-#            define private_log_if(x) x
-#            define friend_log_if(x) x
-#            define public_log_if(x) x
-#        else
-#            define private_log_if(x)
-#            define friend_log_if(x) extern x
-#            define public_log_if(x) extern x
-#        endif
-#    else
-#        define private_log_if(x)
-#        define friend_log_if(x)
-#        define public_log_if(x) extern x
-#    endif
-
-/** @defgroup _log_if Interfaces of LOG
- * @{*/
-
-//public_log_if( log_t *g_log;)
-
-public_log_if( int logInit (void);)
-public_log_if( void logRecord_mt(const char *file, const char *func, int line,int comp, int level, const char *format, ...);)
-public_log_if( void logRecord(const char *file, const char *func, int line,int comp, int level, const char *format, ...);)
-public_log_if( int set_comp_log(int component, int level, int verbosity, int interval);)
-public_log_if( int  set_log(int component, int level, int interval);)
-public_log_if( void set_glog(int level, int verbosity);)
-public_log_if( void set_log_syslog(int enable);)
-public_log_if( void set_log_onlinelog(int enable);)
-public_log_if( void set_log_filelog(int enable);)
-public_log_if( void set_component_filelog(int comp);)
-public_log_if( int  map_str_to_int(mapping *map, const char *str);)
-public_log_if( char *map_int_to_str(mapping *map, int val);)
-public_log_if( void logClean (void); )
-public_log_if( int is_newline( char *str, int size);)
-public_log_if( void *log_thread_function(void * list);)
-
-/* @}*/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
 
+// LTS: kept this file for compatibility
+// this file was probably a trial to separate internal functions and external ones
+// but it has never been finished, most source code include directly log.h (not log_if.h)
+#include "log.h"
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index 6e588f7f3c..b398d5127e 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -75,101 +75,6 @@
 #include "UTIL/LOG/vcd_signal_dumper.h"
 #include "UTIL/OPT/opt.h"
 
-
-#define DEBUG_REALTIME 1
-#if DEBUG_REALTIME
-
-typedef struct latency_stat {
-    uint64_t		counter;
-    uint64_t		stat1100;
-    uint64_t		stat1200;
-    uint64_t		stat1500;
-    uint64_t		stat2000;
-    uint64_t		stat3000;
-} latency_stat_t;
-
-static inline void saif_meas(int frame_rx) {
-    static latency_stat_t __thread latency_stat;
-    static struct timespec __thread last= {0};
-    struct timespec now;
-    clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-    if ( last.tv_sec )  {
-        uint64_t diffTime =  ((uint64_t)now.tv_sec *1000 *1000 *1000 + now.tv_nsec) -
-                             ((uint64_t)last.tv_sec *1000 *1000 *1000 + last.tv_nsec);
-        diffTime/=1000;
-        latency_stat.counter++;
-        if ( diffTime >= 1100 ) {
-            if (diffTime  < 1200 )
-                latency_stat.stat1100++;
-            else if ( diffTime < 1500 )
-                latency_stat.stat1200++;
-            else if ( diffTime < 2000 )
-                latency_stat.stat1500++;
-            else if ( diffTime < 3000 )
-                latency_stat.stat2000++;
-            else
-                latency_stat.stat3000++;
-        }
-        if ( diffTime>=1100 || latency_stat.counter%20000==0 ) {
-            time_t current=time(NULL);
-            LOG_W(HW,
-                  "%.2f delay=%llu Period stats %2.6f%% below 100µs\ncumul of events: 1100=%ld 1200=%ld 1500=%ld 2000=%ld >3000=%ld - (frame_rx=%d) - %s",
-                  now.tv_sec+(double)now.tv_nsec/1e9,
-                  diffTime,
-                  (latency_stat.counter-latency_stat.stat1100-latency_stat.stat1200-
-                   latency_stat.stat1500-latency_stat.stat2000-latency_stat.stat3000)/
-                  (float)latency_stat.counter *100,
-                  latency_stat.stat1100, latency_stat.stat1200,
-                  latency_stat.stat1500, latency_stat.stat2000,
-                  latency_stat.stat3000,
-                  frame_rx, ctime(&current));
-            fflush(stdout);
-        }
-
-    }
-    last=now;
-}
-
-typedef struct m {
-    unsigned long long iterations;
-    unsigned long long sum;
-    unsigned long long maxArray[11];
-} Meas;
-
-
-void printMeas(char * txt, Meas *M, int period) {
-    if (M->iterations%period == 0 ) {
-        char txt2[512];
-        sprintf(txt2,"%s avg=%llu, iterations=%llu, max=%llu/%llu/%llu/%llu/%llu/%llu/%llu/%llu/%llu/%llu\n",
-                txt, M->sum/M->iterations,M->iterations,
-                M->maxArray[1],M->maxArray[2], M->maxArray[3],M->maxArray[4],
-                M->maxArray[5], M->maxArray[6],M->maxArray[7], M->maxArray[8],M->maxArray[9],M->maxArray[10]);
-        LOG_W(PHY,txt2);
-    }
-}
-
-int cmpint(const void* a, const void* b) {
-    unsigned long long* aa=(unsigned long long*)a;
-    unsigned long long* bb=(unsigned long long*)b;
-    return (int)(*aa-*bb);
-}
-
-void updateTimes(unsigned long long start, Meas *M, int period, char * txt) {
-    unsigned long long end=rdtsc();
-    long long diff=(end-start)/(cpuf*1000);
-    M->maxArray[0]=diff;
-    M->sum+=diff;
-    M->iterations++;
-    qsort(M->maxArray, 11, sizeof(unsigned long long), cmpint);
-    printMeas(txt,M,period);
-}
-
-#else
-#define check(a) do {} while (0)
-#define saif_meas(a) do {} while (0)
-#define update_max_times(a,b) do {} while (0)
-#define print_meas(a,b) do {} while (0)
-#endif
 /* End of Changed by SYRTEM */
 
 #define FRAME_PERIOD    100000000ULL
@@ -742,9 +647,10 @@ static void *UE_thread_rxn_txnp4(void *arg) {
         instance_cnt_rxtx=proc->subframe_rx;
         AssertFatal(pthread_mutex_unlock(&proc->mutex_rxtx) ==0,"");
 
-        static __thread Meas t2= {0}, t3= {0};
-        unsigned long long current=rdtsc();
-        updateTimes(proc->gotIQs, &t2, 10000, "saif: Delay to wake up UE_Thread_Rx (case 2)");
+        initRefTimes(t2);
+        initRefTimes(t3);
+        pickTime(current);
+        updateTimes(proc->gotIQs, &t2, 10000, "Delay to wake up UE_Thread_Rx (case 2)");
 
         // Process Rx data for one sub-frame
         lte_subframe_t sf_type = subframe_select( &UE->frame_parms, proc->subframe_rx);
@@ -812,7 +718,7 @@ static void *UE_thread_rxn_txnp4(void *arg) {
                 (UE->frame_parms.frame_type == TDD))
             if (UE->mode != loop_through_memory)
                 phy_procedures_UE_S_TX(UE,0,0,no_relay);
-        updateTimes(current, &t3, 10000, "saif: Delay to process sub-frame (case 3)");
+        updateTimes(current, &t3, 10000, "Delay to process sub-frame (case 3)");
 
     }
 
@@ -1002,15 +908,15 @@ void *UE_thread(void *arg) {
                         if ( first_symbols <0 )
                             LOG_E(PHY,"can't compensate: diff =%d\n", first_symbols);
                     }
-                    unsigned long long gotIQs=rdtsc();
+                    pickTime(gotIQs);
                     // operate on thread sf mod 2
                     AssertFatal(pthread_mutex_lock(&proc->mutex_rxtx) ==0,"");
                     if(sub_frame == 0) {
                         UE->proc.proc_rxtx[0].frame_rx++;
                         UE->proc.proc_rxtx[1].frame_rx++;
                     }
-                    UE->proc.proc_rxtx[0].gotIQs=gotIQs;
-                    UE->proc.proc_rxtx[1].gotIQs=gotIQs;
+                    UE->proc.proc_rxtx[0].gotIQs=readTime(gotIQs);
+                    UE->proc.proc_rxtx[1].gotIQs=readTime(gotIQs);
                     proc->subframe_rx=sub_frame;
                     proc->subframe_tx=(sub_frame+4)%10;
                     proc->frame_tx = proc->frame_rx + (proc->subframe_rx>5?1:0);
@@ -1020,12 +926,10 @@ void *UE_thread(void *arg) {
 
                     AssertFatal (pthread_cond_signal(&proc->cond_rxtx) ==0 ,"");
                     AssertFatal(pthread_mutex_unlock(&proc->mutex_rxtx) ==0,"");
-                    static __thread Meas t1= {0};
-                    static unsigned long long lastTime=0;
-                    if ( lastTime != 0 )
-                        updateTimes(lastTime, &t1, 20000, "saif: Delay between two IQ acquisitions (case 1)");
-                    lastTime=rdtsc();
-                    saif_meas(proc->frame_rx);
+                    initRefTimes(t1);
+                    initStaticTime(lastTime);
+                    updateTimes(lastTime, &t1, 20000, "Delay between two IQ acquisitions (case 1)");
+                    pickStaticTime(lastTime);
 
                 } else {
                     printf("Processing subframe %d",proc->subframe_rx);
-- 
GitLab