glib/gobject
Thomas Haller fb3977e9b4 gobject: limit required stack by heap allocating parameter list in g_object_new_valist()
The previous code consumed a larger additional amount of stack space.
That is because it would allocate the temporary buffer for GValues on
the stack with "g_newa (GValue, 1)" and thus the required stack
space grew with the number of arguments. Granted, this is already
a variadic C function, so the caller already placed that many elements
on the stack. For example, on the stack there are the property names
and the pointers to the arguments, which should amount to roughly
O(n_args * 16) (on 64 bit, with pointers being 8 bytes large).

That is not bad, because it means in the previous version the stack space
would grow linear with the already used stack space. However, a GValue is
an additional 24 bytes (on 64 bit), which probably more than doubles the
required stack space. Let's avoid that, by allocating the temporary list
on the heap after a certain threshold. This probably more than doubles the
number of possible arguments before the stack overflows.

Also, previously the heap allocated "params" array only grew one element
per iteration. Of course, it is likely that libc anyway reallocates
the buffers by growing the space exponentially. So realloc(ptr, 1)
probably does not O() scale worse than doubling the buffer sizes ourselves.
However, it seems clearer to keep track of the allocated sizes ourself, and
only call realloc() when we determine that we are out of space.
Especially because we need to update the value pointers on reallocation.

Note that we now require a heap allocation both for the "params" and the
"values" list. Theoretically that could be combined by using one buffer
for both. But that would make the code more complicated.

