a mutex added to TempMods which hopefully fixes rare segfaults on client

This commit is contained in:
Perttu Ahola 2010-12-23 10:29:09 +02:00
parent 71948dbf96
commit 03d67af9e8
4 changed files with 82 additions and 76 deletions

@ -26,18 +26,12 @@ CXXFLAGS = -O2 -ffast-math -Wall -g -pipe
#CXXFLAGS = -O1 -ffast-math -Wall -g #CXXFLAGS = -O1 -ffast-math -Wall -g
#CXXFLAGS = -Wall -g -O0 #CXXFLAGS = -Wall -g -O0
#FAST_CXXFLAGS = -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops -mtune=i686 all: fast_linux
#Default target
all: all_linux
ifeq ($(HOSTTYPE), x86_64) ifeq ($(HOSTTYPE), x86_64)
LIBSELECT=64 LIBSELECT=64
endif endif
# Target specific settings
all_linux fast_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L$(IRRLICHTPATH)/lib/Linux -L$(JTHREADPATH)/src/.libs -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -ljthread -lz all_linux fast_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L$(IRRLICHTPATH)/lib/Linux -L$(JTHREADPATH)/src/.libs -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -ljthread -lz
all_linux fast_linux: CPPFLAGS = -I$(IRRLICHTPATH)/include -I/usr/X11R6/include -I$(JTHREADPATH)/src all_linux fast_linux: CPPFLAGS = -I$(IRRLICHTPATH)/include -I/usr/X11R6/include -I$(JTHREADPATH)/src
fast_linux server_linux: CXXFLAGS = -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops -mtune=i686 fast_linux server_linux: CXXFLAGS = -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops -mtune=i686
@ -45,20 +39,13 @@ server_linux: LDFLAGS = -L$(JTHREADPATH)/src/.libs -ljthread -lz -lpthread
server_linux: CPPFLAGS = -I$(IRRLICHTPATH)/include -I/usr/X11R6/include -I$(JTHREADPATH)/src -DSERVER server_linux: CPPFLAGS = -I$(IRRLICHTPATH)/include -I/usr/X11R6/include -I$(JTHREADPATH)/src -DSERVER
all_linux fast_linux clean_linux: SYSTEM=Linux all_linux fast_linux clean_linux: SYSTEM=Linux
# These are out of date DESTPATH = bin/$(TARGET)
all_win32: LDFLAGS = -L$(IRRLICHTPATH)/lib/Win32-gcc -L$(JTHREADPATH)/Debug -lIrrlicht -lopengl32 -lm -ljthread FAST_DESTPATH = bin/$(FAST_TARGET)
all_win32 clean_win32: SYSTEM=Win32-gcc SERVER_DESTPATH = bin/$(SERVER_TARGET)
all_win32 clean_win32: SUF=.exe
# Name of the binary - only valid for targets which set SYSTEM
DESTPATH = bin/$(TARGET)$(SUF)
FAST_DESTPATH = bin/$(FAST_TARGET)$(SUF)
SERVER_DESTPATH = bin/$(SERVER_TARGET)$(SUF)
# Build commands # Build commands
all_linux all_win32: $(BUILD_DIR) $(DESTPATH) all_linux: $(BUILD_DIR) $(DESTPATH)
fast_linux: $(FAST_BUILD_DIR) $(FAST_DESTPATH) fast_linux: $(FAST_BUILD_DIR) $(FAST_DESTPATH)
server_linux: $(SERVER_BUILD_DIR) $(SERVER_DESTPATH) server_linux: $(SERVER_BUILD_DIR) $(SERVER_DESTPATH)
@ -87,13 +74,13 @@ $(FAST_BUILD_DIR)/%.o: src/%.cpp
$(SERVER_BUILD_DIR)/%.o: src/%.cpp $(SERVER_BUILD_DIR)/%.o: src/%.cpp
$(CXX) -c -o $@ $< $(CPPFLAGS) $(CXXFLAGS) $(CXX) -c -o $@ $< $(CPPFLAGS) $(CXXFLAGS)
clean: clean_linux clean_win32 clean_fast_linux clean_server_linux clean: clean_linux clean_fast_linux clean_server_linux
clean_linux clean_win32: clean_linux:
@$(RM) $(OBJECTS) $(DESTPATH) @$(RM) $(OBJECTS) $(DESTPATH)
clean_fast_linux: clean_fast_linux:
@$(RM) $(OBJECTS) $(FAST_DESTPATH) @$(RM) $(FAST_OBJECTS) $(FAST_DESTPATH)
clean_server_linux: clean_server_linux:
@$(RM) $(SERVER_OBJECTS) $(SERVER_DESTPATH) @$(RM) $(SERVER_OBJECTS) $(SERVER_DESTPATH)

