Exemple #1
0
int giiExit(void)
{
	DPRINT_CORE("giiExit() called\n");
	if (!_giiLibIsUp)
		return GGI_ENOTALLOC;
	
	if (_giiLibIsUp > 1) {
		_giiLibIsUp--;
		return _giiLibIsUp;
	}
	
	DPRINT_CORE("giiExit: really destroying.\n");

	_giiExitBuiltins();

	ggFreeConfig(_giiconfhandle);
	ggLockDestroy(_gii_global_lock);
	ggLockDestroy(_gii_safe_lock);
	ggLockDestroy(_gii_event_lock);

	/* Set them back to initialization value.
	 * Otherwise this leads to a memory corruption bug,
	 * when gii is initialized again in the same application.
	 */
	_giiconfhandle = NULL;
	_gii_global_lock = NULL;
	_gii_safe_lock = NULL;
	_gii_event_lock = NULL;

	ggExit();
	_giiLibIsUp=0;
	
	DPRINT_CORE("giiExit: done!\n");
	return 0;
}
Exemple #2
0
int ggiMesaInit()
{
	int err;
	char *str;
	char *conffile;
	
	GGIMESADPRINT_CORE("ggiMesaInit() called\n");
	
	_ggimesaLibIsUp++;
	if (_ggimesaLibIsUp > 1) return 0; /* Initialize only at first call */
	
	str = getenv("GGIMESA_DEBUGSYNC");
	if (str != NULL) {
		_ggimesaDebugSync = 1;
	}
	
	str = getenv("GGIMESA_DEBUG");
	if (str != NULL) {
		_ggimesaDebugState = atoi(str);
		GGIMESADPRINT_CORE("%s Debugging=%d\n",
			_ggimesaDebugSync ? "sync" : "async",
			_ggimesaDebugState);
	}
	

	conffile = malloc(strlen(ggiMesaGetConfDir()) + 1
			  + strlen(GGIMESACONFFILE) +1);
	if (conffile == NULL) {
		fprintf(stderr, "GGIMesa: unable to allocate memory for config filename.\n");
		return GGI_ENOMEM;
	}
	sprintf(conffile, "%s%c%s",
		ggiMesaGetConfDir(), '/', GGIMESACONFFILE);
	err = ggLoadConfig(conffile, &_ggimesaConfigHandle);
	if (err != GGI_OK) {
		fprintf(stderr, "GGIMesa: Couldn't open %s\n",
			conffile);
		free(conffile);
		_ggimesaLibIsUp--;
		return err;
	}
	free(conffile);
	
	_ggiMesaID = ggiExtensionRegister("GGIMesa",
					 sizeof(struct ggi_mesa_ext), changed);
	if (_ggiMesaID < 0) {
		fprintf(stderr, "GGIMesa: failed to register as extension\n");
		_ggimesaLibIsUp--;
		ggFreeConfig(_ggimesaConfigHandle);
		return _ggiMesaID;
	}
	
	return 0;
}
Exemple #3
0
int ggiMesaExit(void)
{
	int rc;

	GGIMESADPRINT_CORE("ggiMesaExit() called\n");

	if (!_ggimesaLibIsUp) return -1;

	if (_ggimesaLibIsUp > 1) {
		/* Exit only at last call */
		_ggimesaLibIsUp--;
		return 0;
	}
	
	rc = ggiExtensionUnregister(_ggiMesaID);
	ggFreeConfig(_ggimesaConfigHandle);

	_ggimesaLibIsUp = 0;

	return rc;
}