X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=prvm_edict.c;h=25f9899af9f434cbbf1ee15af061596e5e9c72be;hb=927bd7b13c9a18fb07a8681c7483f632c7ea32f3;hp=c236447ec09ddea055f52ba54262b9440f9ef88b;hpb=cfee52a1ec9db338098789cae89ae5cf1f7a6fbf;p=xonotic%2Fdarkplaces.git diff --git a/prvm_edict.c b/prvm_edict.c index c236447e..25f9899a 100644 --- a/prvm_edict.c +++ b/prvm_edict.c @@ -222,7 +222,7 @@ qboolean PRVM_ED_CanAlloc(prvm_prog_t *prog, prvm_edict_t *e) return false; if(prvm_reuseedicts_always_allow == realtime) return true; - if(realtime <= e->priv.required->freetime && prvm_reuseedicts_neverinsameframe.integer) + if(realtime <= e->priv.required->freetime + 0.1 && prvm_reuseedicts_neverinsameframe.integer) return false; // never allow reuse in same frame (causes networking trouble) if(e->priv.required->freetime < prog->starttime + prvm_reuseedicts_startuptime.value) return true; @@ -894,7 +894,7 @@ void PRVM_ED_ParseGlobals (prvm_prog_t *prog, const char *data) while (1) { // parse key - if (!COM_ParseToken_Simple(&data, false, false)) + if (!COM_ParseToken_Simple(&data, false, false, true)) prog->error_cmd("PRVM_ED_ParseGlobals: EOF without closing brace"); if (com_token[0] == '}') break; @@ -905,7 +905,7 @@ void PRVM_ED_ParseGlobals (prvm_prog_t *prog, const char *data) strlcpy (keyname, com_token, sizeof(keyname)); // parse value - if (!COM_ParseToken_Simple(&data, false, true)) + if (!COM_ParseToken_Simple(&data, false, true, true)) prog->error_cmd("PRVM_ED_ParseGlobals: EOF without closing brace"); if (developer_entityparsing.integer) @@ -1244,7 +1244,7 @@ const char *PRVM_ED_ParseEdict (prvm_prog_t *prog, const char *data, prvm_edict_ while (1) { // parse key - if (!COM_ParseToken_Simple(&data, false, false)) + if (!COM_ParseToken_Simple(&data, false, false, true)) prog->error_cmd("PRVM_ED_ParseEdict: EOF without closing brace"); if (developer_entityparsing.integer) Con_Printf("Key: \"%s\"", com_token); @@ -1276,7 +1276,7 @@ const char *PRVM_ED_ParseEdict (prvm_prog_t *prog, const char *data, prvm_edict_ } // parse value - if (!COM_ParseToken_Simple(&data, false, false)) + if (!COM_ParseToken_Simple(&data, false, false, true)) prog->error_cmd("PRVM_ED_ParseEdict: EOF without closing brace"); if (developer_entityparsing.integer) Con_Printf(" \"%s\"\n", com_token); @@ -1354,7 +1354,7 @@ void PRVM_ED_LoadFromFile (prvm_prog_t *prog, const char *data) while (1) { // parse the opening brace - if (!COM_ParseToken_Simple(&data, false, false)) + if (!COM_ParseToken_Simple(&data, false, false, true)) break; if (com_token[0] != '{') prog->error_cmd("PRVM_ED_LoadFromFile: %s: found %s when expecting {", prog->name, com_token); @@ -1896,12 +1896,16 @@ void PRVM_Prog_Load(prvm_prog_t *prog, const char * filename, int numrequiredfun if (prog->loaded) prog->error_cmd("PRVM_LoadProgs: there is already a %s program loaded!", prog->name ); + Host_LockSession(); // all progs can use the session cvar + Crypto_LoadKeys(); // all progs might use the keys at init time + dprograms = (dprograms_t *)FS_LoadFile (filename, prog->progs_mempool, false, &filesize); if (dprograms == NULL || filesize < (fs_offset_t)sizeof(dprograms_t)) prog->error_cmd("PRVM_LoadProgs: couldn't load %s for %s", filename, prog->name); // TODO bounds check header fields (e.g. numstatements), they must never go behind end of file - prog->profiletime = prog->starttime = Sys_DirtyTime(); + prog->profiletime = Sys_DirtyTime(); + prog->starttime = realtime; Con_DPrintf("%s programs occupy %iK.\n", prog->name, (int)(filesize/1024)); @@ -2972,13 +2976,16 @@ static qboolean PRVM_IsEdictReferenced(prvm_prog_t *prog, prvm_edict_t *edict, i if(!*targetname) // "" targetname = NULL; - for (i = 0;i < prog->numglobaldefs;i++) + if(mark == 0) { - ddef_t *d = &prog->globaldefs[i]; - if((etype_t)((int) d->type & ~DEF_SAVEGLOBAL) != ev_entity) - continue; - if(edictnum == PRVM_GLOBALFIELDEDICT(d->ofs)) - return true; + for (i = 0;i < prog->numglobaldefs;i++) + { + ddef_t *d = &prog->globaldefs[i]; + if((etype_t)((int) d->type & ~DEF_SAVEGLOBAL) != ev_entity) + continue; + if(edictnum == PRVM_GLOBALFIELDEDICT(d->ofs)) + return true; + } } for(j = 0; j < prog->num_edicts; ++j) @@ -3081,6 +3088,8 @@ void PRVM_LeakTest(prvm_prog_t *prog) Con_Print("\n"); leaked = true; } + + ed->priv.required->mark = 0; // clear marks again when done } for (i = 0; i < (int)Mem_ExpandableArray_IndexRange(&prog->stringbuffersarray); ++i)