示例#1
0
deMutex deMutex_create (const deMutexAttributes* attributes)
{
	pthread_mutexattr_t	attr;
	int					ret;
	pthread_mutex_t*	mutex = deMalloc(sizeof(pthread_mutex_t));

	if (!mutex)
		return 0;

	if (pthread_mutexattr_init(&attr) != 0)
	{
		deFree(mutex);
		return 0;
	}

#if defined(DE_DEBUG)
	if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK) != 0)
#else
	if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL) != 0)
#endif
	{
		pthread_mutexattr_destroy(&attr);
		deFree(mutex);
		return 0;
	}

	if (attributes)
	{
		if (attributes->flags & DE_MUTEX_RECURSIVE)
		{
			if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
			{
				pthread_mutexattr_destroy(&attr);
				deFree(mutex);
				return 0;
			}
		}
	}

	ret = pthread_mutex_init(mutex, &attr);
	if (ret != 0)
	{
		pthread_mutexattr_destroy(&attr);
		deFree(mutex);
		return 0;
	}

	pthread_mutexattr_destroy(&attr);

	return (deMutex)mutex;
}
deSemaphore deSemaphore_create (int initialValue, const deSemaphoreAttributes* attributes)
{
	sem_t*	sem	= (sem_t*)deMalloc(sizeof(sem_t));
	
	DE_UNREF(attributes);
	
	if (!sem)
		return 0;
	
	if (sem_init(sem, 0, initialValue) != 0)
	{
		deFree(sem);
		return 0;
	}
	
	return (deSemaphore)sem;
}
示例#3
0
static deBool compressImagePNG (Buffer* buffer, qpImageFormat imageFormat, int width, int height, int rowStride, const void* data)
{
	deBool			compressOk		= DE_FALSE;
	png_structp		png				= DE_NULL;
	png_infop		info			= DE_NULL;
	png_byte**		rowPointers		= DE_NULL;
	deBool			hasAlpha		= imageFormat == QP_IMAGE_FORMAT_RGBA8888;
	int				ndx;

	/* Handle format. */
	DE_ASSERT(imageFormat == QP_IMAGE_FORMAT_RGB888 || imageFormat == QP_IMAGE_FORMAT_RGBA8888);

	/* Allocate & set row pointers. */
	rowPointers = (png_byte**)deMalloc((size_t)height * sizeof(png_byte*));
	if (!rowPointers)
		return DE_FALSE;

	for (ndx = 0; ndx < height; ndx++)
		rowPointers[ndx] = (png_byte*)((const deUint8*)data + ndx*rowStride);

	/* Initialize PNG compressor. */
	png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
	info = png ? png_create_info_struct(png) : DE_NULL;
	if (png && info)
	{
		/* Set our own write function. */
		png_set_write_fn(png, buffer, pngWriteData, pngFlushData);

		compressOk = writeCompressedPNG(png, info, rowPointers, width, height,
										hasAlpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB);
	}

	/* Cleanup & return. */
	if (png && info)
	{
		png_destroy_info_struct(png, &info);
		png_destroy_write_struct(&png, DE_NULL);
	}
	else if (png)
		png_destroy_write_struct(&png, &info);

	deFree(rowPointers);
	return compressOk;
}
示例#4
0
deBool Buffer_resize (Buffer* buffer, size_t newSize)
{
	/* Grow buffer if necessary. */
	if (newSize > buffer->capacity)
	{
		size_t		newCapacity	= (size_t)deAlign32(deMax32(2*(int)buffer->capacity, (int)newSize), 512);
		deUint8*	newData		= (deUint8*)deMalloc(newCapacity);
		if (!newData)
			return DE_FALSE;

		memcpy(newData, buffer->data, buffer->size);
		deFree(buffer->data);
		buffer->data		= newData;
		buffer->capacity	= newCapacity;
	}

	buffer->size = newSize;
	return DE_TRUE;
}