@ -91,6 +91,7 @@ SUGG: Implement a "Fast check queue" (a queue with a map for checking
SUGG: Signs could be done in the same way as torches. For this, blocks SUGG: Signs could be done in the same way as torches. For this, blocks
need an additional metadata field for the texts need an additional metadata field for the texts
- This is also needed for item container chests
SUGG: Precalculate lighting translation table at runtime (at startup) SUGG: Precalculate lighting translation table at runtime (at startup)
@ -99,6 +100,15 @@ SUGG: A version number to blocks, which increments when the block is
- This can then be used to make sure the most recent version of - This can then be used to make sure the most recent version of
a block has been sent to client a block has been sent to client
SUGG: Make the amount of blocks sending to client and the total
amount of blocks dynamically limited. Transferring blocks is the
main network eater of this system, so it is the one that has
to be throttled so that RTTs stay low.
TODO: Untie client network operations from framerate
- Needs some input queues or something
- Not really necessary?
TODO: Combine MapBlock's face caches to so big pieces that VBO TODO: Combine MapBlock's face caches to so big pieces that VBO
gets used gets used
- That is >500 vertices - That is >500 vertices
@ -106,11 +116,7 @@ TODO: Combine MapBlock's face caches to so big pieces that VBO
TODO: Better dungeons TODO: Better dungeons
TODO: Cliffs, arcs TODO: Cliffs, arcs
TODO: Menus TODO: Startup and configuration menu
TODO: Moving players more smoothly. Calculate moving animation
in a way that doesn't make the player jump to the right place
immediately when the server sends a new position
TODO: There are some lighting-related todos and fixmes in TODO: There are some lighting-related todos and fixmes in
ServerMap::emergeBlock ServerMap::emergeBlock
@ -119,16 +125,10 @@ TODO: Proper handling of spawning place (try to find something that
is not in the middle of an ocean (some land to stand on at is not in the middle of an ocean (some land to stand on at
least) and save it in map config. least) and save it in map config.
TODO: Make the amount of blocks sending to client and the total
amount of blocks dynamically limited. Transferring blocks is the
main network eater of this system, so it is the one that has
to be throttled so that RTTs stay low.
TODO: Server to load starting inventory from disk
TODO: Players to only be hidden when the client quits. TODO: Players to only be hidden when the client quits.
TODO: - Players to be saved on disk, with inventory TODO: - Players to be saved on disk, with inventory
TODO: Players to be saved as text in map/players/<name> TODO: Players to be saved as text in map/players/<name>
TODO: Player inventory to be saved on disk
TODO: Make fetching sector's blocks more efficient when rendering TODO: Make fetching sector's blocks more efficient when rendering
sectors that have very large amounts of blocks (on client) sectors that have very large amounts of blocks (on client)
@ -149,9 +149,6 @@ Block object server side:
TODO: Copy the text of the last picked sign to inventory in creative TODO: Copy the text of the last picked sign to inventory in creative
mode mode
TODO: Untie client network operations from framerate
- Needs some input queues or something
TODO: Get rid of GotSplitPacketException TODO: Get rid of GotSplitPacketException
TODO: Check what goes wrong with caching map to disk (Kray) TODO: Check what goes wrong with caching map to disk (Kray)
@ -168,7 +165,7 @@ TODO: Better handling of objects and mobs
- Make other players utilize the same framework - Make other players utilize the same framework
TODO: Draw big amounts of torches better (that is, throw them in the TODO: Draw big amounts of torches better (that is, throw them in the
same meshbuffer (can the meshcombiner class be used?)) same meshbuffer (can the meshcollector class be used?))
Doing now: Doing now:
====================================================================== ======================================================================

@ -47,6 +47,7 @@ MapBlock::MapBlock(NodeContainer *parent, v3s16 pos, bool dummy):
m_mesh_expired = false; m_mesh_expired = false;
mesh_mutex.Init(); mesh_mutex.Init();
mesh = NULL; mesh = NULL;
m_temp_mods_mutex.Init();
#endif #endif
} }
@ -585,6 +586,10 @@ void MapBlock::updateMesh(u32 daynight_ratio)
NOTE: This is the slowest part of this method. NOTE: This is the slowest part of this method.
*/ */
{
// Lock this, as m_temp_mods will be used directly
JMutexAutoLock lock(m_temp_mods_mutex);
/* /*
Go through every y,z and get top faces in rows of x+ Go through every y,z and get top faces in rows of x+
*/ */
@ -627,6 +632,7 @@ void MapBlock::updateMesh(u32 daynight_ratio)
fastfaces_new); fastfaces_new);
} }
} }
}
// End of slow part // End of slow part

@ -399,15 +399,30 @@ public:
<<", mod.type="<<mod.type <<", mod.type="<<mod.type
<<", mod.param="<<mod.param <<", mod.param="<<mod.param
<<std::endl;*/ <<std::endl;*/
JMutexAutoLock lock(m_temp_mods_mutex);
m_temp_mods[p] = mod; m_temp_mods[p] = mod;
} }
// Returns true if there was one
bool getTempMod(v3s16 p, struct NodeMod *mod)
{
JMutexAutoLock lock(m_temp_mods_mutex);
core::map<v3s16, NodeMod>::Node *n;
n = m_temp_mods.find(p);
if(n == NULL)
return false;
if(mod)
*mod = n->getValue();
return true;
}
void clearTempMod(v3s16 p) void clearTempMod(v3s16 p)
{ {
JMutexAutoLock lock(m_temp_mods_mutex);
if(m_temp_mods.find(p)) if(m_temp_mods.find(p))
m_temp_mods.remove(p); m_temp_mods.remove(p);
} }
void clearTempMods() void clearTempMods()
{ {
JMutexAutoLock lock(m_temp_mods_mutex);
m_temp_mods.clear(); m_temp_mods.clear();
} }
#endif #endif
@ -517,6 +532,7 @@ private:
// Temporary modifications to nodes // Temporary modifications to nodes
// These are only used when drawing // These are only used when drawing
core::map<v3s16, NodeMod> m_temp_mods; core::map<v3s16, NodeMod> m_temp_mods;
JMutex m_temp_mods_mutex;
#endif #endif
}; };