82 lines
1.7 KiB
C
82 lines
1.7 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <pthread.h>
|
|
#include <unistd.h>
|
|
|
|
/* Non standard include */
|
|
#include <specific_comm.h>
|
|
|
|
|
|
struct communication_assoc assoc_root;
|
|
static pthread_mutex_t assoc_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
static struct communication_assoc assoc_tmp;
|
|
static volatile int init = 0;
|
|
volatile int cont = 1;
|
|
|
|
void initialize_library(void)
|
|
{
|
|
assoc_tmp.prev = &assoc_tmp;
|
|
assoc_tmp.next = &assoc_tmp;
|
|
assoc_root.prev = &assoc_root;
|
|
assoc_root.next = &assoc_root;
|
|
}
|
|
|
|
volatile int *init_comm(void)
|
|
{
|
|
return &cont;
|
|
}
|
|
|
|
void wait_initialization(void)
|
|
{
|
|
while (!init);
|
|
}
|
|
|
|
void add_sender(void)
|
|
{
|
|
struct communication_assoc *assoc;
|
|
|
|
assoc = create_comm_assoc();
|
|
pthread_mutex_lock(&assoc_lock);
|
|
if (!init)
|
|
{
|
|
initialize_library();
|
|
init = 1;
|
|
}
|
|
assoc->next = assoc_tmp.next;
|
|
assoc_tmp.next->prev = assoc;
|
|
assoc->prev = &assoc_tmp;
|
|
assoc_tmp.next = assoc;
|
|
pthread_mutex_unlock(&assoc_lock);
|
|
}
|
|
|
|
void remove_sender()
|
|
{
|
|
printf("remove_communication_channel: Not yet implemented\n");
|
|
}
|
|
|
|
void discover_new_producers(void)
|
|
{
|
|
/* If there is some new thread for the write barrier */
|
|
if(&assoc_tmp != assoc_tmp.next)
|
|
{
|
|
/* printf("Adding a new set of producers\n"); */
|
|
pthread_mutex_lock(&assoc_lock);
|
|
/*
|
|
* list in assoc_tmp is inserted between assoc_root
|
|
* and the first elements of assoc_root list
|
|
*/
|
|
assoc_root.next->prev = assoc_tmp.prev;
|
|
assoc_tmp.prev->next = assoc_root.next;
|
|
assoc_root.next = assoc_tmp.next;
|
|
assoc_root.next->prev = &assoc_root;
|
|
/*
|
|
* assoc_tmp temporary list has been copied in
|
|
* assoc_root list. assoc_tmp is now alone and so
|
|
* double linked to itself
|
|
*/
|
|
assoc_tmp.prev = &assoc_tmp;
|
|
assoc_tmp.next = &assoc_tmp;
|
|
pthread_mutex_unlock(&assoc_lock);
|
|
}
|
|
}
|