void *erl_message_read_loop(void *arg_data) { thread_data_t *data = (thread_data_t *)arg_data; ErlMessage emsg; // Incoming message unsigned char buf[BUFSIZE]; // Buffer for incoming message int got; // Result of receive ETERM *fromp, *tuplep, *fun, *arg, *resp; // Erlang terms int loop = 1; // Loop flag char *f_name_atom; int q_num; int i = 0, temp; q_data_t *q_data[MAX_Q_NUMS]; // Per queue data response_t r; /* Exepected Erlang term: {from_pid(), {fun_name_atom, argument}}} or {from_pid(), {fun_name_atom, argument1, argument2}}} and returned term: {call_state, response} */ syslog(LOG_NOTICE,"[%d] Connection with node: %s\n\r",data->idx, data->node); for(i = 0; i < MAX_Q_NUMS; i++) { q_data[i] = malloc(sizeof(q_data_t)); q_data[i]->q_num = -1; q_data[i]->h = NULL; q_data[i]->qh = NULL; q_data[i]->pid = 0; } pthread_setname_np(pthread_self(), "msg_read_loop"); while (loop) { got = erl_receive_msg(data->fd, buf, BUFSIZE, &emsg); switch (got) { case ERL_TICK: syslog(LOG_NOTICE,"[%d] %s tick\n\r",data->idx, data->node); break; case ERL_ERROR: syslog(LOG_NOTICE,"[%d] %s erl_receive_msg error or node down\n\r",data->idx, data->node); loop = 0; break; case ERL_MSG: if (emsg.type == ERL_REG_SEND || emsg.type == ERL_SEND) { fromp = erl_element(1, emsg.msg); tuplep = erl_element(2, emsg.msg); fun = erl_element(1, tuplep); arg = erl_element(2, tuplep); f_name_atom = ERL_ATOM_PTR(fun); syslog(LOG_NOTICE,"[%d] %s %s()\n\r", data->idx, data->node, f_name_atom); if(strcmp(f_name_atom, "create_queue") == 0) { q_num = ERL_INT_VALUE(arg); r = create_queue(q_num, q_data, data); } else if(strcmp(f_name_atom, "destroy_queue") == 0) { q_num = ERL_INT_VALUE(arg); r = destroy_queue(q_num, q_data, data); } else if(strcmp(f_name_atom, "queue_list") == 0) { r = queue_list(q_data); } else if(strcmp(f_name_atom, "set_mode") == 0) { temp = ERL_INT_VALUE(arg); r = set_mode(temp, tuplep, q_data, data); } else if(strcmp(f_name_atom, "set_queue_len") == 0) { temp = ERL_INT_VALUE(arg); r = set_queue_len(temp, tuplep, q_data, data); } else if(strcmp(f_name_atom, "read_pkt_start") == 0) { q_num = ERL_INT_VALUE(arg); r = read_pkt_start(q_num, q_data, data); } else if(strcmp(f_name_atom, "read_pkt_stop") == 0) { q_num = ERL_INT_VALUE(arg); r = read_pkt_stop(q_num, q_data, data); } else { r.cs = erl_mk_atom("error"); r.rsp = erl_mk_estring("no such function", strlen("no such function")); } if ((resp = erl_format("{cnode, {reply, {~w, ~w}}}", r.cs, r.rsp)) != NULL) { if(!erl_send(data->fd, fromp, resp)) { syslog(LOG_ERR,"[%d] %s send reply error, exit loop\n\r", data->idx, data->node); loop = 0; } } else { syslog(LOG_ERR,"[%d] %s term format error\n\r", data->idx, data->node); loop = 0; } erl_free_term(emsg.from); erl_free_term(emsg.msg); erl_free_term(fromp); erl_free_term(tuplep); erl_free_term(fun); erl_free_term(arg); erl_free_term(resp); erl_free_term(r.rsp); erl_free_term(r.cs); } break; default: syslog(LOG_ERR,"[%d] %s something wrong! :(\n\r", data->idx, data->node); loop = 0; break; } } /* while */ for(i = 0; i < MAX_Q_NUMS; i++) { if(q_data[i]->pid > 0) pthread_cancel(q_data[i]->thread); if (q_data[i]->q_num >= 0) { nfq_destroy_queue(q_data[i]->qh); nfq_close(q_data[i]->h); } free(q_data[i]); } syslog(LOG_ERR,"[%d] %s thread stop\n\r", data->idx, data->node); free(data->node); free(data); pthread_exit(NULL); }
/*JSON{ "type" : "method", "class" : "Queue", "name" : "log", "generate" : "jswrap_Queue_log" } logs list of queues */ void jswrap_Queue_log(JsVar *parent) { queue_list(); return; }
int syscall_que_list(int start, int count, void *qlist) { return queue_list(start, count, qlist); }
void schedule_list() { queue_list(&main_queue); }