← Back to team overview

mudlet-makers team mailing list archive

Re: [Bug 1226558] Re: getRoom in TArea causes seg fault on map creation

 

On 28/09/13 00:50, Vadim Peretokin wrote:
> On Sat, Sep 28, 2013 at 3:53 AM, Stephen Lyons
> <1226558@xxxxxxxxxxxxxxxxxx>wrote:
> 
>> The thing about area 0 seems to be we don't seem to actually explicitly
>> create it!  Also the code to move rooms to an area does not seem to
>> update the old area to take the room FROM it - we get away with this at
>> mostly at the moment because I guess the typical usage is to create a
>> room and then put it into the desired area and relatively rarely does
>> rooms get moved to a new area.
>>
>>
> Do you mean that the room gets left over in the old area? This doesn't seem
> to be the case right now... which case do you speak of that would break it
> here?
> 
> There have been a couple of people recently who started writing mapper
> scripts and have been crashing Mudlet quite often - so I'm suspicious here.
> 
> 
>> I'd suggest ensuring that an area 0 is created with new maps, and that
>> during map auditing of existing ones, we add area 0 and all rooms with
>> area = 0 to that area, also I'd be minded to check that each room only
>> appears in the "rooms" of one area.  If we increment the map version at
>> this point the user will only be hit by these extra checks once per map
>> file.
>>
>>
> I think you're using area 0 in several concepts here. Otherwise "I'd
> suggest ensuring that an area 0 is created with new maps, and that during
> map auditing of existing ones, we add area 0 and all rooms with area = 0 to
> that area [area 0]" doens't make sense. Do you mean rooms with an unset
> area... ? But that doesn't fix the "we add area 0 to area 0" logical
> peculiarity.

I think I needed another comma ',' or a couple of extra words:
>"I'd suggest ensuring that an area 0 is created with new maps, and
> that during map auditing of existing ones, we add area 0*[,]* and
> [then] all rooms with area = 0 to [that] area [area 0]"

The TRoom class has an int called "area" which is 0 in the constructor,
but gets set to the areaID as the room is added to the appropriate
TRoomDB's QMap<int, TArea *> "areas" member's "rooms" member - and
currently actually also gets set even if "area" is Not a valid areaID
value...

What I mean is to create an area 0 in TRoomDB areas if it does not
exist, then add any existing "orphan" room (not belonging to an area
already and thus their "area" value is zero) to that area during the map
auditing process.  Probably because of that defect over setting the
TRoom area value I noticed I found with one test map I am using around
ten rooms that had disappeared from the map which had a non-zero and
valid value in that member but which were NOT in the corresponding
TArea's rooms list and had thus dropped off the map.

As I type I have got some updated auditing code that reports these
problems (and checks every room is in one and only one TArea rooms list,
and that the TRoom "area" value matches the "areaID" of the TArea
"rooms" list in which it appears).  I need to do more tests with a map
file that has rooms with no area both with and without a predefined area
0 which is what I am just about to do...

