#define LTT_TRACER_MAGIC_NUMBER 0x00D6B7ED
#define LTT_TRACER_VERSION_MAJOR 0
-#define LTT_TRACER_VERSION_MINOR 7
+#define LTT_TRACER_VERSION_MINOR 8
#ifndef atomic_cmpxchg
#define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new))
uint8_t flight_recorder;
uint8_t has_heartbeat;
uint8_t has_alignment; /* Event header alignment */
+ uint8_t tsc_lsb_truncate;
+ uint8_t tscbits;
uint32_t freq_scale;
uint64_t start_freq;
uint64_t start_tsc;
uint64_t start_monotonic;
- uint64_t start_time_sec;
- uint64_t start_time_usec;
+ uint64_t start_time_sec;
+ uint64_t start_time_usec;
} __attribute((packed));
int commit_count, reserve_count;
int ret;
sigset_t oldset, set;
- int signals_disabled = 0;
do {
offset_old = atomic_read(<t_buf->offset);
{
/* sem_wait is not signal safe. Disable signals around it.
* Signals are kept disabled to make sure we win the cmpxchg. */
-
/* Disable signals */
- if(!signals_disabled) {
- ret = sigfillset(&set);
- if(ret) perror("LTT Error in sigfillset\n");
-
- ret = pthread_sigmask(SIG_BLOCK, &set, &oldset);
+ ret = sigfillset(&set);
+ if(ret) perror("LTT Error in sigfillset\n");
+
+ ret = pthread_sigmask(SIG_BLOCK, &set, &oldset);
+ if(ret) perror("LTT Error in pthread_sigmask\n");
+
+ /* We detect if a signal came between
+ * the offset read and signal disabling:
+ * if it is the case, then we restart
+ * the loop after reenabling signals. It
+ * means that it's a signal that has
+ * won the buffer switch.*/
+ if(offset_old != atomic_read(<t_buf->offset)) {
+ ret = pthread_sigmask(SIG_SETMASK, &oldset, NULL);
if(ret) perror("LTT Error in pthread_sigmask\n");
- signals_disabled = 1;
+ continue;
}
+ /* If the offset is still the same, then
+ * we can safely proceed to do the
+ * buffer switch without being
+ * interrupted by a signal. */
sem_wait(<t_buf->writer_sem);
}
* sem_wait does in fact win the cmpxchg for the offset. We only call
* these system calls on buffer boundaries because of their performance
* cost. */
- if(signals_disabled) {
+ if(reserve_commit_diff == 0) {
ret = pthread_sigmask(SIG_SETMASK, &oldset, NULL);
if(ret) perror("LTT Error in pthread_sigmask\n");
}