#include <sys/socket.h>
#include <aio.h>
#include <signal.h>
+#include <pthread.h>
#include "thor.h"
#include "thor_internal.h"
int chunk_number;
int data_finished;
int resp_finished;
+ pthread_mutex_t lock;
};
struct t_thor_net_transfer {
return;
}
+ pthread_mutex_lock(&chunk->lock);
chunk->data_finished = 1;
- if (chunk->resp_finished)
+ pthread_mutex_unlock(&chunk->lock);
+
+ pthread_mutex_lock(&chunk->lock);
+ if (chunk->data_finished && chunk->resp_finished)
check_next_chunk(chunk, transfer);
+ pthread_mutex_unlock(&chunk->lock);
}
static void resp_finished(sigval_t sigval)
chunk->chunk_number,
transfer->user_data);
+ pthread_mutex_lock(&chunk->lock);
chunk->resp_finished = 1;
- if (chunk->data_finished)
+ pthread_mutex_unlock(&chunk->lock);
+
+ pthread_mutex_lock(&chunk->lock);
+ if (chunk->data_finished && chunk->resp_finished)
check_next_chunk(chunk, transfer);
+ pthread_mutex_unlock(&chunk->lock);
}
static int thor_net_send_raw_data(thor_device_handle *th,
if (!chunk.buf)
return -ENOMEM;
+ pthread_mutex_init(&chunk.lock, NULL);
+
chunk.data_transfer.aio_fildes = nh->sock_fd;
chunk.data_transfer.aio_buf = chunk.buf;
chunk.data_transfer.aio_nbytes = chunk.trans_unit_size;