void masterconn_term(void) { masterconn *eptr = masterconnsingleton; in_packetstruct *ipptr,*ipaptr; out_packetstruct *opptr,*opaptr; if (eptr->mode!=FREE) { tcpclose(eptr->sock); if (eptr->mode!=CONNECTING) { if (eptr->input_packet) { free(eptr->input_packet); } ipptr = eptr->inputhead; while (ipptr) { ipaptr = ipptr; ipptr = ipptr->next; free(ipaptr); } opptr = eptr->outputhead; while (opptr) { opaptr = opptr; opptr = opptr->next; free(opaptr); } } } masterconn_read(NULL,0.0); // free internal read buffer free(eptr); free(MasterHost); free(MasterPort); free(BindHost); masterconnsingleton = NULL; }
void masterconn_serve(struct pollfd *pdesc) { double now; masterconn *eptr = masterconnsingleton; now = monotonic_seconds(); if (eptr->mode==CONNECTING) { if (eptr->sock>=0 && eptr->pdescpos>=0 && (pdesc[eptr->pdescpos].revents & (POLLOUT | POLLHUP | POLLERR))) { // FD_ISSET(eptr->sock,wset)) { masterconn_connecttest(eptr); } } else { if (eptr->pdescpos>=0) { if ((pdesc[eptr->pdescpos].revents & (POLLERR|POLLIN))==POLLIN && eptr->mode==DATA) { masterconn_read(eptr,now); } if (pdesc[eptr->pdescpos].revents & (POLLERR|POLLHUP)) { eptr->input_end = 1; } masterconn_parse(eptr); } if (eptr->mode==DATA && eptr->lastwrite+(Timeout/3.0)<now && eptr->outputhead==NULL) { masterconn_createpacket(eptr,ANTOAN_NOP,0); } if (eptr->pdescpos>=0) { if ((((pdesc[eptr->pdescpos].events & POLLOUT)==0 && (eptr->outputhead)) || (pdesc[eptr->pdescpos].revents & POLLOUT)) && eptr->mode==DATA) { masterconn_write(eptr,now); } } if (eptr->mode==DATA && eptr->lastread+Timeout<now) { eptr->mode = KILL; } } masterconn_disconnection_check(); }
void masterconn_serve(struct pollfd *pdesc) { uint32_t now=main_time(); packetstruct *pptr,*paptr; masterconn *eptr = masterconnsingleton; if (eptr->pdescpos>=0 && (pdesc[eptr->pdescpos].revents & (POLLHUP | POLLERR))) { if (eptr->mode==CONNECTING) { masterconn_connecttest(eptr); } else { eptr->mode = KILL; } } if (eptr->mode==CONNECTING) { if (eptr->sock>=0 && eptr->pdescpos>=0 && (pdesc[eptr->pdescpos].revents & POLLOUT)) { // FD_ISSET(eptr->sock,wset)) { masterconn_connecttest(eptr); } } else { if (eptr->pdescpos>=0) { if ((eptr->mode==HEADER || eptr->mode==DATA) && (pdesc[eptr->pdescpos].revents & POLLIN)) { // FD_ISSET(eptr->sock,rset)) { eptr->lastread = now; masterconn_read(eptr); } if ((eptr->mode==HEADER || eptr->mode==DATA) && (pdesc[eptr->pdescpos].revents & POLLOUT)) { // FD_ISSET(eptr->sock,wset)) { eptr->lastwrite = now; masterconn_write(eptr); } if ((eptr->mode==HEADER || eptr->mode==DATA) && eptr->lastread+Timeout<now) { eptr->mode = KILL; } if ((eptr->mode==HEADER || eptr->mode==DATA) && eptr->lastwrite+(Timeout/3)<now && eptr->outputhead==NULL) { masterconn_createpacket(eptr,ANTOAN_NOP,0); } } } if (eptr->mode == KILL) { masterconn_beforeclose(eptr); tcpclose(eptr->sock); if (eptr->inputpacket.packet) { free(eptr->inputpacket.packet); } pptr = eptr->outputhead; while (pptr) { if (pptr->packet) { free(pptr->packet); } paptr = pptr; pptr = pptr->next; free(paptr); } eptr->mode = FREE; } }
void masterconn_serve(int epoll_fd,int count,struct epoll_event *pdesc) { //uint32_t now=main_time(); serventry *weptr = NULL,*eptr = NULL; int ns; int ret; struct epoll_event ev; if(ismaster()) { return; } weptr = (serventry *)pdesc[count].data.ptr; if ((weptr->listen_sock == 1) && (pdesc[count].events & EPOLLIN) && (weptr->mode != KILL)) { ns = tcpaccept(lsock); if (ns<0) { MFSLOG(LOG_INFO,"master sync thread<->shadow master socket: accept error: %m"); } else { tcpnonblock(ns); tcpnodelay(ns); master_serve = (serventry *)malloc(sizeof(serventry)); eptr = master_serve; eptr->sock = ns; eptr->mode = HEADER; eptr->lastread = eptr->lastwrite = get_current_time(); eptr->inputpacket.next = NULL; eptr->inputpacket.bytesleft = 8; eptr->inputpacket.startptr = eptr->hdrbuff; eptr->inputpacket.packet = NULL; eptr->outputhead = NULL; eptr->outputtail = &(eptr->outputhead); eptr->downloading = 0; eptr->metafd=-1; eptr->logfd=NULL; eptr->listen_sock = 0; eptr->connection = 3; ev.data.ptr = eptr; ev.events = EPOLLIN; ret = epoll_ctl(epoll_fd,EPOLL_CTL_ADD,ns,&ev); if (ret < 0) { MFSLOG(LOG_NOTICE,"add epoll fail"); } } } if (weptr->listen_sock == 0) { if (weptr->mode == CONNECTING) { if (pdesc[count].events & (EPOLLHUP | EPOLLERR)) { masterconn_connecttest(weptr); } if (pdesc[count].events & EPOLLOUT) { masterconn_connecttest(weptr); } } else { if ((pdesc[count].events & (EPOLLHUP | EPOLLERR)) && (weptr->mode != KILL)) { MFSLOG(LOG_NOTICE, "set to NULL"); weptr->mode = KILL; } if ((weptr->mode==HEADER || weptr->mode==DATA) && (pdesc[count].events & EPOLLIN)) { // FD_ISSET(eptr->sock,rset)) { masterconn_read(weptr); weptr->lastread = get_current_time(); } if ((weptr->mode==HEADER || weptr->mode==DATA) && (pdesc[count].events & EPOLLOUT)) { // FD_ISSET(eptr->sock,wset)) { masterconn_write(weptr); weptr->lastwrite = get_current_time(); } if ((weptr->mode==HEADER || weptr->mode==DATA) && weptr->lastread+Timeout<get_current_time()) { MFSLOG(LOG_NOTICE, "set to NULL"); weptr->mode = KILL; } if ((weptr->mode==HEADER || weptr->mode==DATA) && weptr->lastwrite+5<get_current_time() && weptr->outputhead==NULL) { masterconn_createpacket(weptr,ANTOAN_NOP,0); } } } }