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; }
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; }
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; }