void insertSparseGVarientTableMonte(SparseGVarientTableMonte *table,GControlInfoMonte *element,const int row,const int col)
{
	SparseGControlInfoMonte *rowTarget = table->rowIndex[row];
	SparseGControlInfoMonte *colTarget = table->colIndex[col];
	// set rowTarget
	while(rowTarget->rowLink != NULL)
	{
		if(rowTarget->rowLink->col >= col) break;
		else rowTarget = rowTarget->rowLink;
	}
	// set colTarget
	while(colTarget->colLink != NULL)
	{
		if(colTarget->colLink->row >= row) break;
		else colTarget = colTarget->colLink;
	}
	// allocate memory if necessary
	if(rowTarget->rowLink==NULL || rowTarget->rowLink->col!=col)
	{
		SparseGControlInfoMonte *insert = createSparseGControlInfoMonte();
		insert->row = row;
		insert->col = col;
		insert->rowLink = rowTarget->rowLink;
		insert->colLink = colTarget->colLink;
		// insert element into insert->queue
		gdsl_queue_insert(insert->queue,element);
		// update the information of target
		rowTarget->rowLink = insert;
		colTarget->colLink = insert;
	}
	else
	{
		gdsl_queue_insert(rowTarget->rowLink->queue,element);
	}
}
static void getInitSinkList(gdsl_queue_t freeSinkList, const ParallelETree *tree)
{
	int i;
	for(i=0;i<tree->size;i++)
//	for(i=tree->size-1;i>-1;i--)
	{
		if(tree->node[i]!=NULL)
		{
			if(tree->node[i]->type == lu)
			{
				gdsl_queue_insert(freeSinkList,&i);
			}
		}
	}
}
Beispiel #3
0
//Connect to the remote host
cnaccess_t * centernode_connect (centernode_t *cn, const char *host, uint16_t port, 
        cnaccess_t *a, int type, int isp)
{
    int fd = 0;
    struct sockaddr_in server;

    if ((fd = socket(PF_INET, SOCK_STREAM, 0)) == -1) 
    {
#ifdef CDNDEBUG
        LOG("ER", "create sock-(%d)%s.\n", errno, strerror(errno));
#endif
        return 0;
    }
    //nonblocking connect call
    fcntl(fd, F_SETFL, O_NONBLOCK | fcntl(fd, F_GETFL, 0));
    memset((uint8_t *)&server, 0, sizeof(server));
    server.sin_family = PF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = inet_addr(host);
    int r = connect(fd, (struct sockaddr *) &server, sizeof(server));
    if (r == -1  &&  errno != EINPROGRESS) 
    {
#ifdef CDNDEBUG
        LOG("ER", "conn to %s.%d-(%d)%s.\n", host, port, errno, strerror(errno));
#endif
        return (close(fd), NULL);
    }
    cnaccess_t *ca = a;
    if (ca) { /* reconnect */
        ca->fd = fd; 
        ca->interaction = time(0);
        strncpy(ca->host,host,strlen(host));
        ca->port = port;    
    } else ca = cnaccess_create(cn, fd, host, port, type, isp);
    if (r == -1 && ++ca->retry > 4)
        ca->retry = 1;
    ca->status = r ? NS_CONNECTING: NS_NORMAL;
    printf("cat %d\n", ca->status);
    pthread_mutex_lock(&cn->objlock), /* add it to sesstion table */
        gdsl_hash_insert(cn->accesses, ca);
    pthread_mutex_unlock(&cn->objlock);
    pthread_mutex_lock(&cn->reglock), /* register it to libevent */
        gdsl_queue_insert(cn->registration, INT2PTR(ca->fd)),
        pthread_mutex_unlock(&cn->reglock);
    return ca;
}
Beispiel #4
0
//create TCP server
cnaccess_t * centernode_server (centernode_t *cn, const char *host, uint16_t port, uint32_t type, int isp)
{
    int fd = 0;
    struct sockaddr_in self;
    printf("Host %s port %u\n", host, port);
    //Create listen socket
    if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
#ifdef CDNDEBUG
        LOG("WR", "ct sock(%d)%s.\n", errno, strerror(errno));
#endif
        return 0;
    }
    memset((uint8_t *)&self, 0, sizeof(self));
    self.sin_family = PF_INET;
    self.sin_port = htons(port);
    self.sin_addr.s_addr = inet_addr(host);
    int val = 1;
    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*)&val, sizeof(val)) == -1)
    {
#ifdef CDNDEBUG
        LOG("WR", "set SO_REUSEADDR option - (%d) %s.\n", errno, strerror(errno));
#endif
        return (close(fd), NULL);
    }
    if (bind(fd, (struct sockaddr *)&self, sizeof(self)) == -1)
    {
#ifdef CDNDEBUG
        LOG("WR", "bind the address %s.%d - (%d) %s.\n", host, port, 
                errno, strerror(errno));
#endif
        return (close(fd), NULL);
    }
    if (listen(fd, 200) < 0)
    {
#ifdef CDNDEBUG
        LOG("WR", "listen on %s.%d - (%d) %s.\n", host, port, errno, strerror(errno));
#endif
        return (close(fd), NULL);
    }
    cnaccess_t *ca = cnaccess_create(cn, fd, host, port, type, isp);
    gdsl_hash_insert(cn->accesses, ca);
    gdsl_queue_insert(cn->registration, INT2PTR(ca->fd));
    return ca;
}
Beispiel #5
0
SparseNetlistQuad *parseSparseQuadInput(SparseNetlistQuad *ptr, const char *filename)
{

	FILE *fp = fopen(filename,"r");
	char line[1024];
	char *status;
	int i,j,k;
	//==========================================================
	
	ptr->a = createSparseQuadMatrix(ptr->nodeNum,ptr->nodeNum,ptr->gvNum);
	ptr->b = createSparseQuadMatrix(ptr->nodeNum,ptr->nodeNum,ptr->gvNum);
	ptr->c = createSparseQuadMatrix(ptr->nodeNum,ptr->nodeNum,ptr->gvNum);
	ptr->u = createQuadMatrix(ptr->nodeNum,ptr->stepNum,ptr->gvNum);
	ptr->gVarientTable = createSparseGVarientTable(ptr->nodeNum,ptr->nodeNum);	
	
	gdsl_queue_t voltageInNode = gdsl_queue_alloc("voltageInNode",allocInt,freeInt);
	double maxG = 10;

	LinearNodeList *linearNodeList = createLinearNodeList();
	ptr->nonlinearNodeList = createNonlinearNodeList();

	while( (status=fgetl(line,1024,fp))!=NULL )
	{
		if(line[0] == 'G' || line[0] == 'g')
		{
			CircuitEntryQuad *circuit = createCircuitEntryQuad();
			setCircuitEntryQuad(circuit,line);
	
			QuadElement *tempQuadElement = createQuadElement(ptr->gvNum);
			const QuadElement *quadElementInList = getLinearNodeList(linearNodeList,circuit->val,circuit->alphaName,circuit->betaName,circuit->gammaName);
			if(quadElementInList == NULL)
			{
				tempQuadElement->m = circuit->val;
				tempQuadElement->alpha = getAlpha(circuit->alphaName);
			
				gsl_matrix *betaFromDlmread = gsl_matrix_alloc(ptr->gvNum,1);
				dlmread(betaFromDlmread,circuit->betaName," ",0,0,ptr->gvNum-1,0);
				gsl_matrix_to_double(tempQuadElement->beta,betaFromDlmread);
				gsl_matrix_free(betaFromDlmread);
			
				gsl_matrix *gammaFromDlmread = gsl_matrix_alloc(ptr->gvNum,ptr->gvNum);
				dlmread(gammaFromDlmread,circuit->gammaName," ",0,0,ptr->gvNum-1,ptr->gvNum-1);
				gsl_matrix_to_double(tempQuadElement->gamma,gammaFromDlmread);
				gsl_matrix_free(gammaFromDlmread);

				insertLinearNodeList(linearNodeList,circuit->val,circuit->alphaName,circuit->betaName,circuit->gammaName,tempQuadElement);
			}
			else
			{
				copyQuadElement(tempQuadElement,quadElementInList);
			}
			const int pos = toZeroBase(circuit->pos);
			const int neg = toZeroBase(circuit->neg);
			if(pos != -1)
			{
				decSparseQuadMatrix(ptr->a,tempQuadElement,pos,pos);
			}
			if(neg != -1)
			{
				decSparseQuadMatrix(ptr->a,tempQuadElement,neg,neg);
			}
			if(pos!=-1 && neg!=-1)
			{
				incSparseQuadMatrix(ptr->a,tempQuadElement,neg,pos);
				incSparseQuadMatrix(ptr->a,tempQuadElement,pos,neg);
			}
			
			if(abs(circuit->val) > maxG )	maxG = abs(circuit->val);
			freeCircuitEntryQuad(circuit);
			freeQuadElement(tempQuadElement);
		}		
		else if(line[0] == 'C' || line[0] == 'c')
		{
			CircuitEntryQuad *circuit = createCircuitEntryQuad();
			setCircuitEntryQuad(circuit,line);
			
			QuadElement *tempQuadElement = createQuadElement(ptr->gvNum);
			const QuadElement *quadElementInList = getLinearNodeList(linearNodeList,circuit->val,circuit->alphaName,circuit->betaName,circuit->gammaName);
			if(quadElementInList == NULL)
			{
				tempQuadElement->m = circuit->val;
				tempQuadElement->alpha = getAlpha(circuit->alphaName);
			
				gsl_matrix *betaFromDlmread = gsl_matrix_alloc(ptr->gvNum,1);
				dlmread(betaFromDlmread,circuit->betaName," ",0,0,ptr->gvNum-1,0);
				gsl_matrix_to_double(tempQuadElement->beta,betaFromDlmread);
				gsl_matrix_free(betaFromDlmread);
			
				gsl_matrix *gammaFromDlmread = gsl_matrix_alloc(ptr->gvNum,ptr->gvNum);
				dlmread(gammaFromDlmread,circuit->gammaName," ",0,0,ptr->gvNum-1,ptr->gvNum-1);
				gsl_matrix_to_double(tempQuadElement->gamma,gammaFromDlmread);
				gsl_matrix_free(gammaFromDlmread);

				insertLinearNodeList(linearNodeList,circuit->val,circuit->alphaName,circuit->betaName,circuit->gammaName,tempQuadElement);
			}
			else
			{
				copyQuadElement(tempQuadElement,quadElementInList);
			}
			const int pos = toZeroBase(circuit->pos);
			const int neg = toZeroBase(circuit->neg);
			if(pos != -1)
			{
				incSparseQuadMatrix(ptr->c,tempQuadElement,pos,pos);
			}
			if(neg != -1)
			{
				incSparseQuadMatrix(ptr->c,tempQuadElement,neg,neg);
			}
			if(pos!=-1 && neg!=-1)
			{
				decSparseQuadMatrix(ptr->c,tempQuadElement,pos,neg);
				decSparseQuadMatrix(ptr->c,tempQuadElement,neg,pos);
			}
			freeCircuitEntryQuad(circuit);
			freeQuadElement(tempQuadElement);
		}
		else if(line[0] =='V' || line[0] =='v')
		{
			CircuitEntryQuad *circuit = createCircuitEntryQuad();
			setVoltageIn(circuit,line);
			gsl_matrix *tempM = gsl_matrix_calloc(1,ptr->stepNum);
			gsl_matrix *tempAlpha = gsl_matrix_calloc(1,ptr->stepNum);
			gsl_matrix *tempBeta = gsl_matrix_calloc(ptr->gvNum,ptr->stepNum);
			gsl_matrix *tempGamma = gsl_matrix_calloc(ptr->gvNum*ptr->gvNum,ptr->stepNum);
			dlmread(tempM,circuit->mName,",",0,0,0,ptr->stepNum-1);
			dlmread(tempAlpha,circuit->alphaName,",",0,0,0,ptr->stepNum-1);
			dlmread(tempBeta,circuit->betaName,",",0,0,ptr->gvNum-1,ptr->stepNum-1);
			dlmread(tempGamma,circuit->gammaName,",",0,0,ptr->gvNum*ptr->gvNum-1,ptr->stepNum-1);	
			const int pos = toZeroBase(circuit->pos);
			const int neg = toZeroBase(circuit->neg);
			if(neg == -1)
			{
				// save the pos to the voltageInNode ~ used in pass 2 , to setup B
				gdsl_queue_insert(voltageInNode,&(circuit->pos));
				// for each step, set m, alpha, beta, and gamma
				for(i=0;i<ptr->stepNum;i++)
				{
					QuadElement *tempVin = createQuadElement(ptr->gvNum);
					gsl_matrix *betaVin = gsl_matrix_calloc(ptr->gvNum,1);
					gsl_matrix *gammaVin = gsl_matrix_calloc(ptr->gvNum,ptr->gvNum);
					// set beta
					for(j=0;j<ptr->gvNum;j++)
					{
						const double temp = gsl_matrix_get(tempBeta,j,i);
						gsl_matrix_set(betaVin,j,0,temp);
					}
					// set gamma
					for(j=0;j<ptr->gvNum;j++)
					{
						for(k=0;k<ptr->gvNum;k++)
						{
							const double temp = gsl_matrix_get(tempGamma,j*ptr->gvNum+k,i);
							gsl_matrix_set(gammaVin,j,k,temp);
						}
					}
					double *betaVinDouble = getMempoolSet(sizeof(double)*ptr->gvNum);
					double *gammaVinDouble = getMempoolSet(sizeof(double)*ptr->gvNum*ptr->gvNum);
					gsl_matrix_to_double(betaVinDouble,betaVin);
					gsl_matrix_to_double(gammaVinDouble,gammaVin);
					setQuadElement(tempVin,gsl_matrix_get(tempM,0,i),gsl_matrix_get(tempAlpha,0,i),betaVinDouble,gammaVinDouble);
					setQuadMatrix(ptr->u,tempVin,pos,i);
					freeQuadElement(tempVin);
					gsl_matrix_free(betaVin);
					gsl_matrix_free(gammaVin);
					retMempoolSet(betaVinDouble,sizeof(double)*ptr->gvNum);
					retMempoolSet(gammaVinDouble,sizeof(double)*ptr->gvNum*ptr->gvNum);
				}
			}
			else
			{
				fprintf(stderr,"voltage source does not connect to gnd\n");
			}
			gsl_matrix_free(tempM);
			gsl_matrix_free(tempAlpha);
			gsl_matrix_free(tempBeta);
			gsl_matrix_free(tempGamma);
			freeCircuitEntryQuad(circuit);
		}
		else if(line[0] == 'M' || line[0] =='m')
		{
			// ========================================================

			MosName *mosName = createMosName();
			setMosName(mosName,line);
			const NonlinearInfo *nonlinearNodeInList = getNonlinearNodeList(ptr->nonlinearNodeList,mosName->mName,mosName->alphaName,mosName->betaName,mosName->gammaName,mosName->configName);
			const NonlinearInfo *data = NULL;

			if(nonlinearNodeInList == NULL)
			{
				MosInfo *mosInfo = createAndSetMosInfo(mosName,ptr->gvNum);
				NonlinearInfo *input = createNonlinearInfo(mosInfo->vdsListSize,mosInfo->vgsListSize,mosInfo->vdsList,mosInfo->vgsList,mosInfo->ivTable,mosInfo->cgs,mosInfo->cgd);
				insertNonlinearNodeList(ptr->nonlinearNodeList,mosName->mName,mosName->alphaName,mosName->betaName,mosName->gammaName,mosName->configName,input);
				freeMosInfo(mosInfo);
				freeNonlinearInfo(input);
				data  = getNonlinearNodeList(ptr->nonlinearNodeList,mosName->mName,mosName->alphaName,mosName->betaName,mosName->gammaName,mosName->configName);
			}
			else
			{
				data = nonlinearNodeInList;
			}
			GControlInfo *newGControlInfo = createGControlInfo(data->vdsListSize,data->vgsListSize,ptr->gvNum);
			newGControlInfo->gate = mosName->gate;
			newGControlInfo->drain = mosName->drain;
			newGControlInfo->source = mosName->source;
			newGControlInfo->vdsList = data->vdsList;
			newGControlInfo->vgsList = data->vgsList;
			freeMosName(mosName);

			const int drain = toZeroBase(newGControlInfo->drain);
			const int gate = toZeroBase(newGControlInfo->gate);
			const int source = toZeroBase(newGControlInfo->source);
			
			newGControlInfo->type = gm;
			newGControlInfo->partialIdsVxs = data->partialIdsVgs;
			if(drain!=-1 && gate!=-1)
			{
				newGControlInfo->sign = -1;
				insertSparseGVarientTable(ptr->gVarientTable,newGControlInfo,drain,gate);
			}
			if(source!=-1)
			{
				newGControlInfo->sign = -1;
				insertSparseGVarientTable(ptr->gVarientTable,newGControlInfo,source,source);	
			}
			if(drain!=-1 && source!=-1)
			{
				newGControlInfo->sign = 1;
				insertSparseGVarientTable(ptr->gVarientTable,newGControlInfo,drain,source);	
			}
			if(gate!=-1 && source!=-1)
			{
				newGControlInfo->sign = 1;
				insertSparseGVarientTable(ptr->gVarientTable,newGControlInfo,gate,source);	
			}
			

			newGControlInfo->type = ro_1;
			newGControlInfo->partialIdsVxs = data->partialIdsVds;
			if(drain!=-1)
			{
				newGControlInfo->sign = -1;
				insertSparseGVarientTable(ptr->gVarientTable,newGControlInfo,drain,drain);	
			}
			if(source!=-1)
			{
				newGControlInfo->sign = -1;
				insertSparseGVarientTable(ptr->gVarientTable,newGControlInfo,source,source);	
			}
			if(drain!=-1 && source!=-1)
			{
				newGControlInfo->sign = 1;
				insertSparseGVarientTable(ptr->gVarientTable,newGControlInfo,drain,source);	
				insertSparseGVarientTable(ptr->gVarientTable,newGControlInfo,source,drain);	
			}
			freeGControlInfo(newGControlInfo);

			// ===== cgd =====
			QuadElement *cgd = createQuadElement(ptr->gvNum);
			copyQuadElement(cgd,data->cgd);
			if(gate!=-1 && drain!=-1)
			{
				decSparseQuadMatrix(ptr->c,cgd,gate,drain);
				decSparseQuadMatrix(ptr->c,cgd,drain,gate);
			}
			if(gate!=-1)
			{
				incSparseQuadMatrix(ptr->c,cgd,gate,gate);
			}
			if(drain!=-1)
			{
				incSparseQuadMatrix(ptr->c,cgd,drain,drain);
			}
			freeQuadElement(cgd);
			// ===== cgs =====
			QuadElement *cgs = createQuadElement(ptr->gvNum);
			copyQuadElement(cgs,data->cgs);
			if(gate!=-1 && source!=-1)
			{
				decSparseQuadMatrix(ptr->c,cgs,gate,source);
				decSparseQuadMatrix(ptr->c,cgs,source,gate);
			}
			if(gate!=-1)
			{
				incSparseQuadMatrix(ptr->c,cgs,gate,gate);
			}
			if(source!=-1)
			{
				incSparseQuadMatrix(ptr->c,cgs,source,source);
			}
			freeQuadElement(cgs);
		}
		else
		{
//			fprintf(stderr,"%s",line);
//			fprintf(stderr,"not defined yet\n");
		}
	}
	// the while loop of the first pass 
	fclose(fp);
//	dumpLinearNodeList(stdout,linearNodeList);
	freeLinearNodeList(linearNodeList);

	// pass 2 , to setup B and the diagonal of A
	QuadElement *maxGQuad = createQuadElement(ptr->gvNum);
	addConstantQuadElement(maxGQuad,maxG,maxGQuad);
	scaleQuadElement(maxGQuad,100,maxGQuad);
	while(!gdsl_queue_is_empty(voltageInNode))
	{
		int *ret = gdsl_queue_remove(voltageInNode);
		const int posNodeIndex = toZeroBase(*ret);
		// set A
		decSparseQuadMatrix(ptr->a,maxGQuad,posNodeIndex,posNodeIndex);
		// set B
		incSparseQuadMatrix(ptr->b,maxGQuad,posNodeIndex,posNodeIndex);
	}
	freeQuadElement(maxGQuad);
	gdsl_queue_free(voltageInNode);

	return ptr;
}
Beispiel #6
0
int main (void)
{
    int choice = 0;
    gdsl_queue_t q = gdsl_queue_alloc ("Q", alloc_integer, free_integer);
  
    do
	{
	    printf ("\t\tMENU - QUEUE\n\n");
	    printf ("\t1> Put\n");
	    printf ("\t2> Pop\n");
	    printf ("\t3> Get Head\n");
	    printf ("\t4> Get Tail\n");
	    printf ("\t5> Flush\n");
	    printf ("\t6> Search\n");
	    printf ("\t7> Display\n");
	    printf ("\t8> Dump\n");
	    printf ("\t9> XML display\n");
	    printf ("\t0> Quit\n\n" );
	    printf ("\t\tYour choice: " );
	    scanf ("%d", &choice );

	    switch (choice)
		{
		case 1:
		    {
			int value;
			printf ("Enter an integer value: ");
			scanf ("%d", &value);
			gdsl_queue_insert (q, (void*) &value);
		    }
		    break;

		case 2:
		    if (!gdsl_queue_is_empty (q))
			{
			    int* value = (int*) gdsl_queue_remove (q);
			    printf ("Value: %d\n", *value);
			    free_integer (value);
			}
		    else
			{
			    printf ("The queue '%s' is empty\n", gdsl_queue_get_name (q));
			}
		    break;
	  
		case 3:
		    {
			if (!gdsl_queue_is_empty (q)) 
			    {
				int head = *(int*) gdsl_queue_get_head (q);
				printf ("Head = %d\n", head);
			    }
			else
			    {
				printf ("The queue '%s' is empty\n", gdsl_queue_get_name (q));
			    }
		    }
		    break;

		case 4:
		    {
			if (!gdsl_queue_is_empty (q)) 
			    {
				int tail = *(int*) gdsl_queue_get_tail (q);
				printf ("Tail = %d\n", tail);
			    }
			else
			    {
				printf ("The queue '%s' is empty\n", gdsl_queue_get_name (q));
			    }
		    }
		    break;

		case 5:
		    if (gdsl_queue_is_empty (q))
			{
			    printf ("The queue '%s' is empty\n", gdsl_queue_get_name (q));
			}
		    else
			{
			    gdsl_queue_flush (q);
			}
		    break;

		case 6:
		    {
			int pos;
			int* value;
			printf ("Enter an integer value to search an element by its position: ");
			scanf ("%d", &pos);

			value = (int*) gdsl_queue_search_by_position (q, pos);
			if (value != NULL)
			    {
				printf ("Value found at position %d = %d\n", pos, *value);
			    }
		    }
		    break;

		case 7:
		    if (gdsl_queue_is_empty (q))
			{
			    printf ("The queue '%s' is empty\n", gdsl_queue_get_name (q));
			}
		    else
			{
			    printf ("%s = ", gdsl_queue_get_name (q));
			    gdsl_queue_map_forward (q, my_display_integer, NULL);
			}
		    break;

		case 8:
		    gdsl_queue_dump (q, my_write_integer, stdout, NULL);
		    break;

		case 9:
		    gdsl_queue_write_xml (q, my_write_integer, stdout, NULL);
		    break;
		}
	} 
    while (choice != 0);

    gdsl_queue_free (q);

    exit (EXIT_SUCCESS);
}
Beispiel #7
0
//Message-Handling Function
void centernode_dispatch (centernode_t *cn, cnaccess_t *ca)
{
    int i=0;
    cdnmsg_t *req = 0, *res = 0;

    if (ca->status == NS_DISUSE)
        return;
    while (++i < 5 && ca->status != NS_INVALID) {
        pthread_mutex_lock(&ca->lock),
            req = res = gdsl_list_remove_head(ca->recv_queue),
            pthread_mutex_unlock(&ca->lock);
        if (!res) break;

        //Handle the request for CDN application by plugin.
        //fprintf (stderr, "dispatch msg\n");
        //LOG("INFO", "Cmd:%08X, R, (%s.%d)\n", ntohl(res->pdu.cmd), ca->host, ca->port);
        switch (ntohs(res->pdu.cmd)) {
            case CMD_LOGIN:
                centernode_cmd_load(cn, ca, req);
                break; 
            case CMD_NTP_RES:
                centernode_cmd_ntp_res (cn, ca, res);
                break;
            case CMD_SMOKY_ALARM:
                centernode_cmd_smoky_alarm (cn, ca, req);
                break;
            case CMD_TMPTURE_ALARM:
                centernode_cmd_tmpture_alarm (cn, ca, req);
                break;
            case CMD_WTPRESURE_ALARM:
                centernode_cmd_wtpresure_alarm (cn, ca, req);
                break;
            case CMD_SMEXHAUST_ALARM:
                centernode_cmd_smexhaust_alarm (cn, ca, req);
                break;
            case CMD_SPRINKLER_ALARM:
                centernode_cmd_sprinkler_alarm (cn, ca, req);
                break;
            case CMD_FIREDV_ALARM:
                centernode_cmd_firedv_alarm (cn, ca, req);
                break;
            case CMD_EMERLIGHT_ALARM:
                centernode_cmd_emerlight_alarm (cn, ca, req);
                break;
            case CMD_ELEFIRE_ALARM:
                centernode_cmd_elefire_alarm (cn, ca, req);
                break;

            case CMD_SMOKY:
                //break;
            case CMD_TMPTURE:
                //break;
            case CMD_WTPRESURE:
                //break;
            case CMD_SMEXHAUST:
                //break;
            case CMD_SPRINKLER:
                // break;
            case CMD_FIREDV:
                //break;
            case CMD_EMERLIGHT:
                //break;
            case CMD_ELEFIRE:
                centernode_timer_task(cn, ca, req);
                break;


            default: goto disuse; /* unknown command */
        }
        free(res), res = 0;
    }
    if (ca->status != NS_INVALID && centernode_timeout(cn, ca))
        goto disuse;
    pthread_mutex_lock(&ca->lock);
    if (ca->status != NS_INVALID) {
        if (gdsl_list_get_size(ca->recv_queue) >0)
        {
            pthread_mutex_unlock(&ca->lock);
            threadpool_invoke_add_task(cn->tpool, (void(*)(void *))cbdispatch, ca);
            pthread_mutex_lock(&ca->lock);
        }
        else 
            ca->status = NS_NORMAL;

        if (gdsl_list_get_size(ca->send_queue) >0) { 
            pthread_mutex_unlock(&ca->lock);
            pthread_mutex_lock(&cn->reglock), /* Active the socket. */
                gdsl_queue_insert(cn->registration, INT2PTR(ca->fd)),
                pthread_mutex_unlock(&cn->reglock);
            if (write(cn->notify_send_fd, " ", 1) != 1) {
                perror("Error writing to notify pipe");
            }
        }
        else
            pthread_mutex_unlock(&ca->lock);
        return;
    } else pthread_mutex_unlock(&ca->lock);

nodeerror:
    centernode_error(cn, ca);
    return;

disuse: /* invalid connection */
    if (res) free(res);

    pthread_mutex_lock(&ca->lock);
    if (ca->status == NS_INVALID) {
        pthread_mutex_unlock(&ca->lock);
        goto nodeerror;
    } else ca->status=NS_DISUSE;
    pthread_mutex_unlock(&ca->lock);
}
static void updateFreeSinkList(gdsl_queue_t freeSinkList, ParallelETree *tree, const int currentNodeIndex,const int treeInternalSize,const int *priorityTable)
{
	int rootIndex = currentNodeIndex/2;
	const int leftIndex = rootIndex*2;
	const int rightIndex = rootIndex*2 + 1;
	int *mark = getMempoolSet(sizeof(int)*(treeInternalSize+1));
	memset(mark,0,sizeof(int)*(treeInternalSize+1));

	tree->node[currentNodeIndex]->visitLog = visit;

	if(tree->node[rootIndex]==NULL)
	{
		retMempoolSet(mark,sizeof(int)*(treeInternalSize+1));
		return;
	}


	// reorder the queue .... suck implement
	if( tree->node[leftIndex]->visitLog==visit && tree->node[rightIndex]->visitLog==visit )
	{
		int i,j;
		int nnz = 0;
		while(gdsl_queue_get_size(freeSinkList)!=0)
		{
			int *indexInQueue = gdsl_queue_get_head(freeSinkList);
			gdsl_queue_remove(freeSinkList);
			mark[*indexInQueue] = 1;
			nnz++;
			retMempoolSet(indexInQueue,sizeof(int));
		}
		mark[rootIndex] = 1;
		nnz++;
		for(i=0;i<nnz;i++)
		{
			int maxIndex = -1;
			int maxPri = -1;
			for(j=1;j<treeInternalSize+1;j++)
			{
				if( (mark[j]==1) && (priorityTable[j] > maxPri))
				{
					maxPri = priorityTable[j];
					maxIndex = j;
				}
			}
			mark[maxIndex] = 0;
			gdsl_queue_insert(freeSinkList,&maxIndex);
		}
	}


	if( tree->node[leftIndex]->visitLog==visit && tree->node[rightIndex]->visitLog==visit )
	{
		int temp1,temp2;
		temp1 = GSL_MIN(tree->node[leftIndex]->doneRowBegin,tree->node[rightIndex]->doneRowBegin);
		temp2 = GSL_MIN(tree->node[leftIndex]->rowBegin,tree->node[rightIndex]->rowBegin);
//
		tree->node[rootIndex]->doneRowBegin = GSL_MIN(temp1,temp2);
		temp1 = GSL_MAX(tree->node[leftIndex]->doneRowEnd,tree->node[rightIndex]->doneRowEnd);
		temp2 = GSL_MAX(tree->node[leftIndex]->rowEnd,tree->node[rightIndex]->rowEnd);
		tree->node[rootIndex]->doneRowEnd = GSL_MAX(temp1,temp2);

	}
	
	retMempoolSet(mark,sizeof(int)*(treeInternalSize+1));
}