Exemple #1
0
void * Queue1Thread( void * v )
{
	int result = pthread_setname_np( pthread_self(), "FileQueue1" );
	if ( result != 0 )
	{
		LOG( "InitFileQueue: pthread_setname_np failed %s", strerror( result ) );
	}

	// Process incoming messages until queue is empty
	for ( ; ; )
	{
		Queue1.SleepUntilMessage();

		// If Queue3 hasn't finished our last output, sleep until it has.
		pthread_mutex_lock( &QueueMutex );
		while ( !QueueHasCleared )
		{
			// Atomically unlock the mutex and block until we get a message.
			pthread_cond_wait( &QueueWake, &QueueMutex );
		}
		pthread_mutex_unlock( &QueueMutex );

		const char * msg = Queue1.GetNextMessage();

		char commandName[1024] = {};
		sscanf( msg, "%s", commandName );
		const char * filename = msg + strlen( commandName ) + 1;

		MessageQueue * queue = &Queue3;
		char const * suffix = strstr( filename, "_nz.jpg" ); 
		if ( suffix != NULL )	
		{
			// cube map
			const char * const cubeSuffix[6] = { "_px.jpg", "_nx.jpg", "_py.jpg", "_ny.jpg", "_pz.jpg", "_nz.jpg" };
			
			MemBufferFile mbfs[6] = 
			{ 
				MemBufferFile( MemBufferFile::NoInit ), 
				MemBufferFile( MemBufferFile::NoInit ),
				MemBufferFile( MemBufferFile::NoInit ),
				MemBufferFile( MemBufferFile::NoInit ),
				MemBufferFile( MemBufferFile::NoInit ),
				MemBufferFile( MemBufferFile::NoInit ) 
			};

			char filenameWithoutSuffix[1024];
			int suffixStart = suffix - filename;
			strcpy( filenameWithoutSuffix, filename );
			filenameWithoutSuffix[suffixStart] = '\0';
			
			int side = 0;
			for ( ; side < 6; side++ )
			{
				char sideFilename[1024];
				strcpy( sideFilename, filenameWithoutSuffix );
				strcat( sideFilename, cubeSuffix[side] );
				if ( !mbfs[side].LoadFile( sideFilename ) )
				{
					if ( !mbfs[ side ].LoadFileFromPackage( sideFilename ) )
					{
						break;
					}
				}
				LOG( "Queue1 loaded '%s'", sideFilename );
			}
			if ( side >= 6 )
			{
				// if no error occured, post to next thread
				LOG( "%s.PostPrintf( \"%s %p %i %p %i %p %i %p %i %p %i %p %i\" )", "Queue3", commandName, 
						mbfs[0].Buffer, mbfs[0].Length,
						mbfs[1].Buffer, mbfs[1].Length,
						mbfs[2].Buffer, mbfs[2].Length,
						mbfs[3].Buffer, mbfs[3].Length,
						mbfs[4].Buffer, mbfs[4].Length,
						mbfs[5].Buffer, mbfs[5].Length );
				queue->PostPrintf( "%s %p %i %p %i %p %i %p %i %p %i %p %i", commandName,
						mbfs[0].Buffer, mbfs[0].Length,
						mbfs[1].Buffer, mbfs[1].Length,
						mbfs[2].Buffer, mbfs[2].Length,
						mbfs[3].Buffer, mbfs[3].Length,
						mbfs[4].Buffer, mbfs[4].Length,
						mbfs[5].Buffer, mbfs[5].Length );
				for ( int i = 0; i < 6; ++i )
				{
					// make sure we do not free the actual buffers because they're used in the next thread
					mbfs[i].Buffer = NULL;
					mbfs[i].Length = 0;
				}
			}
			else
			{
				// otherwise free the buffers we did manage to allocate
				for ( int i = 0; i < side; ++i )
				{
					mbfs[i].FreeData();
				}
			}
		}
		else
		{
			// non-cube map
			MemBufferFile mbf( filename );
			if ( mbf.Length <= 0 || mbf.Buffer == NULL )
			{
				if ( !mbf.LoadFileFromPackage( filename ) )
				{
					continue;
				}
			}
			LOG( "%s.PostPrintf( \"%s %p %i\" )", "Queue3", commandName, mbf.Buffer, mbf.Length );
			queue->PostPrintf( "%s %p %i", commandName, mbf.Buffer, mbf.Length );
			mbf.Buffer = NULL;
			mbf.Length = 0;
		}

		free( (void *)msg );
	}
	return NULL;
}