add __synch_synchronize for the T_cache

it probably makes things zillion times slower but it seems to be necessary
This commit is contained in:
Cedric Roux
2016-03-21 16:44:12 +01:00
parent 7c7d5caed2
commit 0fe08538e9
3 changed files with 23 additions and 6 deletions
+10 -3
View File
@@ -54,9 +54,16 @@ static void *T_send_thread(void *_)
{
while (1) {
usleep(5000);
__sync_synchronize();
while (T_cache[T_busylist_head].busy) {
char *b = T_cache[T_busylist_head].buffer;
int l = T_cache[T_busylist_head].length;
char *b;
int l;
/* TODO: be sure about those memory barriers - in doubt one is
* put here too
*/
__sync_synchronize();
b = T_cache[T_busylist_head].buffer;
l = T_cache[T_busylist_head].length;
while (l) {
int done = write(T_socket, b, l);
if (done <= 0) {
@@ -123,7 +130,7 @@ void T_connect_to_tracer(char *addr, int port)
#ifdef T_USE_SHARED_MEMORY
/* setup shared memory */
T_shm_fd = shm_open(T_SHM_FILENAME, O_RDWR, 0666);
T_shm_fd = shm_open(T_SHM_FILENAME, O_RDWR /*| O_SYNC*/, 0666);
shm_unlink(T_SHM_FILENAME);
if (T_shm_fd == -1) { perror(T_SHM_FILENAME); abort(); }
T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t),
+4 -2
View File
@@ -118,16 +118,18 @@ extern T_cache_t *T_cache;
#ifdef T_USE_SHARED_MEMORY
#define T_SEND() \
T_cache[T_LOCAL_slot].busy = 1; \
T_cache[T_LOCAL_slot].length = T_LOCAL_size; \
__sync_synchronize(); \
T_cache[T_LOCAL_slot].busy = 1; \
T_send(T_LOCAL_buf, T_LOCAL_size)
#else /* T_USE_SHARED_MEMORY */
/* when not using shared memory, wait for send to finish */
#define T_SEND() \
T_cache[T_LOCAL_slot].busy = 1; \
T_cache[T_LOCAL_slot].length = T_LOCAL_size; \
__sync_synchronize(); \
T_cache[T_LOCAL_slot].busy = 1; \
T_send(T_LOCAL_buf, T_LOCAL_size); \
while (T_cache[T_LOCAL_slot].busy) usleep(1*1000)
+9 -1
View File
@@ -356,7 +356,8 @@ void wait_message(void)
void init_shm(void)
{
int s = shm_open(T_SHM_FILENAME, O_RDWR | O_CREAT, 0666);
int i;
int s = shm_open(T_SHM_FILENAME, O_RDWR | O_CREAT /*| O_SYNC*/, 0666);
if (s == -1) { perror(T_SHM_FILENAME); abort(); }
if (ftruncate(s, T_CACHE_SIZE * sizeof(T_cache_t)))
{ perror(T_SHM_FILENAME); abort(); }
@@ -365,6 +366,12 @@ void init_shm(void)
if (T_cache == NULL)
{ perror(T_SHM_FILENAME); abort(); }
close(s);
/* let's garbage the memory to catch some potential problems
* (think multiprocessor sync issues, barriers, etc.)
*/
memset(T_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t));
for (i = 0; i < T_CACHE_SIZE; i++) T_cache[i].busy = 0;
}
#endif /* T_USE_SHARED_MEMORY */
@@ -555,6 +562,7 @@ no_init_message:
while (1) {
#ifdef T_USE_SHARED_MEMORY
wait_message();
__sync_synchronize();
#endif
#ifdef T_USE_SHARED_MEMORY