Now we pre-allocate buffers for 16 elements on the stack. That
is (16 * (16 + 24) bytes (or 640 bytes) on the stack. I think that
is still acceptable.
2020-11-18 15:26:14 +01:00
..
tests Add a test for signals returning interface types 2020-11-02 17:36:18 +00:00
gatomicarray.c minor typos in the documentation (a/an) 2019-08-24 19:14:05 +00:00
gatomicarray.h gobject/: LGPLv2+ -> LGPLv2.1+ 2017-05-24 11:58:19 +02:00
gbinding.c Add various missing nullable annotations 2020-10-19 13:28:46 +03:00
gbinding.h gobject/: LGPLv2+ -> LGPLv2.1+ 2017-05-24 11:58:19 +02:00
gboxed.c Add boxing for GTree 2020-10-07 11:00:11 +01:00
gboxed.h gobject/: LGPLv2+ -> LGPLv2.1+ 2017-05-24 11:58:19 +02:00
gclosure.c closure: Support generic marshals for interface returns 2020-11-02 17:36:18 +00:00
gclosure.h tree: Fix various typos and outdated terminology 2020-06-12 15:01:08 +01:00
genums.c gobject: Handle runtime checks as such 2020-05-20 17:37:46 +02:00
genums.h gobject/: LGPLv2+ -> LGPLv2.1+ 2017-05-24 11:58:19 +02:00
glib-enumtypes.c.template build: Rename gobjectenumtypes.[ch] to glib-enumtypes.[ch] 2019-03-04 11:12:59 +00:00
glib-enumtypes.h.template build: Rename gobjectenumtypes.[ch] to glib-enumtypes.[ch] 2019-03-04 11:12:59 +00:00
glib-genmarshal.in glib-genmarshal: Avoid a param ref for static param valist arguments 2019-06-18 11:59:11 +01:00
glib-mkenums.in glib-mkenums: allow optional 'since' tag 2020-05-14 17:00:54 +02:00
glib-types.h Add boxing for GTree 2020-10-07 11:00:11 +01:00
gmarshal.c minor typos in the documentation (a/an) 2019-08-24 19:14:05 +00:00
gmarshal.h gmarshal: Move marshaller documentation comments to above functions 2019-03-04 12:33:17 +00:00
gobject_gdb.py python: avoid equality check for None 2018-07-12 23:48:41 +02:00
gobject_probes.d Add missing semicolons to gobject_probes.d 2012-10-15 19:48:44 -04:00
gobject_trace.h build: Disable dtrace probes under static analysis 2019-09-05 14:16:58 +01:00
gobject-autocleanups.h gobject: Add g_autoptr() support for GTypeClass, GEnumClass, GFlagsClass 2018-05-15 15:38:33 +01:00
gobject-query.c Spelling: fix spelling of specify 2018-09-25 14:34:48 +01:00
gobject.c gobject: limit required stack by heap allocating parameter list in g_object_new_valist() 2020-11-18 15:26:14 +01:00
gobject.h gobject: Clarify documentation and annotations of g_set_object() 2020-11-14 20:35:09 +00:00
gobject.rc.in meson: build Windows resource files 2018-01-04 22:19:30 +01:00
gobject.stp.in glib: Namespace global tapset variables by soname 2016-11-23 10:50:39 +00:00
gobjectnotifyqueue.c gobject/: LGPLv2+ -> LGPLv2.1+ 2017-05-24 11:58:19 +02:00
gparam.c tree: Fix various typos and outdated terminology 2020-06-12 15:01:08 +01:00
gparam.h gobject: Add g_{param_spec,signal}_is_valid_name() functions 2020-03-04 14:46:28 +00:00
gparamspecs.c glib: Avoid redefining GLIB_DISABLE_DEPRECATION_WARNINGS 2020-07-27 15:41:09 +01:00
gparamspecs.h tree: Fix various typos and outdated terminology 2020-06-12 15:01:08 +01:00
gsignal.c gsignal: Plug g_signal_connect_object leak 2020-10-13 09:49:29 -04:00
gsignal.h gobject: Add g_{param_spec,signal}_is_valid_name() functions 2020-03-04 14:46:28 +00:00
gsourceclosure.c all: Remove trailing newlines from g_message()/g_warning()/g_error()s 2018-04-27 16:46:19 +01:00
gsourceclosure.h gobject/: LGPLv2+ -> LGPLv2.1+ 2017-05-24 11:58:19 +02:00
gtype-private.h Use the GObject hole on 64bit arches for some flags to improve performance 2019-09-02 15:48:32 +02:00
gtype.c Merge branch 'instantiatable' into 'master' 2020-11-13 15:29:07 +00:00
gtype.h Merge branch 'instantiatable' into 'master' 2020-11-13 15:29:07 +00:00
gtypemodule.c all: Remove trailing newlines from g_message()/g_warning()/g_error()s 2018-04-27 16:46:19 +01:00
gtypemodule.h gtypemodule: Cast *_init functions to void(*)(void) first 2019-01-25 11:29:05 +00:00
gtypeplugin.c gobject: Standardise on the term ‘instantiatable’ 2020-11-02 17:22:01 +00:00
gtypeplugin.h gobject: Standardise on the term ‘instantiatable’ 2020-11-02 17:22:01 +00:00
gvalue.c value: Allow automatic transforms to/from interfaces 2020-11-02 17:36:18 +00:00
gvalue.h gvalue: Do copy non-interned strings 2020-06-23 10:30:55 +00:00
gvaluearray.c gvaluearray: Mark the whole of GValueArray as deprecated 2019-03-15 11:09:36 +00:00
gvaluearray.h Annotate various types and macros as deprecated 2019-05-30 10:39:11 +01:00
gvaluecollector.h tree: Fix various typos and outdated terminology 2020-06-12 15:01:08 +01:00
gvaluetransform.c gobject/: LGPLv2+ -> LGPLv2.1+ 2017-05-24 11:58:19 +02:00
gvaluetypes.c gvalue: Do copy non-interned strings 2020-06-23 10:30:55 +00:00
gvaluetypes.h GValue: Add interned string support 2020-05-19 17:52:55 +02:00
libgobject-gdb.py.in Rename gdb macros with _gdb suffix to avoid ns clashes 2016-05-23 10:52:10 -04:00
meson.build Meson: Override every dependency glib provides 2020-04-05 00:34:04 -04:00