> 
> 
>> In general adding a room should auto-magically place it in area 0. Also
>> TArea.cpp need a removeRoom method which will be used both on room
>> deletion and movement to a different area.  Of course calls that add or
>> delete rooms from an area should also cause an update to the min/maxs
>> and the ebenes (levels?) for that area - which I am not sure is
>> happening universally at the present.
>>
>>
> That'd make sense.
> 
> 
>> Right, I'm going to brew a fresh cup of coffee and take a look at trying
>> to coding this unless someone else has a solution already worked out...
>>
>>
> I'd be a wary here, we'd better get Heikos sign-off on this. He's never
> documented his design in this so you wouldn't know what else might you
> break without consulting him first (and breaking the design or going
> against his philosophy is something that could happen, and result in wasted
> effort).
> 
> 
>> On 27/09/13 16:50, Chris wrote:
>>> So I think the best solution is to nix the use of area 0, have -1 be a
>>> void area, and enumeration begin at 1. This doesn't appear to break any
>>> scripts, as using area 0 actually causes scripts to break.  If perusing
>>> the code supports this, I'll put in this fix.
>>>
>>
>> --
>> You received this bug notification because you are a member of Mudlet
>> Makers, which is subscribed to Mudlet.
>> https://bugs.launchpad.net/bugs/1226558
>>
>> Title:
>>   getRoom in TArea causes seg fault on map creation
>>
>> Status in Mudlet the MUD client:
>>   New
>>
>> Bug description:
>>   Creating a new map with this code on the latest development branch
>>   causes this backtrace:
>>
>>   0     TArea::fast_ausgaengeBestimmen  TArea.cpp       168     0x5128bb
>>   1     TMap::setExit   TMap.cpp        304     0x5281ca
>>   2     TLuaInterpreter::setExit        TLuaInterpreter.cpp     6650
>>  0x492075
>>   3     ??      C:\mingw32\lib\lua51.dll                0x66d862e0
>>   4     ??      C:\mingw32\lib\lua51.dll                0x66d8ffa6
>>   5     ??      C:\mingw32\lib\lua51.dll                0x66d866e0
>>   6     ??      C:\mingw32\lib\lua51.dll                0x66d81590
>>   7     ??      C:\mingw32\lib\lua51.dll                0x66d85ad6
>>   8     ??      C:\mingw32\lib\lua51.dll                0x66d86843
>>   9     ??      C:\mingw32\lib\lua51.dll                0x66d82870
>>   10    TLuaInterpreter::compile        TLuaInterpreter.cpp     9649
>>  0x49ce7a
>>   11    TScript::compileScript  TScript.cpp     150     0x4b04d7
>>   12    TScript::setScript      TScript.cpp     143     0x4b048e
>>   13    dlgTriggerEditor::saveScript    dlgTriggerEditor.cpp    4282
>>  0x456ad9
>>   14    dlgTriggerEditor::slot_saveScriptAfterEdit
>>  dlgTriggerEditor.cpp    4178    0x456799
>>   15    dlgTriggerEditor::slot_save_edit        dlgTriggerEditor.cpp
>>  6932    0x46a642
>>   16    dlgTriggerEditor::qt_static_metacall    moc_dlgTriggerEditor.cpp
>>      509     0x57ecd9
>>   17    QMetaObject::activate   qobject.cpp     3479    0x4c94cd0
>>   18    QMetaObject::activate   qobject.cpp     3354    0x4c94672
>>   19    QAction::triggered      moc_qaction.cpp 356     0x11674669
>>   20    QAction::activate       qaction.cpp     1175    0x11673c1e
>>   ...   <More>
>>
>>
>>   code:
>>
>>   -------------------------------------------------
>>   --         Put your Lua functions here.        --
>>   --                                             --
>>   -- Note that you can also use external Scripts --
>>   -------------------------------------------------
>>   function makeMap()
>>   id = 0
>>   for i=0,100 do
>>         for j=0, 100 do
>>                 addRoom(id)
>>                 --setRoomArea(id,0) --uncomment this and remove below call
>> to avoid seg faults
>>                 setRoomName(id, tostring(id))
>>                 setRoomCoordinates(id, i, j, 0)
>>                 setExit(id-1,id,1)
>>                 setExit(id,id-1,2)
>>                 setRoomArea(id,0)
>>                 id = id+1
>>         end
>>   end
>>   end
>>
>>   function makeLabels()
>>         id=1
>>         for i=0,100 do
>>                 for j=0, 100 do
>>                         --display(id)
>>                         x,y,z = getRoomCoordinates(id)
>>                         createMapLabel(0,tostring(id),x,y,z,0,255,0,0,0,0)
>>                         id = id+1
>>                 end
>>         end
>>   end
>>
>>   --makeMap()
>>   --makeLabels()
>>   centerview(1)
>>
>>   uncomment makeMap and it crashes. It fails when id is 1 as well, so it
>>   isn't because of the i-1 setExit bit. It's caused by mpRoomDB not
>>   being initialized because there is no area created. Even post
>>   creation, the room needs to be assigned to an area first before any
>>   calls to mpRoomDB are called, else it will seg fault. It seems like we
>>   need some 'void' area that has no name and is just an abyss for rooms
>>   waiting to be allocated to avoid breaking scripts.
>>
>> To manage notifications about this bug go to:
>> https://bugs.launchpad.net/mudlet/+bug/1226558/+subscriptions
>>
>> _______________________________________________
>> Mailing list: https://launchpad.net/~mudlet-makers
>> Post to     : mudlet-makers@xxxxxxxxxxxxxxxxxxx
>> Unsubscribe : https://launchpad.net/~mudlet-makers
>> More help   : https://help.launchpad.net/ListHelp
>>
>

