#include "socialize/ctl.h"
#include "socialize/utils.h"
-struct CHANNEL_CONTEXT CHAN_CTX[MAX_CONN];
-struct SOCK_CONTEXT SOCK_CTX[MAX_CONN];
+// TODO:
+// rehashing
int make_socket_non_blocking (int sfd){
struct SOCK_CONTEXT* ctx;
- pthread_mutex_lock(&SOCK_CTX[i].lock);
+ struct SOCK_CONTEXT_LOCK* ctxlock;
- ctx = &SOCK_CTX[i];
+ spinlock_lock(&SOCK_CTL.slock);
+
+ ctx = SOCK_CTL.SOCK_CTX[i];
+
+ ctxlock = SOCK_CTL.SOCK_CTX_LOCK[i];
+
+ spinlock_unlock(&SOCK_CTL.slock);
+
+ pthread_mutex_lock(&ctxlock->lock);
while(ctx != NULL){
if(ctx->sockfd == fd){
- pthread_mutex_unlock(&SOCK_CTX[i].lock);
+ pthread_mutex_unlock(&ctxlock->lock);
return ctx;
}
- pthread_mutex_unlock(&SOCK_CTX[i].lock);
+ pthread_mutex_unlock(&ctxlock->lock);
+
//free(ctx);
struct SOCK_CONTEXT* ctx = NULL;
- pthread_mutex_lock(&SOCK_CTX[i].lock);
+ struct SOCK_CONTEXT_LOCK* ctxlock = NULL;
+
+ spinlock_lock(&SOCK_CTL.slock);
+
+ ctx = SOCK_CTL.SOCK_CTX[i];
- ctx = &SOCK_CTX[i];
+ ctxlock = SOCK_CTL.SOCK_CTX_LOCK[i];
+
+ spinlock_unlock(&SOCK_CTL.slock);
+
+ pthread_mutex_lock(&ctxlock->lock);
while(ctx != NULL){
ctx->chan_idx = -1;
ctx->allocated = 1;
- pthread_mutex_unlock(&SOCK_CTX[i].lock);
+ pthread_mutex_unlock(&ctxlock->lock);
return i;
}
- pthread_mutex_unlock(&SOCK_CTX[i].lock);
+ pthread_mutex_unlock(&ctxlock->lock);
return -1;
}
struct SOCK_CONTEXT* ctx = NULL;
- pthread_mutex_lock(&SOCK_CTX[i].lock);
+ struct SOCK_CONTEXT_LOCK* ctxlock = NULL;
+
+ spinlock_lock(&SOCK_CTL.slock);
+
+ ctx = SOCK_CTL.SOCK_CTX[i];
- ctx = &SOCK_CTX[i];
+ ctxlock = SOCK_CTL.SOCK_CTX_LOCK[i];
+
+ spinlock_unlock(&SOCK_CTL.slock);
+
+ pthread_mutex_lock(&ctxlock->lock);
while(ctx != NULL){
ctx->sockfd = 0;
ctx->allocated = 0;
- pthread_mutex_unlock(&SOCK_CTX[i].lock);
+ pthread_mutex_unlock(&ctxlock->lock);
return 0;
}
}
- pthread_mutex_unlock(&SOCK_CTX[i].lock);
+ pthread_mutex_unlock(&ctxlock->lock);
return -1;
}
+
+static inline bool atomic_compare_exchange(int* ptr, int compare, int exchange) {
+ return __atomic_compare_exchange_n(ptr, &compare, exchange,
+ 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
+}
+
+static inline void atomic_store(int* ptr, int value) {
+ __atomic_store_n(ptr, 0, __ATOMIC_SEQ_CST);
+}
+
+static inline int atomic_add_fetch(int* ptr, int d) {
+ return __atomic_add_fetch(ptr, d, __ATOMIC_SEQ_CST);
+}
+
+
+void spinlock_init(struct spinlock* spinlock) {
+ atomic_store(&spinlock->locked, 0);
+}
+
+void spinlock_lock(struct spinlock* spinlock) {
+ while (!atomic_compare_exchange(&spinlock->locked, 0, 1)) {
+ }
+}
+
+void spinlock_unlock(struct spinlock* spinlock) {
+ atomic_store(&spinlock->locked, 0);
+}
char CA_PUB[MAX_PW_LEN] = {0};
-int init_all(){
+struct CHANNEL_CONTEXT CHAN_CTX[MAX_CONN];
+
+// struct SOCK_CONTEXT SOCK_CTX[MAX_CONN];
- for(int i = 0 ; i < MAX_CONN; i++){
+struct SOCK_CTL SOCK_CTL;
+
+int init_all(){
- pthread_mutex_init(&SOCK_CTX[i].lock, NULL);
+ for(int i = 0 ; i < MAX_CONN;i ++){
+
+ CHAN_CTX[i].ssl = NULL;
+ CHAN_CTX[i].ctx = NULL;
- SOCK_CTX[i].next = NULL;
}
- // TODO:
- // init bucket
+
+ spinlock_init(&SOCK_CTL.slock);
+
+ SOCK_CTL.SOCK_CTX = (struct SOCK_CONTEXT**)malloc(MAX_CONN * sizeof(struct SOCK_CONTEXT*));
+
+ SOCK_CTL.SOCK_CTX_LOCK = (struct SOCK_CONTEXT_LOCK**)malloc(MAX_CONN * sizeof(struct SOCK_CONTEXT_LOCK*));
+
+ for(int i = 0; i < MAX_CONN; i++){
+
+ SOCK_CTL.SOCK_CTX[i] = (struct SOCK_CONTEXT*)malloc(sizeof(struct SOCK_CONTEXT));
+
+ SOCK_CTL.SOCK_CTX_LOCK[i] = (struct SOCK_CONTEXT_LOCK*)malloc(sizeof(struct SOCK_CONTEXT_LOCK));
+
+ memset(SOCK_CTL.SOCK_CTX[i], 0, sizeof(struct SOCK_CONTEXT));
+
+ pthread_mutex_init(&SOCK_CTL.SOCK_CTX_LOCK[i]->lock, NULL);
+
+ }
return 0;
}
struct sockaddr_in SERVADDR;
- for(int i = 0 ; i < MAX_CONN;i ++){
-
- CHAN_CTX[i].ssl = NULL;
- CHAN_CTX[i].ctx = NULL;
-
-
- }
-
//signal(SIGPIPE, SIG_IGN);