Beispiel #1
0
void masterconn_disconnection_check(void) {
    masterconn *eptr = masterconnsingleton;
    in_packetstruct *ipptr,*ipaptr;
    out_packetstruct *opptr,*opaptr;

    if (eptr->mode == KILL) {
        masterconn_beforeclose(eptr);
        tcpclose(eptr->sock);
        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);
        }
        eptr->mode = FREE;
    }
}
Beispiel #2
0
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;
    }
}
Beispiel #3
0
void masterconn_desc(int epoll_fd) {
	serventry *eptr;
	packetstruct *pptr,*paptr;
	int ret;	
	struct epoll_event ev_listen,ev_first,ev;

	if(ismaster()) {
		return;
	}

	//set up listen socket for connection with sync thread
	if (listen_add==0) {
		master_listen = (serventry *)malloc(sizeof(serventry));
		eptr = master_listen;
                eptr->sock = lsock;
                eptr->mode = HEADER;
		eptr->logfd = NULL;
		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->lastread = eptr->lastwrite = get_current_time();

		eptr->listen_sock = 1;
		eptr->connection = 3;
		
                ev_listen.data.ptr = eptr;
                ev_listen.events = EPOLLIN;
                ret = epoll_ctl(epoll_fd,EPOLL_CTL_ADD,lsock,&ev_listen);
                if(ret!=0) {
                        MFSLOG(LOG_NOTICE,"epoll_ctl error");
                }	
		listen_add = 1;
	}
	//first connect master
	if (first_add==0) {
		eptr = masterconnsingleton;
		ev_first.data.ptr = eptr;
		ev_first.events = EPOLLIN|EPOLLOUT;
                ret = epoll_ctl(epoll_fd,EPOLL_CTL_ADD,eptr->sock,&ev_first);
		if(ret!=0) {
                        MFSLOG(LOG_NOTICE,"epoll_ctl error");
                }
		first_add = 1;
	}
	//destroy first connection
	if (masterconnsingleton != NULL) {
		eptr = masterconnsingleton;
		if (eptr->mode == KILL) {
			ev.data.ptr = eptr;
	
	               	masterconn_beforeclose(eptr);

				/**
				  * we should epoll del the fd first, then close the fd
				  * otherwise, the  epoll_ctl(EPOLL_CTL_DEL)
				  * will not find it in files_struct
				  *
				  * Dongyang Zhang 
				  */			
				epoll_ctl(epoll_fd,EPOLL_CTL_DEL,eptr->sock,&ev);					
	               	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;
			free(masterconnsingleton);
			masterconnsingleton = NULL;
	       	}
	}

	if (master_listen != NULL) {
		eptr = master_listen;
		if (eptr->mode == KILL) {
	                ev.data.ptr = eptr;
	
	                masterconn_beforeclose(eptr);
                	  epoll_ctl(epoll_fd,EPOLL_CTL_DEL,eptr->sock,&ev);					
	                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;
			free(master_listen);
			master_listen = NULL;
        	}
	}

	if (master_serve != NULL) {
		eptr = master_serve;
                ev.data.ptr = eptr;
                ev.events = EPOLLIN;
                if (eptr->outputhead != NULL && eptr->mode != KILL) {
                        ev.events = EPOLLIN | EPOLLOUT;
                }
                ret = epoll_ctl(epoll_fd,EPOLL_CTL_MOD,eptr->sock,&ev);
                if(ret!=0) {
                        MFSLOG(LOG_NOTICE,"epoll_ctl error 2");
                }   
	        if (eptr->mode == KILL) {
	                ev.data.ptr = eptr;

        	        masterconn_beforeclose(eptr);
                	epoll_ctl(epoll_fd,EPOLL_CTL_DEL,eptr->sock,&ev);					
                	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;
			free(master_serve);
			master_serve = NULL;
        	}
	}
}