-- 
You received this bug notification because you are a member of Mudlet
Makers, which is subscribed to Mudlet.
https://bugs.launchpad.net/bugs/1226558

Title:
  getRoom in TArea causes seg fault on map creation

Status in Mudlet the MUD client:
  New

Bug description:
  Creating a new map with this code on the latest development branch
  causes this backtrace:

  0	TArea::fast_ausgaengeBestimmen	TArea.cpp	168	0x5128bb	
  1	TMap::setExit	TMap.cpp	304	0x5281ca	
  2	TLuaInterpreter::setExit	TLuaInterpreter.cpp	6650	0x492075	
  3	??	C:\mingw32\lib\lua51.dll		0x66d862e0	
  4	??	C:\mingw32\lib\lua51.dll		0x66d8ffa6	
  5	??	C:\mingw32\lib\lua51.dll		0x66d866e0	
  6	??	C:\mingw32\lib\lua51.dll		0x66d81590	
  7	??	C:\mingw32\lib\lua51.dll		0x66d85ad6	
  8	??	C:\mingw32\lib\lua51.dll		0x66d86843	
  9	??	C:\mingw32\lib\lua51.dll		0x66d82870	
  10	TLuaInterpreter::compile	TLuaInterpreter.cpp	9649	0x49ce7a	
  11	TScript::compileScript	TScript.cpp	150	0x4b04d7	
  12	TScript::setScript	TScript.cpp	143	0x4b048e	
  13	dlgTriggerEditor::saveScript	dlgTriggerEditor.cpp	4282	0x456ad9	
  14	dlgTriggerEditor::slot_saveScriptAfterEdit	dlgTriggerEditor.cpp	4178	0x456799	
  15	dlgTriggerEditor::slot_save_edit	dlgTriggerEditor.cpp	6932	0x46a642	
  16	dlgTriggerEditor::qt_static_metacall	moc_dlgTriggerEditor.cpp	509	0x57ecd9	
  17	QMetaObject::activate	qobject.cpp	3479	0x4c94cd0	
  18	QMetaObject::activate	qobject.cpp	3354	0x4c94672	
  19	QAction::triggered	moc_qaction.cpp	356	0x11674669	
  20	QAction::activate	qaction.cpp	1175	0x11673c1e	
  ...	<More>				

  
  code:

  -------------------------------------------------
  --         Put your Lua functions here.        --
  --                                             --
  -- Note that you can also use external Scripts --
  -------------------------------------------------
  function makeMap()
  id = 0
  for i=0,100 do
  	for j=0, 100 do
  		addRoom(id)
  		--setRoomArea(id,0) --uncomment this and remove below call to avoid seg faults
  		setRoomName(id, tostring(id))
  		setRoomCoordinates(id, i, j, 0)
  		setExit(id-1,id,1)
  		setExit(id,id-1,2)
  		setRoomArea(id,0)
  		id = id+1	
  	end
  end
  end

  function makeLabels()
  	id=1
  	for i=0,100 do
  		for j=0, 100 do
  			--display(id)
  			x,y,z = getRoomCoordinates(id)
  			createMapLabel(0,tostring(id),x,y,z,0,255,0,0,0,0) 
  			id = id+1
  		end
  	end
  end

  --makeMap()
  --makeLabels()
  centerview(1)

  uncomment makeMap and it crashes. It fails when id is 1 as well, so it
  isn't because of the i-1 setExit bit. It's caused by mpRoomDB not
  being initialized because there is no area created. Even post
  creation, the room needs to be assigned to an area first before any
  calls to mpRoomDB are called, else it will seg fault. It seems like we
  need some 'void' area that has no name and is just an abyss for rooms
  waiting to be allocated to avoid breaking scripts.

To manage notifications about this bug go to:
https://bugs.launchpad.net/mudlet/+bug/1226558/+subscriptions


References