Skip to content

Commit 54f1267

Browse files
committedOct 26, 2015
SAPI: Mark all Lua API functions requiring envlock
1 parent 3936a5e commit 54f1267

13 files changed

+141
-37
lines changed
 

‎src/script/lua_api/l_env.cpp

+3-6
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3636
#include "emerge.h"
3737
#include "pathfinder.h"
3838

39-
#define GET_ENV_PTR ServerEnvironment* env = \
40-
dynamic_cast<ServerEnvironment*>(getEnv(L)); \
41-
if (env == NULL) return 0
42-
4339
///////////////////////////////////////////////////////////////////////////////
4440

4541

@@ -658,7 +654,7 @@ int ModApiEnvMod::l_find_nodes_in_area_under_air(lua_State *L)
658654
// returns world-specific PerlinNoise
659655
int ModApiEnvMod::l_get_perlin(lua_State *L)
660656
{
661-
GET_ENV_PTR;
657+
GET_ENV_PTR_NO_MAP_LOCK;
662658

663659
NoiseParams params;
664660

@@ -684,7 +680,7 @@ int ModApiEnvMod::l_get_perlin(lua_State *L)
684680
// returns world-specific PerlinNoiseMap
685681
int ModApiEnvMod::l_get_perlin_map(lua_State *L)
686682
{
687-
GET_ENV_PTR;
683+
GET_ENV_PTR_NO_MAP_LOCK;
688684

689685
NoiseParams np;
690686
if (!read_noiseparams(L, 1, &np))
@@ -945,6 +941,7 @@ int ModApiEnvMod::l_forceload_free_block(lua_State *L)
945941
// get_us_time()
946942
int ModApiEnvMod::l_get_us_time(lua_State *L)
947943
{
944+
NO_MAP_LOCK_REQUIRED;
948945
lua_pushnumber(L, porting::getTimeUs());
949946
return 1;
950947
}

‎src/script/lua_api/l_internal.h

+10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3333
#define API_FCT(name) registerFunction(L, #name, l_##name,top)
3434
#define ASYNC_API_FCT(name) engine.registerFunction(#name, l_##name)
3535

36+
#define MAP_LOCK_REQUIRED
3637
#define NO_MAP_LOCK_REQUIRED
3738

3839
/*
@@ -45,4 +46,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
4546
#endif
4647
*/
4748

49+
#define GET_ENV_PTR_NO_MAP_LOCK \
50+
ServerEnvironment *env = (ServerEnvironment *)getEnv(L); \
51+
if (env == NULL) \
52+
return 0
53+
54+
#define GET_ENV_PTR \
55+
MAP_LOCK_REQUIRED; \
56+
GET_ENV_PTR_NO_MAP_LOCK
57+
4858
#endif /* L_INTERNAL_H_ */

‎src/script/lua_api/l_inventory.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,7 @@ int ModApiInventory::l_get_inventory(lua_State *L)
491491
std::string type = checkstringfield(L, 1, "type");
492492

493493
if(type == "node"){
494+
MAP_LOCK_REQUIRED;
494495
lua_getfield(L, 1, "pos");
495496
v3s16 pos = check_v3s16(L, -1);
496497
loc.setNodeMeta(pos);
@@ -514,7 +515,7 @@ int ModApiInventory::l_get_inventory(lua_State *L)
514515
InvRef::create(L, loc);
515516
else
516517
lua_pushnil(L);
517-
return 1;
518+
return 1;
518519
// END NO_MAP_LOCK_REQUIRED;
519520
}
520521
}

‎src/script/lua_api/l_mapgen.cpp

+43-1
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,8 @@ size_t get_biome_list(lua_State *L, int index,
454454
// returns the biome id used in biomemap
455455
int ModApiMapgen::l_get_biome_id(lua_State *L)
456456
{
457+
NO_MAP_LOCK_REQUIRED;
458+
457459
const char *biome_str = lua_tostring(L, 1);
458460
if (!biome_str)
459461
return 0;
@@ -463,7 +465,7 @@ int ModApiMapgen::l_get_biome_id(lua_State *L)
463465
if (!bmgr)
464466
return 0;
465467

466-
Biome *biome = (Biome *) bmgr->getByName(biome_str);
468+
Biome *biome = (Biome *)bmgr->getByName(biome_str);
467469

468470
if (!biome || biome->index == OBJDEF_INVALID_INDEX)
469471
return 0;
@@ -478,6 +480,8 @@ int ModApiMapgen::l_get_biome_id(lua_State *L)
478480
// returns the requested object used during map generation
479481
int ModApiMapgen::l_get_mapgen_object(lua_State *L)
480482
{
483+
NO_MAP_LOCK_REQUIRED;
484+
481485
const char *mgobjstr = lua_tostring(L, 1);
482486

483487
int mgobjint;
@@ -588,6 +592,8 @@ int ModApiMapgen::l_get_mapgen_object(lua_State *L)
588592

589593
int ModApiMapgen::l_get_mapgen_params(lua_State *L)
590594
{
595+
NO_MAP_LOCK_REQUIRED;
596+
591597
MapgenParams *params = &getServer(L)->getEmergeManager()->params;
592598

593599
lua_newtable(L);
@@ -616,6 +622,8 @@ int ModApiMapgen::l_get_mapgen_params(lua_State *L)
616622
// set mapgen parameters
617623
int ModApiMapgen::l_set_mapgen_params(lua_State *L)
618624
{
625+
NO_MAP_LOCK_REQUIRED;
626+
619627
if (!lua_istable(L, 1))
620628
return 0;
621629

@@ -664,6 +672,8 @@ int ModApiMapgen::l_set_mapgen_params(lua_State *L)
664672
// set global config values for noise parameters
665673
int ModApiMapgen::l_set_noiseparams(lua_State *L)
666674
{
675+
NO_MAP_LOCK_REQUIRED;
676+
667677
const char *name = luaL_checkstring(L, 1);
668678

669679
NoiseParams np;
@@ -681,6 +691,8 @@ int ModApiMapgen::l_set_noiseparams(lua_State *L)
681691
// get_noiseparams(name)
682692
int ModApiMapgen::l_get_noiseparams(lua_State *L)
683693
{
694+
NO_MAP_LOCK_REQUIRED;
695+
684696
std::string name = luaL_checkstring(L, 1);
685697

686698
NoiseParams np;
@@ -695,6 +707,8 @@ int ModApiMapgen::l_get_noiseparams(lua_State *L)
695707
// set_gen_notify(flags, {deco_id_table})
696708
int ModApiMapgen::l_set_gen_notify(lua_State *L)
697709
{
710+
NO_MAP_LOCK_REQUIRED;
711+
698712
u32 flags = 0, flagmask = 0;
699713
EmergeManager *emerge = getServer(L)->getEmergeManager();
700714

@@ -719,6 +733,8 @@ int ModApiMapgen::l_set_gen_notify(lua_State *L)
719733
// get_gen_notify()
720734
int ModApiMapgen::l_get_gen_notify(lua_State *L)
721735
{
736+
NO_MAP_LOCK_REQUIRED;
737+
722738
EmergeManager *emerge = getServer(L)->getEmergeManager();
723739
push_flags_string(L, flagdesc_gennotify, emerge->gen_notify_on,
724740
emerge->gen_notify_on);
@@ -738,6 +754,8 @@ int ModApiMapgen::l_get_gen_notify(lua_State *L)
738754
// register_biome({lots of stuff})
739755
int ModApiMapgen::l_register_biome(lua_State *L)
740756
{
757+
NO_MAP_LOCK_REQUIRED;
758+
741759
int index = 1;
742760
luaL_checktype(L, index, LUA_TTABLE);
743761

@@ -762,6 +780,8 @@ int ModApiMapgen::l_register_biome(lua_State *L)
762780
// register_decoration({lots of stuff})
763781
int ModApiMapgen::l_register_decoration(lua_State *L)
764782
{
783+
NO_MAP_LOCK_REQUIRED;
784+
765785
int index = 1;
766786
luaL_checktype(L, index, LUA_TTABLE);
767787

@@ -902,6 +922,8 @@ bool read_deco_schematic(lua_State *L, SchematicManager *schemmgr, DecoSchematic
902922
// register_ore({lots of stuff})
903923
int ModApiMapgen::l_register_ore(lua_State *L)
904924
{
925+
NO_MAP_LOCK_REQUIRED;
926+
905927
int index = 1;
906928
luaL_checktype(L, index, LUA_TTABLE);
907929

@@ -1030,6 +1052,8 @@ int ModApiMapgen::l_register_ore(lua_State *L)
10301052
// register_schematic({schematic}, replacements={})
10311053
int ModApiMapgen::l_register_schematic(lua_State *L)
10321054
{
1055+
NO_MAP_LOCK_REQUIRED;
1056+
10331057
SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr;
10341058

10351059
StringMap replace_names;
@@ -1055,6 +1079,8 @@ int ModApiMapgen::l_register_schematic(lua_State *L)
10551079
// clear_registered_biomes()
10561080
int ModApiMapgen::l_clear_registered_biomes(lua_State *L)
10571081
{
1082+
NO_MAP_LOCK_REQUIRED;
1083+
10581084
BiomeManager *bmgr = getServer(L)->getEmergeManager()->biomemgr;
10591085
bmgr->clear();
10601086
return 0;
@@ -1064,6 +1090,8 @@ int ModApiMapgen::l_clear_registered_biomes(lua_State *L)
10641090
// clear_registered_decorations()
10651091
int ModApiMapgen::l_clear_registered_decorations(lua_State *L)
10661092
{
1093+
NO_MAP_LOCK_REQUIRED;
1094+
10671095
DecorationManager *dmgr = getServer(L)->getEmergeManager()->decomgr;
10681096
dmgr->clear();
10691097
return 0;
@@ -1073,6 +1101,8 @@ int ModApiMapgen::l_clear_registered_decorations(lua_State *L)
10731101
// clear_registered_ores()
10741102
int ModApiMapgen::l_clear_registered_ores(lua_State *L)
10751103
{
1104+
NO_MAP_LOCK_REQUIRED;
1105+
10761106
OreManager *omgr = getServer(L)->getEmergeManager()->oremgr;
10771107
omgr->clear();
10781108
return 0;
@@ -1082,6 +1112,8 @@ int ModApiMapgen::l_clear_registered_ores(lua_State *L)
10821112
// clear_registered_schematics()
10831113
int ModApiMapgen::l_clear_registered_schematics(lua_State *L)
10841114
{
1115+
NO_MAP_LOCK_REQUIRED;
1116+
10851117
SchematicManager *smgr = getServer(L)->getEmergeManager()->schemmgr;
10861118
smgr->clear();
10871119
return 0;
@@ -1091,6 +1123,8 @@ int ModApiMapgen::l_clear_registered_schematics(lua_State *L)
10911123
// generate_ores(vm, p1, p2, [ore_id])
10921124
int ModApiMapgen::l_generate_ores(lua_State *L)
10931125
{
1126+
NO_MAP_LOCK_REQUIRED;
1127+
10941128
EmergeManager *emerge = getServer(L)->getEmergeManager();
10951129

10961130
Mapgen mg;
@@ -1115,6 +1149,8 @@ int ModApiMapgen::l_generate_ores(lua_State *L)
11151149
// generate_decorations(vm, p1, p2, [deco_id])
11161150
int ModApiMapgen::l_generate_decorations(lua_State *L)
11171151
{
1152+
NO_MAP_LOCK_REQUIRED;
1153+
11181154
EmergeManager *emerge = getServer(L)->getEmergeManager();
11191155

11201156
Mapgen mg;
@@ -1139,6 +1175,8 @@ int ModApiMapgen::l_generate_decorations(lua_State *L)
11391175
// create_schematic(p1, p2, probability_list, filename, y_slice_prob_list)
11401176
int ModApiMapgen::l_create_schematic(lua_State *L)
11411177
{
1178+
MAP_LOCK_REQUIRED;
1179+
11421180
INodeDefManager *ndef = getServer(L)->getNodeDefManager();
11431181

11441182
const char *filename = luaL_checkstring(L, 4);
@@ -1202,6 +1240,8 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
12021240
// place_schematic(p, schematic, rotation, replacement)
12031241
int ModApiMapgen::l_place_schematic(lua_State *L)
12041242
{
1243+
MAP_LOCK_REQUIRED;
1244+
12051245
Map *map = &(getEnv(L)->getMap());
12061246
SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr;
12071247

@@ -1240,6 +1280,8 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
12401280
// serialize_schematic(schematic, format, options={...})
12411281
int ModApiMapgen::l_serialize_schematic(lua_State *L)
12421282
{
1283+
NO_MAP_LOCK_REQUIRED;
1284+
12431285
SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr;
12441286

12451287
//// Read options

‎src/script/lua_api/l_nodemeta.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ int NodeMetaRef::gc_object(lua_State *L) {
8282
// get_string(self, name)
8383
int NodeMetaRef::l_get_string(lua_State *L)
8484
{
85+
MAP_LOCK_REQUIRED;
86+
8587
NodeMetaRef *ref = checkobject(L, 1);
8688
std::string name = luaL_checkstring(L, 2);
8789

@@ -98,6 +100,8 @@ int NodeMetaRef::l_get_string(lua_State *L)
98100
// set_string(self, name, var)
99101
int NodeMetaRef::l_set_string(lua_State *L)
100102
{
103+
MAP_LOCK_REQUIRED;
104+
101105
NodeMetaRef *ref = checkobject(L, 1);
102106
std::string name = luaL_checkstring(L, 2);
103107
size_t len = 0;
@@ -115,6 +119,8 @@ int NodeMetaRef::l_set_string(lua_State *L)
115119
// get_int(self, name)
116120
int NodeMetaRef::l_get_int(lua_State *L)
117121
{
122+
MAP_LOCK_REQUIRED;
123+
118124
NodeMetaRef *ref = checkobject(L, 1);
119125
std::string name = lua_tostring(L, 2);
120126

@@ -131,6 +137,8 @@ int NodeMetaRef::l_get_int(lua_State *L)
131137
// set_int(self, name, var)
132138
int NodeMetaRef::l_set_int(lua_State *L)
133139
{
140+
MAP_LOCK_REQUIRED;
141+
134142
NodeMetaRef *ref = checkobject(L, 1);
135143
std::string name = lua_tostring(L, 2);
136144
int a = lua_tointeger(L, 3);
@@ -147,6 +155,8 @@ int NodeMetaRef::l_set_int(lua_State *L)
147155
// get_float(self, name)
148156
int NodeMetaRef::l_get_float(lua_State *L)
149157
{
158+
MAP_LOCK_REQUIRED;
159+
150160
NodeMetaRef *ref = checkobject(L, 1);
151161
std::string name = lua_tostring(L, 2);
152162

@@ -163,6 +173,8 @@ int NodeMetaRef::l_get_float(lua_State *L)
163173
// set_float(self, name, var)
164174
int NodeMetaRef::l_set_float(lua_State *L)
165175
{
176+
MAP_LOCK_REQUIRED;
177+
166178
NodeMetaRef *ref = checkobject(L, 1);
167179
std::string name = lua_tostring(L, 2);
168180
float a = lua_tonumber(L, 3);
@@ -179,6 +191,8 @@ int NodeMetaRef::l_set_float(lua_State *L)
179191
// get_inventory(self)
180192
int NodeMetaRef::l_get_inventory(lua_State *L)
181193
{
194+
MAP_LOCK_REQUIRED;
195+
182196
NodeMetaRef *ref = checkobject(L, 1);
183197
getmeta(ref, true); // try to ensure the metadata exists
184198
InvRef::createNodeMeta(L, ref->m_p);
@@ -188,6 +202,8 @@ int NodeMetaRef::l_get_inventory(lua_State *L)
188202
// to_table(self)
189203
int NodeMetaRef::l_to_table(lua_State *L)
190204
{
205+
MAP_LOCK_REQUIRED;
206+
191207
NodeMetaRef *ref = checkobject(L, 1);
192208

193209
NodeMetadata *meta = getmeta(ref, true);
@@ -230,6 +246,8 @@ int NodeMetaRef::l_to_table(lua_State *L)
230246
// from_table(self, table)
231247
int NodeMetaRef::l_from_table(lua_State *L)
232248
{
249+
MAP_LOCK_REQUIRED;
250+
233251
NodeMetaRef *ref = checkobject(L, 1);
234252
int base = 2;
235253

0 commit comments

Comments
 (0)
Please sign in to comment.