예제 #1
0
void ipAddrToAsciiEnginePrivate::run ()
{
    epicsGuard < epicsMutex > guard ( this->mutex );
    while ( ! this->exitFlag ) {
        {
            epicsGuardRelease < epicsMutex > unguard ( guard );
            this->laborEvent.wait ();
        }
        while ( true ) {
            ipAddrToAsciiTransactionPrivate * pItem = this->labor.get ();
            if ( ! pItem ) {
                break;
            }
            osiSockAddr addr = pItem->addr;
            this->pCurrent = pItem;
    
            if ( this->exitFlag )
            {
                sockAddrToDottedIP ( & addr.sa, this->nameTmp, 
                    sizeof ( this->nameTmp ) );
            }
            else {
                epicsGuardRelease < epicsMutex > unguard ( guard );
                // depending on DNS configuration, this could take a very long time
                // so we release the lock
                sockAddrToA ( &addr.sa, this->nameTmp, sizeof ( this->nameTmp ) );
            }

            // the ipAddrToAsciiTransactionPrivate destructor is allowed to
            // set pCurrent to nill and avoid blocking on a slow DNS 
            // operation
            if ( ! this->pCurrent ) {
                continue;
            }

            this->callbackInProgress = true;

            {
                epicsGuardRelease < epicsMutex > unguard ( guard );
                // dont call callback with lock applied
                this->pCurrent->pCB->transactionComplete ( this->nameTmp );
            }

            this->callbackInProgress = false;

            if ( this->pCurrent ) {
                this->pCurrent->pending = false;
                this->pCurrent = 0;
            }
            if ( this->cancelPendingCount  ) {
                this->destructorBlockEvent.signal ();
            }
        }
    }
}
예제 #2
0
void LGLAPI LGLTracer_glProgramParameteri( GLuint program, GLenum pname, GLint value )
{
	guard();
	APIHook.glProgramParameteri( program, pname, value );
	CheckRendererError( "" );
	unguard();
}
예제 #3
0
void clASELoader::ASE_ReadTVertexList( iIStream* FStream, clVAMender* Mender )
{
	guard();

#ifdef ASE_HEAVY_DEBUG
	Env->Logger->Log( L_DEBUG, "Reading Tvertex list..." );
#endif

	char Keyword[32];

	while ( !FStream->Eof() )
	{
		LString Line = FStream->ReadLineTrimLeadSpaces();

		if ( LStr::ContainsSubStr( Line, "}" ) )
		{
			break;
		}
		else if ( LStr::StartsWith( Line, ASE_MeshTVertex ) )
		{
			int Index;
			float U, V, W;

			sscanf( Line.c_str(), "%s %d %f %f %f", Keyword, &Index, &U, &V, &W );

			Mender->EmitTextureVertex( Index, LVector3( U, 1.0f - V, W ) );
		}
		else
		{
			FATAL_MSG( "Unexpected token in " + ASE_MeshTVertexList + " : " + Line );
		}
	}

	unguard();
}
예제 #4
0
void clASELoader::AddNode( int ParentIdx,
                           clVertexAttribs* VA,
                           const sASEMaterial& Material,
                           const LString& ObjName,
                           const LMatrix4& GlobalTransform )
{
	guard();

	sMaterialDesc Mat = CreateMaterialFromASE( Material );

	int MaterialIdx = FMesh->AddMaterial( Mat );

	FMesh->AddVertexAttribs( ObjName, VA, GlobalTransform, ParentIdx, MaterialIdx );

	// multiply all vertices by inverse GlobalTransform
	LVector3* Vertices = VA->FVertices.GetPtr();

	LMatrix4 InvGlobalTM = GlobalTransform.GetInversed();

	for ( size_t i = 0; i != VA->FVertices.size(); i++ )
	{
		Vertices[i] = InvGlobalTM * Vertices[i];
	}

	//

	unguard();
}
예제 #5
0
void clASELoader::ASE_ReadTMAnimation( iIStream* FStream )
{
	guard();

	while ( !FStream->Eof() )
	{
		LString Line = FStream->ReadLineTrimLeadSpaces();

		if ( LStr::ContainsSubStr( Line, "}" ) )
		{
			break;
		}
		else if ( LStr::StartsWith( Line, ASE_ControlPosTrack ) )
		{
			ASE_ReadControlPosTrack( FStream );
		}
		else if ( LStr::StartsWith( Line, ASE_ControlRotTrack ) )
		{
			ASE_ReadControlRotTrack( FStream );
		}
		else if ( LStr::StartsWith( Line, ASE_ControlScaleTrack ) )
		{
			ASE_ReadControlScaleTrack( FStream );
		}
		else
		{
			ASE_SkipBlock( FStream, Line );
		}
	}

	unguard();
}
예제 #6
0
void getCallback::exception (
    epicsGuard < epicsMutex > & guard,
    int status, const char * /* pContext */, 
    unsigned type, arrayElementCount count )
{
    if ( status != ECA_CHANDESTROY ) {
        struct event_handler_args args;
        args.usr = this->pPrivate;
        args.chid = & this->chan;
        args.type = type;
        args.count = count;
        args.status = status;
        args.dbr = 0;
        caEventCallBackFunc * pFuncTmp = this->pFunc;
        // fetch client context and destroy prior to releasing
        // the lock and calling cb in case they destroy channel there
        this->chan.getClientCtx().destroyGetCallback ( guard, *this );
        {
            epicsGuardRelease < epicsMutex > unguard ( guard );
            ( *pFuncTmp ) ( args );
        }
    }
    else {
        this->chan.getClientCtx().destroyGetCallback ( guard, *this );
    }
}
예제 #7
0
void LGLAPI LGLTracer_glBindVertexArray( GLuint array )
{
	guard();
	APIHook.glBindVertexArray( array );
	CheckRendererError( "" );
	unguard();
}
예제 #8
0
void LGLAPI LGLTracer_glVertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer )
{
	guard();
	APIHook.glVertexAttribPointer( index, size, type, normalized, stride, pointer );
	CheckRendererError( "" );
	unguard();
}
예제 #9
0
void LGLAPI LGLTracer_glTexParameteri( GLenum target, GLenum pname, GLint param )
{
	guard( "0x%X, 0x%X, %i", target, pname, param );
	APIHook.glTexParameteri( target, pname, param );
	CheckRendererError( "" );
	unguard();
}
예제 #10
0
void LGLAPI LGLTracer_glTexParameterf( GLenum target, GLenum pname, GLfloat param )
{
	guard();
	APIHook.glTexParameterf( target, pname, param );
	CheckRendererError( "" );
	unguard();
}
예제 #11
0
void LGLAPI LGLTracer_glTexImage3D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels )
{
	guard();
	APIHook.glTexImage3D( target, level, internalformat, width, height, depth, border, format, type, pixels );
	CheckRendererError( "" );
	unguard();
}
예제 #12
0
void LGLAPI LGLTracer_glTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels )
{
	guard();
	APIHook.glTexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, pixels );
	CheckRendererError( "" );
	unguard();
}
예제 #13
0
void LGLAPI LGLTracer_glShaderSource( GLuint shader, GLsizei count, const GLchar* *string, const GLint* length )
{
	guard();
	APIHook.glShaderSource( shader, count, string, length );
	CheckRendererError( "" );
	unguard();
}
예제 #14
0
void LGLAPI LGLTracer_glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels )
{
	guard();
	APIHook.glReadPixels( x, y, width, height, format, type, pixels );
	CheckRendererError( "" );
	unguard();
}
예제 #15
0
void LGLAPI LGLTracer_glReadBuffer( GLenum mode )
{
	guard();
	APIHook.glReadBuffer( mode );
	CheckRendererError( "" );
	unguard();
}
예제 #16
0
void LGLAPI LGLTracer_glValidateProgram( GLuint program )
{
	guard();
	APIHook.glValidateProgram( program );
	CheckRendererError( "" );
	unguard();
}
예제 #17
0
void LGLAPI LGLTracer_glBindTexture( GLenum target, GLuint texture )
{
	guard( "0x%X, %u", target, texture );
	APIHook.glBindTexture( target, texture );
	CheckRendererError( "" );
	unguard();
}
예제 #18
0
void LGLAPI LGLTracer_glUniform1f( GLint location, GLfloat v0 )
{
	guard( "%i, %f", location, v0 );
	APIHook.glUniform1f( location, v0 );
	CheckRendererError( "" );
	unguard();
}
예제 #19
0
void LGLAPI LGLTracer_glViewport( GLint x, GLint y, GLsizei width, GLsizei height )
{
	guard();
	APIHook.glViewport( x, y, width, height );
	CheckRendererError( "" );
	unguard();
}
예제 #20
0
void LGLAPI LGLTracer_glBindFramebuffer( GLenum target, GLuint framebuffer )
{
	guard();
	APIHook.glBindFramebuffer( target, framebuffer );
	CheckRendererError( "" );
	unguard();
}
ipAddrToAsciiTransactionPrivate::~ipAddrToAsciiTransactionPrivate ()
{
    epicsGuard < epicsMutex > guard ( this->engine.mutex );
    while ( this->pending ) {
        if ( this->engine.pCurrent == this && 
                this->engine.callbackInProgress && 
                ! this->engine.thread.isCurrentThread() ) {
            assert ( this->engine.cancelPendingCount < UINT_MAX );
            this->engine.cancelPendingCount++;
            {
                epicsGuardRelease < epicsMutex > unguard ( guard );
                this->engine.destructorBlockEvent.wait ();
            }
            assert ( this->engine.cancelPendingCount > 0u );
            this->engine.cancelPendingCount--;
            if ( ! this->pending ) {
                if ( this->engine.cancelPendingCount ) {
                    this->engine.destructorBlockEvent.signal ();
                }
                break;
            }
        }
        else {
            if ( this->engine.pCurrent == this ) {
                this->engine.pCurrent = 0;
            }
            else {
                this->engine.labor.remove ( *this );
            }
            this->pending = false;
        }
    }
}
예제 #22
0
void LGLAPI LGLTracer_glUniform1i( GLint location, GLint v0 )
{
	guard();
	APIHook.glUniform1i( location, v0 );
	CheckRendererError( "" );
	unguard();
}
예제 #23
0
void clASELoader::ASE_ReadMaterialList( iIStream* FStream )
{
	guard();

	while ( !FStream->Eof() )
	{
		LString Line = FStream->ReadLineTrimLeadSpaces();

		if ( LStr::ContainsSubStr( Line, "}" ) )
		{
			break;
		}
		else if ( LStr::StartsWith( Line, ASE_MaterialCount ) )
		{
			int MaterialCount = LStr::ToInt( LStr::GetToken( Line, 2 ) );

			FMaterialList.resize( MaterialCount );
		}
		else if ( LStr::StartsWith( Line, ASE_Material ) )
		{
			int MaterialIndex = LStr::ToInt( LStr::GetToken( Line, 2 ) );

			//ASE_ReadMaterial( MaterialIndex, -1, 0 );
			FMaterialList[ MaterialIndex ] = ASE_ReadMaterial( FStream, 0 );
		}
		else
		{
			FATAL_MSG( "Unexpected token in " + ASE_MaterialList + " : " + Line );
		}
	}

	unguard();
}
예제 #24
0
void LGLAPI LGLTracer_glUniform1iv( GLint location, GLsizei count, const GLint* v0 )
{
	guard();
	APIHook.glUniform1iv( location, count, v0 );
	CheckRendererError( "" );
	unguard();
}
예제 #25
0
void clASELoader::ASE_ReadShapeObject( iIStream* FStream )
{
	guard();

	LMatrix4 NodeTM;

	NodeTM.IdentityMatrix();

	while ( !FStream->Eof() )
	{
		LString Line = FStream->ReadLineTrimLeadSpaces();

		if ( LStr::ContainsSubStr( Line, "}" ) )
		{
			break;
		}
		else if ( LStr::StartsWith( Line, ASE_NodeTM ) )
		{
			NodeTM = ASE_ReadNodeTM( FStream );
		}
		else if ( LStr::StartsWith( Line, ASE_TMAnimation ) )
		{
			ASE_ReadTMAnimation( FStream );
		}
		else
		{
			ASE_SkipBlock( FStream, Line );
		}
	}

	unguard();
}
예제 #26
0
void LGLAPI LGLTracer_glUniform4fv( GLint location, GLsizei count, const GLfloat* value )
{
	guard();
	APIHook.glUniform4fv( location, count, value );
	CheckRendererError( "" );
	unguard();
}
예제 #27
0
void clASELoader::ASE_ReadVertexList( iIStream* FStream, clVAMender* Mender )
{
	guard();

#ifdef ASE_HEAVY_DEBUG
	Env->Logger->Log( L_DEBUG, "Reading vertex list..." );
#endif

	char Keyword[32];

	int Index;
	float X, Y, Z;

	while ( !FStream->Eof() )
	{
		LString Line( FStream->ReadLineTrimLeadSpaces() );

		if ( LStr::StartsWith( Line, ASE_MeshVertex ) )
		{
			sscanf( Line.c_str(), "%s %d %f %f %f", Keyword, &Index, &X, &Y, &Z );

			Mender->EmitVertex( Index, LVector3( X, Y, Z ), -1, -1 );
		}
		else if ( LStr::ContainsSubStr( Line, "}" ) )
		{
			break;
		}
		else
		{
			FATAL_MSG( "Unexpected token in " + ASE_MeshVertexList + " : " + Line );
		}
	}

	unguard();
}
예제 #28
0
void LGLAPI LGLTracer_glUniformBlockBinding( GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding )
{
	guard();
	APIHook.glUniformBlockBinding( program, uniformBlockIndex, uniformBlockBinding );
	CheckRendererError( "" );
	unguard();
}
예제 #29
0
void LGLAPI LGLTracer_glUniformMatrix4fv( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value )
{
	guard();
	APIHook.glUniformMatrix4fv( location, count, transpose, value );
	CheckRendererError( "" );
	unguard();
}
예제 #30
0
void LGLAPI LGLTracer_glBindFragDataLocation( GLuint program, GLuint color, const GLchar* name )
{
	guard();
	APIHook.glBindFragDataLocation( program, color, name );
	CheckRendererError( "" );
	unguard();
}