bool Routing_Slip_Queue::dispatch_one (Guard & guard) { bool ok = false; Routing_Slip_Ptr routing_slip; if (this->queue_.dequeue_head (routing_slip) == 0) { ++this->active_; guard.release (); routing_slip->at_front_of_persist_queue (); guard.acquire (); } return ok; }
bool handle_args(EnvT* e) { //T3D? static int t3dIx = e->KeywordIx( "T3D"); doT3d=(e->KeywordSet(t3dIx)|| T3Denabled()); //note: Z (VALUE) will be used uniquely if Z is not effectively defined. static int zvIx = e->KeywordIx( "ZVALUE"); zValue=0.0; e->AssureDoubleScalarKWIfPresent ( zvIx, zValue ); zValue=min(zValue,0.999999); //to avoid problems with plplot zValue=max(zValue,0.0); // system variable !P.NSUM first DLong nsum=(*static_cast<DLongGDL*>(SysVar::P()-> GetTag(SysVar::P()->Desc()->TagIndex("NSUM"), 0)))[0]; static int NSUMIx = e->KeywordIx( "NSUM"); e->AssureLongScalarKWIfPresent( NSUMIx, nsum); static int polarIx = e->KeywordIx( "POLAR"); bool polar = (e->KeywordSet(polarIx)); // DDoubleGDL *yValBis, *xValBis; // Guard<BaseGDL> xvalBis_guard, yvalBis_guard; //test and transform eventually if POLAR and/or NSUM! if( nParam() == 1) { yTemp = e->GetParAs< DDoubleGDL>( 0); if (yTemp->Rank() == 0) e->Throw("Expression must be an array in this context: "+e->GetParString(0)); yEl=yTemp->N_Elements(); xEl=yEl; xTemp = new DDoubleGDL( dimension( xEl), BaseGDL::INDGEN); xtemp_guard.Reset( xTemp); // delete upon exit } else { xTemp = e->GetParAs< DDoubleGDL>( 0); if (xTemp->Rank() == 0) e->Throw("Expression must be an array in this context: "+e->GetParString(0)); xEl=xTemp->N_Elements(); yTemp = e->GetParAs< DDoubleGDL>( 1); if (yTemp->Rank() == 0) e->Throw("Expression must be an array in this context: "+e->GetParString(1)); yEl=yTemp->N_Elements(); //silently drop unmatched values if (yEl != xEl) { SizeT size; size = min(xEl, yEl); xEl = size; yEl = size; } } //check nsum validity nsum=max(1,nsum); nsum=min(nsum,(DLong)xEl); if (nsum == 1) { if (polar) { xVal = new DDoubleGDL(dimension(xEl), BaseGDL::NOZERO); xval_guard.Reset(xVal); // delete upon exit yVal = new DDoubleGDL(dimension(yEl), BaseGDL::NOZERO); yval_guard.Reset(yVal); // delete upon exit for (int i = 0; i < xEl; i++) (*xVal)[i] = (*xTemp)[i] * cos((*yTemp)[i]); for (int i = 0; i < yEl; i++) (*yVal)[i] = (*xTemp)[i] * sin((*yTemp)[i]); } else { //careful about previously set autopointers! if (nParam() == 1) xval_guard.Init( xtemp_guard.release()); xVal = xTemp; yVal = yTemp; } } else { int i, j, k; DLong size = (DLong)xEl / nsum; xVal = new DDoubleGDL(size, BaseGDL::ZERO); //SHOULD BE ZERO, IS NOT! xval_guard.Reset(xVal); // delete upon exit yVal = new DDoubleGDL(size, BaseGDL::ZERO); //IDEM yval_guard.Reset(yVal); // delete upon exit for (i = 0, k = 0; i < size; i++) { (*xVal)[i] = 0.0; (*yVal)[i] = 0.0; for (j = 0; j < nsum; j++, k++) { (*xVal)[i] += (*xTemp)[k]; (*yVal)[i] += (*yTemp)[k]; } } for (i = 0; i < size; i++) (*xVal)[i] /= nsum; for (i = 0; i < size; i++) (*yVal)[i] /= nsum; if (polar) { DDouble x, y; for (i = 0; i < size; i++) { x = (*xVal)[i] * cos((*yVal)[i]); y = (*xVal)[i] * sin((*yVal)[i]); (*xVal)[i] = x; (*yVal)[i] = y; } } } return false; }