X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=sys_shared.c;h=e9b76f4bc5a0800b2a777609ca960e94e6567fbb;hb=8b6a72238c9e0686395f9849a9c00f8762f3a244;hp=c3b4bab73914425ff91137d422d9beb7504cbad4;hpb=f13419f00e3f8335e9a25498560a433597f28f50;p=xonotic%2Fdarkplaces.git diff --git a/sys_shared.c b/sys_shared.c index c3b4bab7..e9b76f4b 100644 --- a/sys_shared.c +++ b/sys_shared.c @@ -48,10 +48,10 @@ char *Sys_TimeString(const char *timeformat) void Sys_Quit (int returnvalue) { // Unlock mutexes because the quit command may jump directly here, causing a deadlock - if ((&cmd_client)->cbuf->lock) - Cbuf_Unlock((&cmd_client)->cbuf); - if ((&cmd_server)->cbuf->lock) - Cbuf_Unlock((&cmd_server)->cbuf); + if ((cmd_client)->cbuf->lock) + Cbuf_Unlock((cmd_client)->cbuf); + if ((cmd_server)->cbuf->lock) + Cbuf_Unlock((cmd_server)->cbuf); SV_UnlockThreadMutex(); TaskQueue_Frame(true); @@ -91,7 +91,7 @@ DLL MANAGEMENT =============================================================================== */ -static qbool Sys_LoadLibraryFunctions(dllhandle_t dllhandle, const dllfunction_t *fcts, qbool complain, qbool has_next) +static qbool Sys_LoadDependencyFunctions(dllhandle_t dllhandle, const dllfunction_t *fcts, qbool complain, qbool has_next) { const dllfunction_t *func; if(dllhandle) @@ -116,7 +116,22 @@ static qbool Sys_LoadLibraryFunctions(dllhandle_t dllhandle, const dllfunction_t return false; } -qbool Sys_LoadLibrary (const char** dllnames, dllhandle_t* handle, const dllfunction_t *fcts) +qbool Sys_LoadSelf(dllhandle_t *handle) +{ + dllhandle_t dllhandle = 0; + + if (handle == NULL) + return false; +#ifdef WIN32 + dllhandle = LoadLibrary (NULL); +#else + dllhandle = dlopen (NULL, RTLD_NOW | RTLD_GLOBAL); +#endif + *handle = dllhandle; + return true; +} + +qbool Sys_LoadDependency (const char** dllnames, dllhandle_t* handle, const dllfunction_t *fcts) { #ifdef SUPPORTDLL const dllfunction_t *func; @@ -129,14 +144,14 @@ qbool Sys_LoadLibrary (const char** dllnames, dllhandle_t* handle, const dllfunc #ifndef WIN32 #ifdef PREFER_PRELOAD dllhandle = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL); - if(Sys_LoadLibraryFunctions(dllhandle, fcts, false, false)) + if(Sys_LoadDependencyFunctions(dllhandle, fcts, false, false)) { Con_DPrintf ("All of %s's functions were already linked in! Not loading dynamically...\n", dllnames[0]); *handle = dllhandle; return true; } else - Sys_UnloadLibrary(&dllhandle); + Sys_FreeLibrary(&dllhandle); notfound: #endif #endif @@ -158,15 +173,14 @@ notfound: SetDllDirectory("bin32"); # endif # endif - dllhandle = LoadLibrary (dllnames[i]); - // no need to unset this - we want ALL dlls to be loaded from there, anyway -#else - dllhandle = dlopen (dllnames[i], RTLD_LAZY | RTLD_GLOBAL); #endif - if (Sys_LoadLibraryFunctions(dllhandle, fcts, true, (dllnames[i+1] != NULL) || (strrchr(sys.argv[0], '/')))) - break; - else - Sys_UnloadLibrary (&dllhandle); + if(Sys_LoadLibrary(dllnames[i], &dllhandle)) + { + if (Sys_LoadDependencyFunctions(dllhandle, fcts, true, (dllnames[i+1] != NULL) || (strrchr(sys.argv[0], '/')))) + break; + else + Sys_FreeLibrary (&dllhandle); + } } // see if the names can be loaded relative to the executable path @@ -182,15 +196,14 @@ notfound: strlcpy(temp, path, sizeof(temp)); strlcat(temp, dllnames[i], sizeof(temp)); Con_DPrintf (" \"%s\"", temp); -#ifdef WIN32 - dllhandle = LoadLibrary (temp); -#else - dllhandle = dlopen (temp, RTLD_LAZY | RTLD_GLOBAL); -#endif - if (Sys_LoadLibraryFunctions(dllhandle, fcts, true, dllnames[i+1] != NULL)) - break; - else - Sys_UnloadLibrary (&dllhandle); + + if(Sys_LoadLibrary(temp, &dllhandle)) + { + if (Sys_LoadDependencyFunctions(dllhandle, fcts, true, (dllnames[i+1] != NULL) || (strrchr(sys.argv[0], '/')))) + break; + else + Sys_FreeLibrary (&dllhandle); + } } } @@ -211,7 +224,28 @@ notfound: #endif } -void Sys_UnloadLibrary (dllhandle_t* handle) +qbool Sys_LoadLibrary(const char *name, dllhandle_t *handle) +{ + dllhandle_t dllhandle = 0; + + if(handle == NULL) + return false; + +#ifdef SUPPORTDLL +# ifdef WIN32 + dllhandle = LoadLibrary (name); +# else + dllhandle = dlopen (name, RTLD_LAZY | RTLD_GLOBAL); +# endif +#endif + if(!dllhandle) + return false; + + *handle = dllhandle; + return true; +} + +void Sys_FreeLibrary (dllhandle_t* handle) { #ifdef SUPPORTDLL if (handle == NULL || *handle == NULL) @@ -267,8 +301,9 @@ void* Sys_GetProcAddress (dllhandle_t handle, const char* name) # define HAVE_USLEEP 1 #endif -// this one is referenced elsewhere +// these are referenced elsewhere cvar_t sys_usenoclockbutbenchmark = {CF_CLIENT | CF_SERVER | CF_ARCHIVE, "sys_usenoclockbutbenchmark", "0", "don't use ANY real timing, and simulate a clock (for benchmarking); the game then runs as fast as possible. Run a QC mod with bots that does some stuff, then does a quit at the end, to benchmark a server. NEVER do this on a public server."}; +cvar_t sys_libdir = {CF_READONLY | CF_CLIENT | CF_SERVER, "sys_libdir", "", "Default engine library directory"}; // these are not static cvar_t sys_debugsleep = {CF_CLIENT | CF_SERVER, "sys_debugsleep", "0", "write requested and attained sleep times to standard output, to be used with gnuplot"}; @@ -310,6 +345,7 @@ void Sys_Init_Commands (void) { Cvar_RegisterVariable(&sys_debugsleep); Cvar_RegisterVariable(&sys_usenoclockbutbenchmark); + Cvar_RegisterVariable(&sys_libdir); #if HAVE_TIMEGETTIME || HAVE_QUERYPERFORMANCECOUNTER || HAVE_CLOCKGETTIME || HAVE_GETTIMEOFDAY if(sys_supportsdlgetticks) { @@ -553,7 +589,7 @@ void Sys_ProvideSelfFD(void) static int CPUID_Features(void) { int features = 0; -# if defined((__GNUC__) || (__clang__) || (__TINYC__)) && defined(__i386__) +# if (defined(__GNUC__) || defined(__clang__) || defined(__TINYC__)) && defined(__i386__) __asm__ ( " movl %%ebx,%%edi\n" " xorl %%eax,%%eax \n"