huge memory leak in my game dll
Posted: Sat Nov 26, 2022 10:42 am
Hello,
I have made a game dll in PureBasic, to have menus, edit boxes, and a few other things. If it looks strange, it is just for audiogames. I would like to use this dll in python.
In PureBasic, all the functions work fine, with no problem, however in python, a huge memory leak occurs.
Here is my code. It is a bit long, but the problem seems to be with the second and 3rd modes (menu and edit box mode).
This code is very disorganized. I fully intend on cleaning it up later, this is more of an experiment than anything else at this stage.
Thanks much all for your help.
If anything in PureBasic could be causing this, some help finding it will be much appreciated; I am at a loss.
I have made a game dll in PureBasic, to have menus, edit boxes, and a few other things. If it looks strange, it is just for audiogames. I would like to use this dll in python.
In PureBasic, all the functions work fine, with no problem, however in python, a huge memory leak occurs.
Here is my code. It is a bit long, but the problem seems to be with the second and 3rd modes (menu and edit box mode).
This code is very disorganized. I fully intend on cleaning it up later, this is more of an experiment than anything else at this stage.
Code: Select all
Global mode.i
Global Dim keys2(512)
Structure event
value.i
type.i
EndStructure
Global NewList events.Event()
Global NewList trackedkeys()
Global NewMap keys()
Procedure error()
MessageRequester("error","An error occured. DLL line "+ErrorLine()+". "+ErrorMessage()+".",#PB_MessageRequester_Error)
EndProcedure
ProcedureCDLL Initialize(windowname.s)
OnErrorCall(@error())
mode=0
InitKeyboard()
InitSprite()
OpenWindow(1,1,1,1,1,windowname+" (powered by cgt)")
keys("a")=#PB_Key_A
keys("b")=#PB_Key_B
keys("c")=#PB_Key_C
keys("d")=#PB_Key_D
keys("e")=#PB_Key_E
keys("f")=#PB_Key_F
keys("g")=#PB_Key_G
keys("h")=#PB_Key_H
keys("i")=#PB_Key_I
keys("j")=#PB_Key_J
keys("k")=#PB_Key_K
keys("l")=#PB_Key_L
keys("m")=#PB_Key_M
keys("o")=#PB_Key_O
keys("p")=#PB_Key_P
keys("q")=#PB_Key_Q
keys("r")=#PB_Key_R
keys("s")=#PB_Key_S
keys("t")=#PB_Key_T
keys("u")=#PB_Key_U
keys("v")=#PB_Key_V
keys("w")=#PB_Key_W
keys("x")=#PB_Key_X
keys("y")=#PB_Key_Y
keys("z")=#PB_Key_Z
keys("left")=#PB_Key_Left
keys("right")=#PB_Key_Right
keys("down")=#PB_Key_Down
keys("up")=#PB_Key_Up
keys("space")=#PB_Key_Space
keys("lcontrol")=#PB_Key_LeftControl
keys("rcontrol")=#PB_Key_RightControl
keys("lalt")=#PB_Key_LeftAlt
keys("ralt")=#PB_Key_RightAlt
keys("lshift")=#PB_Key_LeftShift
keys("rshift")=#PB_Key_RightShift
keys("1")=#PB_Key_1
keys("2")=#PB_Key_2
keys("3")=#PB_Key_3
keys("4")=#PB_Key_4
keys("5")=#PB_Key_5
keys("6")=#PB_Key_6
keys("7")=#PB_Key_7
keys("8")=#PB_Key_8
keys("9")=#PB_Key_9
keys("0")=#PB_Key_0
keys("escape")=#PB_Key_Escape
keys("comma")=#PB_Key_Comma
keys("semi")=#PB_Key_SemiColon
keys("tick")=#PB_Key_Apostrophe
keys("slash")=#PB_Key_Slash
keys("dot")=#PB_Key_Period
keys("lbracket")=#PB_Key_LeftBracket
keys("rbracket")=#PB_Key_RightBracket
keys("backslash")=#PB_Key_BackSlash
keys("backspace")=#PB_Key_Back
keys("enter")=#PB_Key_Return
keys("pageup")=#PB_Key_PageUp
keys("pagedown")=#PB_Key_PageDown
keys("home")=#PB_Key_Home
keys("end")=#PB_Key_End
keys("insert")=#PB_Key_Insert
keys("delete")=#PB_Key_Delete
keys("dash")=#PB_Key_Minus
keys("equals")=#PB_Key_Equals
TextGadget(1,1,1,1,1,"menu")
ListViewGadget(2,1,1,1,1)
TextGadget(3,1,1,1,1,"text input")
StringGadget(4,1,1,1,1,"")
HideGadget(1,1)
HideGadget(2,1)
HideGadget(3,1)
HideGadget(4,1)
EndProcedure
ProcedureCDLL TrackKey(key.s)
AddElement(trackedkeys())
trackedkeys()=keys(key)
EndProcedure
ProcedureCDLL ClearTrackedKeys()
ClearList(trackedkeys())
EndProcedure
ProcedureCDLL GetCurrentFrameEvents()
ClearList(events())
Repeat
event=WindowEvent()
If mode=2
If event=#PB_Event_Menu
AddElement(events())
events()\type=3
events()\value=GetGadgetState(2)+1
EndIf
If event=#PB_Event_Gadget
AddElement(events())
events()\type=2
events()\value=GetGadgetState(2)+1
EndIf
EndIf
If mode=3
If event=#PB_Event_Gadget
AddElement(events())
events()\type=4
events()\value=0
EndIf
If event=#PB_Event_Menu
events()\type=5
events()\value=0
EndIf
EndIf
Until event=#PB_Event_None
If mode=1
FlipBuffers()
ExamineKeyboard()
ForEach trackedkeys()
If KeyboardReleased(trackedkeys())
keys2(trackedkeys())=0
AddElement(events())
events()\type=1
events()\value=trackedkeys()
EndIf
If KeyboardPushed(trackedkeys()) And keys2(trackedkeys())=0
keys2(trackedkeys())=1
AddElement(events())
events()\type=0
events()\value=trackedkeys()
EndIf
Next
EndIf
LastElement(events())
AddElement(events())
events()\type=-1
ResetList(events())
EndProcedure
ProcedureCDLL NextFrameEvent()
NextElement(events())
EndProcedure
ProcedureCDLL EventInfo()
ProcedureReturn events()\type
EndProcedure
ProcedureCDLL EventValue()
ProcedureReturn events()\value
EndProcedure
ProcedureCDLL.s KeyValueToString(keyvalue.s)
kv=Val(keyvalue)
ForEach keys()
If keys(MapKey(keys()))=kv
ProcedureReturn MapKey(keys())
EndIf
Next
EndProcedure
ProcedureCDLL shutdown()
CloseWindow(1)
ClearMap(keys())
ClearList(trackedkeys())
For i = 0 To 512
keys2(i)=0
Next
mode=0
CloseScreen()
HideGadget(1,1)
HideGadget(2,1)
HideGadget(3,1)
HideGadget(4,1)
EndProcedure
ProcedureCDLL KeyPressed(key.s)
PushListPosition(events())
did=0
ForEach events()
If events()\type=0 And events()\value=keys(key)
did=1
EndIf
Next
PopListPosition(events())
ProcedureReturn did
EndProcedure
ProcedureCDLL KeyReleased(key.s)
PushListPosition(events())
did=0
ForEach events()
If events()\type=1 And events()\value=keys(key)
did=1
EndIf
Next
PopListPosition(events())
ProcedureReturn did
EndProcedure
ProcedureCDLL KeyDown(key.s)
ProcedureReturn keys2(keys(key))
EndProcedure
ProcedureCDLL KeyUp(key.s)
v=keys2(keys(key))
If v=1
ProcedureReturn 0
Else
ProcedureReturn 1
EndIf
EndProcedure
ProcedureCDLL SetTitle(title.s)
SetWindowTitle(1,title)
EndProcedure
ProcedureCDLL SetMode(modeset)
If modeset>0 And modeset<4
RemoveKeyboardShortcut(1,1)
Select mode
Case 1
CloseScreen()
Case 2
HideGadget(1,1)
HideGadget(2,1)
Case 3
HideGadget(3,1)
HideGadget(4,1)
EndSelect
mode=modeset
Select mode
Case 1
OpenWindowedScreen(WindowID(1),1,1,1,1)
Case 2
HideGadget(1,0)
HideGadget(2,0)
SetActiveGadget(2)
AddKeyboardShortcut(1,#PB_Shortcut_Return,1)
Case 3
HideGadget(3,0)
HideGadget(4,0)
SetActiveGadget(4)
AddKeyboardShortcut(1,#PB_Shortcut_Return,1)
EndSelect
EndIf
EndProcedure
ProcedureCDLL SetInputText(text.s)
SetGadgetText(4,text)
EndProcedure
ProcedureCDLL.s GetInputText()
ProcedureReturn GetGadgetText(4)
EndProcedure
ProcedureCDLL ClearMenu()
ClearGadgetItems(2)
EndProcedure
ProcedureCDLL MenuSize()
ProcedureReturn CountGadgetItems(2)
EndProcedure
ProcedureCDLL AddMenuItem(item.s)
AddGadgetItem(2,-1,item)
EndProcedure
ProcedureCDLL EditMenuItem(index,newtext.s)
SetGadgetItemText(2,index-1,newtext)
EndProcedure
ProcedureCDLL RemoveMenuItem(index)
RemoveGadgetItem(2,index-1)
EndProcedure
ProcedureCDLL.s GetMenuItem(index)
ProcedureReturn GetGadgetItemText(2,index-1)
EndProcedure
If anything in PureBasic could be causing this, some help finding it will be much appreciated; I am at a loss.