* It can also happen if this is a buffer we never got. */
return -EIO;
} else {
- if(atomic_inc_return(<t_buf->writer_futex) <= 0) {
- atomic_set(<t_buf->writer_futex, 1);
- /* tell the client that buffer is now unfull */
- ret = futex((unsigned long)<t_buf->writer_futex,
- FUTEX_WAKE, 1, 0, 0, 0);
- if(ret != 1) {
- dbg_printf("LTT warning : race condition : writer not waiting or too many writers\n");
- }
+ ret = sem_post(<t_buf->writer_sem);
+ if(ret < 0) {
+ printf("error in sem_post");
}
}
}
close(fd_process);
+ ret = sem_destroy(&shared_trace_info->channel.process.writer_sem);
+ if(ret < 0) {
+ perror("error in sem_destroy");
+ }
munmap(shared_trace_info, sizeof(*shared_trace_info));
exit(0);
shared_trace_info->nesting=0;
memset(&shared_trace_info->channel.process, 0,
sizeof(shared_trace_info->channel.process));
- /* Tricky semaphore : is in a shared memory space, so it's ok for a fast
- * mutex (futex). */
- atomic_set(&shared_trace_info->channel.process.writer_futex, LTT_N_SUBBUFS);
+ //Need NPTL!
+ ret = sem_init(&shared_trace_info->channel.process.writer_sem, 1,
+ LTT_N_SUBBUFS);
+ if(ret < 0) {
+ perror("error in sem_init");
+ }
shared_trace_info->channel.process.alloc_size = LTT_BUF_SIZE_PROCESS;
shared_trace_info->channel.process.subbuf_size = LTT_SUBBUF_SIZE_PROCESS;
shared_trace_info->channel.process.start =
#include <pthread.h>
#include <stdint.h>
#include <syscall.h>
-#include <linux/futex.h>
#include <asm/timex.h>
+#include <semaphore.h>
#include <ltt/ltt-facility-id-user_generic.h>
#include <ltt/ltt-generic.h>
-#ifndef futex
-static inline __attribute__((no_instrument_function))
- _syscall6(long, futex, unsigned long, uaddr, int, op, int, val,
- unsigned long, timeout, unsigned long, uaddr2, int, val2)
-#endif //futex
-
-
-
#ifndef LTT_N_SUBBUFS
#define LTT_N_SUBBUFS 2
#endif //LTT_N_SUBBUFS
atomic_t events_lost;
atomic_t corrupted_subbuffers;
- atomic_t writer_futex; /* futex on which the writer waits */
+ sem_t writer_sem; /* semaphore on which the writer waits */
unsigned int alloc_size;
unsigned int subbuf_size;
};
//if((SUBBUF_TRUNC(offset_begin, ltt_buf)
// - SUBBUF_TRUNC(atomic_read(<t_buf->consumed), ltt_buf))
// >= ltt_buf->alloc_size) {
- if(atomic_dec_return(<t_buf->writer_futex) >= 0) {
- /* non contended */
- } else {
- /* We block until the reader unblocks us */
- atomic_set(<t_buf->writer_futex, -1);
- /* We block until the reader tells us to wake up.
- Signals will simply cause this loop to restart.
- */
- do {
- ret = futex((unsigned long)<t_buf->writer_futex,
- FUTEX_WAIT, -1, 0, 0, 0);
- } while(ret != 0 && ret != EWOULDBLOCK);
- }
+ sem_wait(<t_buf->writer_sem);
/* go on with the write */
//} else {
} else {
/* Next subbuffer corrupted. Force pushing reader even in normal
* mode. It's safe to write in this new subbuffer. */
+ sem_post(<t_buf->writer_sem);
}
size = ltt_get_header_size(trace, ltt_buf->start + offset_begin,
before_hdr_pad, after_hdr_pad, header_size) + data_size;