void *mqueuebatch_reader_next(struct reader_result *res) { return mqueue_reader_next(res); }
void * downstream(void *param){ struct processappdata * pad = (struct processappdata *)param; struct sockets_buffer * sockbuffer = processappadata_getsocketbuffer(pad); int * activefds = NULL; struct mqueue * mqueue = NULL; int len = 0; int i,j; int count = 0; struct reader_result res; struct encodeprotocol_respond * epr = NULL; unsigned char * content = NULL; int contentlen = 0; int writelen = 0; int fd; for(;;){ activefds = sockets_buffer_getdownstreamsignal(sockbuffer); len = *activefds; for(i = 0; i < len; ++i){ fd = activefds[i+1]; mqueue = sockets_buffer_getwritequeue(sockbuffer, fd); if(mqueue == NULL){ continue; } if((count = mqueue_reader_parpare(mqueue, &res)) > 0){ for(j = 0; j < count; ++j){ epr = (struct encodeprotocol_respond *)mqueue_reader_next(&res); if(epr != NULL){ switch(epr->messagetype){ case RES_LOGIN: content= encodeprotocol_respondlogin(epr->message.respondlogin, contentlen); break; case RES_HEARTBEAT: content = encodeprotocol_respondheartbeat(epr->message.respondheartbeat, contentlen); break; case RES_POSITION: content = encodeprotocol_positioninfo(epr->message.postioninfo, contentlen); break; case RES_COMMUNICATION: content = encodeprotocol_communicationinfo(epr->message.communicationinfo, contentlen); break; case RES_COMMUNICATIONRECEIPT: content = encodeprotocol_communicationreceipt(epr->message.communicationreceipt, contentlen); break; case RES_SENDFEEDBACK: content = encodeprotocol_sendfeedback(epr->message.sendfeedback, contentlen); break; } int ret; writelen = 0; while(writelen < contentlen){ ret = write(fd, content, contentlen); if(ret < 0 && errno != EAGAIN){ sockets_buffer_del(sockbuffer, fd); processappdata_delete(pad, fd); close(fd); fprintf(stdout, "close connect %d\n", fd); break; } writelen += ret; } free(content); content = NULL; encodeprotocol_clear(epr); } } mqueue_reader_commit(mqueue, &res); } } free(activefds); } return NULL; }