#if defined(__i386__)
inline int test_and_set(volatile unsigned int *addr) {
- int oldval;
- /* Note: the "xchg" instruction does not need a "lock" prefix */
- __asm__ __volatile__("xchgl %0, %1"
- : "=r"(oldval), "=m"(*(addr))
- : "0"(1), "m"(*(addr)));
- return oldval;
+ int oldval;
+ /* Note: the "xchg" instruction does not need a "lock" prefix */
+ __asm__ __volatile__ ("xchgl %0, %1"
+ : "=r" (oldval), "=m" (*(addr))
+ : "0" (1), "m" (*(addr)));
+ return oldval;
}
inline void UnLock(volatile unsigned int *addr) {
- int oldval;
- /* Note: the "xchg" instruction does not need a "lock" prefix */
- __asm__ __volatile__("xchgl %0, %1"
- : "=r"(oldval), "=m"(*(addr))
- : "0"(0), "m"(*(addr)));
+ int oldval;
+ /* Note: the "xchg" instruction does not need a "lock" prefix */
+ __asm__ __volatile__ ("xchgl %0, %1"
+ : "=r" (oldval), "=m" (*(addr))
+ : "0" (0), "m" (*(addr)));
}
#elif
# error need implementation of test_and_set
printf("Calloc error at %s line %d\n", __FILE__, __LINE__);
return NULL;
}
-
+
socknode_t **nodelist;
if ((nodelist = calloc(size, sizeof(socknode_t *))) < 0) {
printf("Calloc error at %s line %d\n", __FILE__, __LINE__);
free(sockhash);
return NULL;
}
-
+
sockhash->table = nodelist;
sockhash->inuse = NULL;
sockhash->size = size;
sockhash->mask = size - 1;
sockhash->mylock=0;
-
+
return sockhash;
}
socknode_t **ptr;
int key = mid&(sockhash->mask);
int sd;
-
+
Lock(&sockhash->mylock);
ptr=&(sockhash->table[key]);
-
+
while(*ptr!=NULL) {
if (mid == (*ptr)->mid) {
socknode_t *tmp=*ptr;
socknode_t **ptr;
int key = mid&(sockhash->mask);
int sd;
-
+
ptr=&(sockhash->table[key]);
-
+
while(*ptr!=NULL) {
if (mid == (*ptr)->mid) {
socknode_t *tmp=*ptr;
socknode_t **ptr;
int key = mid&(sockhash->mask);
int sd;
-
+
ptr=&(sockhash->table[key]);
-
+
while(*ptr!=NULL) {
if (mid == (*ptr)->mid) {
return (*ptr)->sd;
socknode_t **ptr;
int key = mid&(sockhash->mask);
int sd;
-
+
Lock(&sockhash->mylock);
ptr=&(sockhash->table[key]);
while(*ptr!=NULL) {
}
void insToListWithLock(sockPoolHashTable_t *sockhash, socknode_t *inusenode) {
- Lock(&sockhash->mylock);
- inusenode->next = sockhash->inuse;
- sockhash->inuse = inusenode;
- UnLock(&sockhash->mylock);
-}
+ Lock(&sockhash->mylock);
+ inusenode->next = sockhash->inuse;
+ sockhash->inuse = inusenode;
+ UnLock(&sockhash->mylock);
+}
void freeSock(sockPoolHashTable_t *sockhash, unsigned int mid, int sd) {
- int key = mid&(sockhash->mask);
- socknode_t *ptr = sockhash->inuse;
- sockhash->inuse = ptr->next;
- ptr->mid = mid;
- ptr->sd = sd;
- ptr->next = sockhash->table[key];
- sockhash->table[key] = ptr;
+ int key = mid&(sockhash->mask);
+ socknode_t *ptr = sockhash->inuse;
+ sockhash->inuse = ptr->next;
+ ptr->mid = mid;
+ ptr->sd = sd;
+ ptr->next = sockhash->table[key];
+ sockhash->table[key] = ptr;
}
void freeSockWithLock(sockPoolHashTable_t *sockhash, unsigned int mid, int sd) {
int key = mid&(sockhash->mask);
socknode_t *ptr;
Lock(&sockhash->mylock);
- ptr = sockhash->inuse;
+ ptr = sockhash->inuse;
sockhash->inuse = ptr->next;
ptr->mid = mid;
ptr->sd = sd;
#if 0
/***************************************
- * Array Implementation for socket reuse
+ * Array Implementation for socket reuse
****************************************/
int num_machines;
sock_pool_t *initSockPool(unsigned int *mid, int machines) {
- sock_pool_t *sockpool;
- num_machines = machines;
- if ((sockpool = calloc(num_machines, sizeof(sock_pool_t))) < 0) {
- printf("%s(), Calloc error at %s, line %d\n", __func__, __FILE__, __LINE__);
- return NULL;
+ sock_pool_t *sockpool;
+ num_machines = machines;
+ if ((sockpool = calloc(num_machines, sizeof(sock_pool_t))) < 0) {
+ printf("%s(), Calloc error at %s, line %d\n", __func__, __FILE__, __LINE__);
+ return NULL;
+ }
+ int i;
+ for (i = 0; i < num_machines; i++) {
+ if ((sockpool[i].sd = calloc(MAX_CONN_PER_MACHINE, sizeof(int))) < 0) {
+ printf("%s(), Calloc error at %s, line %d\n", __func__, __FILE__, __LINE__);
+ return NULL;
}
- int i;
- for (i = 0; i < num_machines; i++) {
- if ((sockpool[i].sd = calloc(MAX_CONN_PER_MACHINE, sizeof(int))) < 0) {
- printf("%s(), Calloc error at %s, line %d\n", __func__, __FILE__, __LINE__);
- return NULL;
- }
- if ((sockpool[i].inuse = calloc(MAX_CONN_PER_MACHINE, sizeof(char))) < 0) {
- printf("%s(), Calloc error at %s, line %d\n", __func__, __FILE__, __LINE__);
- return NULL;
- }
- sockpool[i].mid = mid[i];
- int j;
- for(j = 0; j < MAX_CONN_PER_MACHINE; j++) {
- sockpool[i].sd[j] = -1;
- }
+ if ((sockpool[i].inuse = calloc(MAX_CONN_PER_MACHINE, sizeof(char))) < 0) {
+ printf("%s(), Calloc error at %s, line %d\n", __func__, __FILE__, __LINE__);
+ return NULL;
}
+ sockpool[i].mid = mid[i];
+ int j;
+ for(j = 0; j < MAX_CONN_PER_MACHINE; j++) {
+ sockpool[i].sd[j] = -1;
+ }
+ }
- return sockpool;
+ return sockpool;
}
int getSock(sock_pool_t *sockpool, unsigned int mid) {
- int i;
- for (i = 0; i < num_machines; i++) {
- if (sockpool[i].mid == mid) {
- int j;
- for (j = 0; j < MAX_CONN_PER_MACHINE; j++) {
- if (sockpool[i].sd[j] != -1 && (sockpool[i].inuse[j] == 0)) {
- sockpool[i].inuse[j] = 1;
- return sockpool[i].sd[j];
- }
- if (sockpool[i].sd[j] == -1) {
- //Open Connection
- int sd;
- if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- printf("%s() Error: In creating socket at %s, %d\n", __func__, __FILE__, __LINE__);
- return -1;
- }
- struct sockaddr_in remoteAddr;
- bzero(&remoteAddr, sizeof(remoteAddr));
- remoteAddr.sin_family = AF_INET;
- remoteAddr.sin_port = htons(LISTEN_PORT);
- remoteAddr.sin_addr.s_addr = htonl(mid);
-
- if(connect(sd, (struct sockaddr *)&remoteAddr, sizeof(remoteAddr)) < 0) {
- printf("%s(): Error %d connecting to %s:%d\n", __func__, errno, inet_ntoa(remoteAddr.sin_addr), LISTEN_PORT);
- close(sd);
- return -1;
- }
- sockpool[i].sd[j] = sd;
- sockpool[i].inuse[j] = 1;
- return sockpool[i].sd[j];
- }
- }
- printf("%s()->Error: Less number of MAX_CONN_PER_MACHINE\n", __func__);
- return -1;
- }
+ int i;
+ for (i = 0; i < num_machines; i++) {
+ if (sockpool[i].mid == mid) {
+ int j;
+ for (j = 0; j < MAX_CONN_PER_MACHINE; j++) {
+ if (sockpool[i].sd[j] != -1 && (sockpool[i].inuse[j] == 0)) {
+ sockpool[i].inuse[j] = 1;
+ return sockpool[i].sd[j];
+ }
+ if (sockpool[i].sd[j] == -1) {
+ //Open Connection
+ int sd;
+ if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+ printf("%s() Error: In creating socket at %s, %d\n", __func__, __FILE__, __LINE__);
+ return -1;
+ }
+ struct sockaddr_in remoteAddr;
+ bzero(&remoteAddr, sizeof(remoteAddr));
+ remoteAddr.sin_family = AF_INET;
+ remoteAddr.sin_port = htons(LISTEN_PORT);
+ remoteAddr.sin_addr.s_addr = htonl(mid);
+
+ if(connect(sd, (struct sockaddr *)&remoteAddr, sizeof(remoteAddr)) < 0) {
+ printf("%s(): Error %d connecting to %s:%d\n", __func__, errno, inet_ntoa(remoteAddr.sin_addr), LISTEN_PORT);
+ close(sd);
+ return -1;
+ }
+ sockpool[i].sd[j] = sd;
+ sockpool[i].inuse[j] = 1;
+ return sockpool[i].sd[j];
+ }
+ }
+ printf("%s()->Error: Less number of MAX_CONN_PER_MACHINE\n", __func__);
+ return -1;
}
- printf("%s()-> Error: Machine id not found\n", __func__);
+ }
+ printf("%s()-> Error: Machine id not found\n", __func__);
- return -1;
+ return -1;
}
int freeSock(sock_pool_t *sockpool, int sd) {
- int i;
- for (i = 0; i < num_machines; i++) {
- int j;
- for (j = 0; j < MAX_CONN_PER_MACHINE; j++) {
- if (sockpool[i].sd[j] == sd) {
- sockpool[i].inuse[j] = 0;
- return 0;
- }
- }
+ int i;
+ for (i = 0; i < num_machines; i++) {
+ int j;
+ for (j = 0; j < MAX_CONN_PER_MACHINE; j++) {
+ if (sockpool[i].sd[j] == sd) {
+ sockpool[i].inuse[j] = 0;
+ return 0;
+ }
}
- printf("%s() Error: Illegal socket descriptor %d\n", __func__, sd);
+ }
+ printf("%s() Error: Illegal socket descriptor %d\n", __func__, sd);
- return -1;
+ return -1;
}
#endif