FFI question for Gregg
- Posted by ChrisB (moderator) in March
- 1367 views
Hi Gregg
Andy's SDL2 wrapper worked in the first version but unfortunately I seem to be getting an out of memory error. Not sure if there was something I was missing. Here's a bare minimum program that demos the issue.
--minimal setup to demo memory issue with ffi --uses SDL, but will just get relevant structure created include std/ffi.e include std/machine.e include std/math.e public constant SDL_RELEASED = 0 public constant SDL_PRESSED = 1 public enum type SDL_EventType SDL_FIRSTEVENT = 0, -- /**< Unused (do not remove) */ SDL_QUIT = 0x100, --/**< User-requested quit */ --/* These application events have special meaning on iOS, see README-ios.md for details */ SDL_APP_TERMINATING, -- /**< The application is being terminated by the OS -- Called on iOS in applicationWillTerminate() -- Called on Android in onDestroy() -- */ SDL_APP_LOWMEMORY, -- /**< The application is low on memory, free memory if possible. -- Called on iOS in applicationDidReceiveMemoryWarning() -- Called on Android in onLowMemory() -- */ SDL_APP_WILLENTERBACKGROUND,-- /**< The application is about to enter the background -- Called on iOS in applicationWillResignActive() -- Called on Android in onPause() --*/ SDL_APP_DIDENTERBACKGROUND, --/**< The application did enter the background and may not get CPU for some time -- Called on iOS in applicationDidEnterBackground() -- Called on Android in onPause() --*/ SDL_APP_WILLENTERFOREGROUND, --/**< The application is about to enter the foreground -- Called on iOS in applicationWillEnterForeground() -- Called on Android in onResume() --*/ SDL_APP_DIDENTERFOREGROUND, --/**< The application is now interactive -- Called on iOS in applicationDidBecomeActive() -- Called on Android in onResume() -- */ SDL_LOCALECHANGED, SDL_DISPLAYEVENT = 0x150, SDL_WINDOWEVENT = 0x200, SDL_SYSWMEVENT, SDL_KEYDOWN = 0x300, SDL_KEYUP, SDL_TEXTEDITING, SDL_TEXTINPUT, SDL_KEYMAPCHANGED, SDL_TEXTEDITING_EXT, SDL_MOUSEMOTION = 0x400, SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP, SDL_MOUSEWHEEL, SDL_JOYAXISMOTION = 0x600, SDL_JOYBALLMOTION, SDL_JOYHATMOTION, SDL_JOYBUTTONDOWN, SDL_JOYBUTTONUP, SDL_JOYDEVICEADDED, SDL_JOYDEVICEREMOVED, SDL_JOYBATTERYUPDATED, SDL_CONTROLLERAXISMOTION = 0x650, SDL_CONTROLLERBUTTONDOWN, SDL_CONTROLLERBUTTONUP, SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEREMOVED, SDL_CONTROLLERDEVICEREMAPPED, SDL_CONTROLLERTOUCHPADDOWN, SDL_CONTROLLERTOUCHPADMOTION, SDL_CONTROLLERTOUCHPADUP, SDL_CONTROLLERSENSORUPDATE, SDL_FINGERDOWN = 0x700, SDL_FINGERUP, SDL_FINGERMOTION, SDL_DOLLARGESTURE = 0x800, SDL_DOLLARRECORD, SDL_MULTIGESTURE, SDL_CLIPBOARDUPDATE = 0x900, SDL_DROPFILE = 0x1000, SDL_DROPTEXT, SDL_DROPBEGIN, SDL_DROPCOMPLETE, SDL_AUDIODEVICEADDED = 0x1100, SDL_AUDIODEVICEREMOVED, SDL_SENSORUPDATE = 0x1200, SDL_RENDER_TARGETS_RESET = 0x2000, SDL_RENDER_DEVICE_RESET, SDL_POLLSENTINEL = 0x7F00, --/** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use, --* and should be allocated with SDL_RegisterEvents() --*/ SDL_USEREVENT = 0x8000, --/** -- * This last event is only for bounding internal arrays -- */ SDL_LASTEVENT = 0xFFFF end type public constant SDL_CommonEvent = define_c_struct({ C_UINT32, --type C_UINT32 --timestamp }) public constant SDL_DisplayEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_UINT32, --display C_UINT8, --event --C_UINT8, --padding1 --C_UINT8, --padding2 --C_UINT8, --padding3 C_INT32 --data1 }) public constant SDL_WindowEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_UINT32, --windowID C_UINT8, --event --C_UINT8, --padding1 --C_UINT8, --padding2 --C_UINT8, --padding3 C_INT32, --data1 C_INT32 --data2 }) public constant SDL_KeyboardEvent = define_c_struct({ C_UINT32, --type [1] C_UINT32, --timestamp [2] C_UINT32, --windowID [3] C_UINT8, --state [4] C_UINT8 --repeat [5] --C_UINT8, --padding2 [6] --C_UINT8, --padding3 [7] --SDL_Keysym --key that was pressed or released [8] }) public constant SDL_TEXTEDITINGEVENT_TEXT_SIZE = 32 public constant SDL_TextEditingEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_UINT32, --windowID C_CHAR, --text C_INT32, --start C_INT32 --length }) public constant SDL_TextEditingExtEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_UINT32, --windowID C_STRING, --text C_INT32, --start C_INT32 --length }) public constant SDL_TEXTINPUTEVENT_TEXT_SIZE = 32 public constant SDL_TextInputEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_UINT32, --windowID C_CHAR --text }) public constant SDL_MouseMotionEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_UINT32, --windowID C_UINT32, --which C_INT32, --x C_INT32, --y C_INT32, --xrel C_INT32 --yrel }) public constant SDL_MouseButtonEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_UINT32, --windowID C_UINT32, --which C_UINT8, --button C_UINT8, --state C_UINT8, --clicks C_UINT8, --padding1 C_INT32, --x C_INT32 --y }) public constant SDL_MouseWheelEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_UINT32, --windowID C_UINT32, --which C_INT32, --x C_INT32, --y C_UINT32, --direction C_FLOAT, --precisex C_FLOAT, --precisey C_INT32, --mouseX C_INT32 --mouseY }) public constant SDL_JoyAxisEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_LONG, --joystick id which C_UINT8, --axis C_UINT8, --padding1 C_UINT8, --padding2 C_UINT8, --padding3 C_INT16, --value C_UINT16 --padding4 }) public constant SDL_JoyBallEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_LONG, --joystick id which C_UINT8, --ball C_UINT8, --padding1 C_UINT8, --padding2 C_UINT8, --padding3 C_INT16, --xrel C_INT16 --yrel }) public constant SDL_JoyHatEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_LONG, --joystick id which C_UINT8, --hat C_UINT8, --value C_UINT8, --padding1 C_UINT8 --padding2 }) public constant SDL_JoyButtonEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_LONG, --joystick id which C_UINT8, --button C_UINT8, --state C_UINT8, --padding1 C_UINT8 --padding2 }) public constant SDL_JoyDeviceEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_INT32 --which }) public constant SDL_JoyBatteryEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_LONG, --joystick which C_INT --joystick powerlevel }) public constant SDL_ControllerAxisEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_LONG, --joystickid which C_UINT8, --axis --C_UINT8, --padding1 --C_UINT8, --padding2 --C_UINT8, --padding3 C_INT16, --value C_UINT16 --padding4 }) public constant SDL_ControllerButtonEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_LONG, --joystickid which C_UINT8, --button C_UINT8, --state C_UINT8, --padding1 C_UINT8 --padding2 }) public constant SDL_ControllerDeviceEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_INT32 --which }) public constant SDL_ControllerTouchpadEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_LONG, --joystickid which C_INT32, --touchpad C_INT32, --finger C_FLOAT, --x C_FLOAT, --y C_FLOAT --pressure }) public constant SDL_ControllerSensorEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_LONG, --joystickid which C_INT32, --sensor {C_FLOAT,3}, --data (array of 3) C_UINT64 --timestamp of sensor reading in microseconds, if hardware supports info }) public constant SDL_AudioDeviceEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_UINT32, --which C_UINT8, --icapture C_UINT8, --padding1 C_UINT8, --padding2 C_UINT8 --padding3 }) public constant SDL_TouchFingerEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_LONG, --touchID C_LONG, --fingerID C_FLOAT, --x C_FLOAT, --y C_FLOAT, --dx C_FLOAT, --dy C_FLOAT, --pressure C_UINT32 --windowID }) public constant SDL_MultiGestureEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_LONG, --touchID C_FLOAT, --dTheta C_FLOAT, --dDist C_FLOAT, --x C_FLOAT, --y C_UINT16, --numFingers C_UINT16 --padding }) public constant SDL_DollarGestureEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_LONG, --touchID C_LONG, --gestureID C_UINT32, --numFingers C_FLOAT, --error C_FLOAT, --x C_FLOAT --y }) public constant SDL_DropEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_POINTER, --file C_UINT32 --windowID }) public constant SDL_SensorEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_INT32, --which {C_FLOAT,6}, --data C_UINT64 --timestamp of sensor reading in microseconds }) public constant SDL_QuitEvent = define_c_struct({ C_UINT32, --type C_UINT32 --timestamp }) public constant SDL_OSEvent = define_c_struct({ C_UINT32, --type C_UINT32 --timestamp }) public constant SDL_UserEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_UINT32, --windowID C_INT32, --code C_POINTER, --data1 C_POINTER --data2 }) public constant SDL_SysWMEvent = define_c_struct({ C_UINT32, --type C_UINT32, --timestamp C_POINTER --msg }) --=================================================================== public constant SDL_Event = define_c_struct({ C_UINT32, --type [1] SDL_CommonEvent, --[2] SDL_DisplayEvent, --[3] SDL_WindowEvent, --[4] SDL_KeyboardEvent, --[5] SDL_TextEditingEvent, --[6] SDL_TextEditingExtEvent, --[7] SDL_TextInputEvent, --[8] SDL_MouseMotionEvent, --[9] SDL_MouseButtonEvent, --[10] SDL_MouseWheelEvent, --[11] SDL_JoyAxisEvent, --[12] SDL_JoyBallEvent, --[13] SDL_JoyHatEvent, --[14] SDL_JoyButtonEvent, --[15] SDL_JoyDeviceEvent, --[16] SDL_JoyBatteryEvent, --[17] SDL_ControllerAxisEvent, --[18] SDL_ControllerButtonEvent, --[19] SDL_ControllerDeviceEvent, --[20] SDL_ControllerTouchpadEvent, --[21] SDL_ControllerSensorEvent, --[22] SDL_AudioDeviceEvent, --[23] SDL_SensorEvent, --[24] SDL_QuitEvent, --[25] SDL_UserEvent, --[26] SDL_SysWMEvent, --[27] SDL_TouchFingerEvent, --[28] SDL_MultiGestureEvent, --[29] SDL_DollarGestureEvent, --[30] SDL_DropEvent --[31] }) atom event_ptr = allocate_struct(SDL_Event) atom event_type
produces the error
1795457776 couldn't alloc 1795457776 bytes C:\EuProgramming\Euphoria4_1\libffi-euphoria\include\std\ffi.e:780 in function a llocate_struct() Your program has run out of memory. One moment please...
I made some small mods to you ffi.e
public function allocate_mem(atom block_size) return machine_func( M_ALLOC, block_size ) end function public procedure free(atom mem) return machine_func( M_FREE, mem ) end procedure /*,ade the followin small changes 34 - public added to constant declaration 262 - public function allocate_string( sequence s, integer cleanup = 0 ) --abd made public atom mem = machine_func( M_ALLOC, length(s) + 1 ) if mem then poke( mem, s ) poke( mem+length(s), 0 ) end if if cleanup then end if return mem end function -- added cleanup for compatabilty with eu --added pubic functions allocate_mem and free */
but I can't see how these would be an issue.
Anyway, ideas?
Cheers
Chris