micropython/py
Paul Sokolovsky 93e353e384 py/gc: Implement GC running by allocation threshold.
Currently, MicroPython runs GC when it could not allocate a block of memory,
which happens when heap is exhausted. However, that policy can't work well
with "inifinity" heaps, e.g. backed by a virtual memory - there will be a
lot of swap thrashing long before VM will be exhausted. Instead, in such
cases "allocation threshold" policy is used: a GC is run after some number of
allocations have been made. Details vary, for example, number or total amount
of allocations can be used, threshold may be self-adjusting based on GC
outcome, etc.

This change implements a simple variant of such policy for MicroPython. Amount
of allocated memory so far is used for threshold, to make it useful to typical
finite-size, and small, heaps as used with MicroPython ports. And such GC policy
is indeed useful for such types of heaps too, as it allows to better control
fragmentation. For example, if a threshold is set to half size of heap, then
for an application which usually makes big number of small allocations, that
will (try to) keep half of heap memory in a nice defragmented state for an
occasional large allocation.

For an application which doesn't exhibit such behavior, there won't be any
visible effects, except for GC running more frequently, which however may
affect performance. To address this, the GC threshold is configurable, and
by default is off so far. It's configured with gc.threshold(amount_in_bytes)
call (can be queries without an argument).
2016-07-21 00:37:30 +03:00
..
argcheck.c py/argcheck: Use size_t instead of mp_uint_t to count number of args. 2016-03-14 22:35:48 +00:00
asmarm.c
asmarm.h
asmthumb.c py/asmthumb: Allow to compile with -Wsign-compare and -Wunused-parameter. 2015-11-09 14:11:21 +00:00
asmthumb.h py: Add lsl/lsr/asr opcode support to inline Thumb2 assembler. 2015-10-19 14:26:19 +01:00
asmx64.c py/asmx64: Support all 16 regs in reg to memory move instructions. 2016-02-15 09:05:50 +00:00
asmx64.h
asmx86.c py/asmx86: Fix function definition to use int32_t instead of int. 2015-11-27 14:06:53 +00:00
asmx86.h
bc.c py: Fix bug passing a string as a keyword arg in a dict. 2016-04-21 16:51:36 +01:00
bc.h py/bc: Use size_t instead of mp_uint_t to count size of state and args. 2015-12-17 12:33:42 +00:00
bc0.h py: Make UNARY_OP_NOT a first-class op, to agree with Py not semantics. 2015-12-10 22:19:48 +00:00
binary.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
binary.h
builtin.h py: Add basic _thread module, with ability to start a new thread. 2016-06-28 11:28:48 +01:00
builtinevex.c py: Change type signature of builtin funs that take variable or kw args. 2016-01-11 00:49:27 +00:00
builtinimport.c py/builtinimport: Disable "imported as namespace package" warning. 2016-07-02 14:45:49 +03:00
compile.c py: Declare constant data as properly constant. 2016-05-20 12:46:20 +01:00
compile.h py/compile: Add mp_compile_to_raw_code() to return raw code object. 2015-11-20 12:30:37 +00:00
emit.h py: Combine continuous block of emit steps into with_cleanup emit call. 2016-04-07 08:50:38 +01:00
emitbc.c py: Combine continuous block of emit steps into with_cleanup emit call. 2016-04-07 08:50:38 +01:00
emitcommon.c py: Add MICROPY_ENABLE_COMPILER and MICROPY_PY_BUILTINS_EVAL_EXEC opts. 2015-12-18 12:35:44 +00:00
emitglue.c py/emitglue: Fix build on AArch64 (ARMv8, etc.) related to loading .mpy files. 2016-05-12 16:00:57 +03:00
emitglue.h py/emitglue: Make mp_raw_code_t* arguments constant pointers. 2016-04-13 16:05:43 +01:00
emitinlinethumb.c py/emitinlinethumb: Use qstrs instead of char* for names of asm ops. 2016-02-23 15:20:39 +00:00
emitnative.c py/emitnative: Use MP_OBJ_NEW_SMALL_INT instead of manual bit shifting. 2016-04-26 10:02:32 +01:00
formatfloat.c py/formatfloat: Fix further cases of buffer overflow in formatting. 2016-03-29 22:07:15 +01:00
formatfloat.h
frozenmod.c py: Allow to stat and import frozen mpy files using new frozen "VFS". 2016-05-23 12:42:23 +01:00
frozenmod.h py/{builtinimport,frozenmod}: Rework frozen modules support to support packages. 2016-05-21 21:38:50 +03:00
gc.c py/gc: Implement GC running by allocation threshold. 2016-07-21 00:37:30 +03:00
gc.h py/gc: Calculate (and report) maximum contiguous free block size. 2016-07-01 00:09:55 +03:00
grammar.h py: Simplify "and" action within parser by making ident-rules explicit. 2016-04-14 13:49:23 +01:00
lexer.c py: Declare constant data as properly constant. 2016-05-20 12:46:20 +01:00
lexer.h py: add async/await/async for/async with syntax 2016-04-13 15:26:38 +01:00
lexerstr.c py: Add MICROPY_ENABLE_COMPILER and MICROPY_PY_BUILTINS_EVAL_EXEC opts. 2015-12-18 12:35:44 +00:00
lexerunix.c
makeqstrdata.py py/makeqstrdata.py: Allow to have double-quote characters in qstrs. 2016-05-23 15:18:55 +01:00
makeqstrdefs.py py/makeqstrdefs.py: Remove restriction that source path can't be absolute. 2016-06-16 01:04:42 +03:00
makeversionhdr.py py/makeversionhdr.py: Work with backslashes in paths. 2015-10-30 11:34:53 +03:00
malloc.c py/malloc: Provide a proper malloc-based implementation of realloc_ext. 2016-02-23 13:53:38 +00:00
map.c py: Declare constant data as properly constant. 2016-05-20 12:46:20 +01:00
misc.h py/repl: Check for an identifier char after the keyword. 2016-02-17 08:56:15 +00:00
mkenv.mk py/mkenv.mk: Remove -s and -S args from PYTHON variable. 2016-04-21 22:25:35 +01:00
mkrules.mk py: Rename __QSTR_EXTRACT flag to NO_QSTR. 2016-06-16 01:42:48 +03:00
modarray.c py: Add MP_ROM_* macros and mp_rom_* types and use them. 2015-11-29 14:25:04 +00:00
modbuiltins.c py: add async/await/async for/async with syntax 2016-04-13 15:26:38 +01:00
modcmath.c py: Make it easy to build without MICROPY_PY_BUILTINS_COMPLEX. 2015-12-07 00:19:24 +02:00
modcollections.c py/modcollections: Rename module name have "u" prefix for consistency. 2016-05-02 13:57:46 +03:00
modgc.c py/gc: Implement GC running by allocation threshold. 2016-07-21 00:37:30 +03:00
modio.c all: Rename mp_obj_type_t::stream_p to protocol. 2016-06-18 18:44:57 +03:00
modmath.c py/objfloat, py/modmath: Ensure M_PI and M_E defined. 2016-05-12 13:28:45 +01:00
modmicropython.c py: Add MP_STATE_THREAD to hold state specific to a given thread. 2016-06-28 11:09:31 +01:00
modstruct.c py/modstruct: Allow to have "0s" in struct format. 2016-05-28 23:27:38 +01:00
modsys.c py: Change type signature of builtin funs that take variable or kw args. 2016-01-11 00:49:27 +00:00
modthread.c py/modthread: Allow to properly set the stack limit of a thread. 2016-06-28 11:28:51 +01:00
moduerrno.c py/moduerrno: Add ECONNREFUSED, one of frequent networking errors. 2016-05-28 00:17:19 +03:00
mpconfig.h py/gc: Implement GC running by allocation threshold. 2016-07-21 00:37:30 +03:00
mperrno.h py/moduerrno: Add ECONNREFUSED, one of frequent networking errors. 2016-05-28 00:17:19 +03:00
mphal.h py/mphal.h: If virtpin API is used, automagically include its header. 2016-06-19 00:12:37 +03:00
mpprint.c py/mpprint: Fix sign extension when printf'ing %u, %x and %X. 2016-02-01 15:08:42 +00:00
mpprint.h py: Change mp_print_strn_t func type to use size_t for the str length. 2015-11-29 14:25:04 +00:00
mpstate.c py: Add MICROPY_DYNAMIC_COMPILER option to config compiler at runtime. 2016-02-25 10:05:46 +00:00
mpstate.h py/gc: Implement GC running by allocation threshold. 2016-07-21 00:37:30 +03:00
mpthread.h py/mpthread: Include mpstate.h when defining GIL macros. 2016-06-28 11:28:52 +01:00
mpz.c py/mpz: Fix mpn_div so that it doesn't modify memory of denominator. 2016-05-09 17:21:42 +01:00
mpz.h windows/py: Support 64bit mingw-w64 builds 2015-11-24 17:34:14 +02:00
nativeglue.c py/viper: Allow casting of Python integers to viper pointers. 2016-02-09 13:29:20 +00:00
nlr.h py/nlrsetjmp: Update to take into account new location of nlr_top. 2016-06-28 11:28:52 +01:00
nlrsetjmp.c py/nlrsetjmp: Update to take into account new location of nlr_top. 2016-06-28 11:28:52 +01:00
nlrthumb.c qemu-arm: Enable gcc LTO option for nlrthumb.c 2016-07-11 12:04:56 +01:00
nlrx64.S py/nlrx64.S: Prefix mp_thread_get_state with an underscore on Mac. 2016-07-11 14:27:47 +01:00
nlrx86.S py: Add basic _thread module, with ability to start a new thread. 2016-06-28 11:28:48 +01:00
nlrxtensa.S
obj.c py/obj: Add warning note about get_array return value and GC blocks. 2016-05-04 10:19:08 +01:00
obj.h all: Rename mp_obj_type_t::stream_p to protocol. 2016-06-18 18:44:57 +03:00
objarray.c py/objarray: Split out header to allow direct access to object. 2016-07-06 18:19:27 +03:00
objarray.h py/objarray: Split out header to allow direct access to object. 2016-07-06 18:19:27 +03:00
objattrtuple.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
objbool.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objboundmeth.c py/objboundmeth: Allocate arg state on stack if heap alloc fails. 2016-03-08 15:36:53 +00:00
objcell.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
objclosure.c py: Fix passing of some wide int types to printf varg format list. 2016-03-14 22:40:39 +00:00
objcomplex.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objdict.c py/objdict: Implemented OrderedDict equality check. 2016-06-12 17:33:48 +03:00
objenumerate.c py: Use new code pattern for parsing kw args with mp_arg_parse_all. 2016-01-13 15:47:56 +00:00
objexcept.c py/objexcept: Don't convert errno to str in constructor, do it in print. 2016-05-12 14:27:52 +01:00
objexcept.h py: Change exception traceback data to use size_t instead of mp_uint_t. 2016-01-02 22:04:12 +00:00
objfilter.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objfloat.c py/objfloat, py/modmath: Ensure M_PI and M_E defined. 2016-05-12 13:28:45 +01:00
objfun.c py/objfun: Allow inline-asm functions to be called with 4 arguments. 2016-03-16 08:22:26 +00:00
objfun.h py: Add constant table to bytecode. 2015-11-13 12:49:18 +00:00
objgenerator.c py/vm: "yield from" didn't handle MP_OBJ_STOP_ITERATION optimization. 2016-04-28 02:08:43 +03:00
objgenerator.h
objgetitemiter.c py/objgetitemiter: Typo fix in comment. 2016-01-23 23:30:06 +02:00
objint.c py: Use MP_SMALL_INT_POSITIVE_MASK to check if uint fits in a small int. 2016-03-10 21:52:56 +00:00
objint.h py: Change mp_obj_int_is_positive to more general mp_obj_int_sign. 2016-01-07 14:29:12 +00:00
objint_longlong.c py: Use MP_SMALL_INT_POSITIVE_MASK to check if uint fits in a small int. 2016-03-10 21:52:56 +00:00
objint_mpz.c py/mpz: Do Python style division/modulo within bignum divmod routine. 2016-05-08 22:21:21 +01:00
objlist.c py: Use new code pattern for parsing kw args with mp_arg_parse_all. 2016-01-13 15:47:56 +00:00
objlist.h
objmap.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objmodule.c py: Add basic _thread module, with ability to start a new thread. 2016-06-28 11:28:48 +01:00
objmodule.h
objnamedtuple.c py/objnamedtuple: Allow passing field names as a tuple. 2016-05-23 21:08:07 +01:00
objnone.c
objobject.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objpolyiter.c py/objpolyiter: Implement instance-polymorphic iterator type. 2015-12-14 23:48:12 +02:00
objproperty.c py/objproperty: Fix static struct to build with OBJ_REPR_D. 2016-01-15 11:09:20 +00:00
objrange.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objreversed.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objset.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objsingleton.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
objslice.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
objstr.c py/objstr: Fix mix-signed comparison in str.center(). 2016-05-22 02:22:14 +03:00
objstr.h py/objstr: Implement str.center(). 2016-05-22 00:13:44 +03:00
objstringio.c all: Rename mp_obj_type_t::stream_p to protocol. 2016-06-18 18:44:57 +03:00
objstrunicode.c py/objstr*: Properly ifdef str.center(). 2016-05-22 01:54:41 +03:00
objtuple.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objtuple.h py: Add MP_ROM_* macros and mp_rom_* types and use them. 2015-11-29 14:25:04 +00:00
objtype.c py/objtype: Inherit protocol vtable from base class only if it exists. 2016-06-19 00:56:06 +03:00
objtype.h py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objzip.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
opmethods.c
parse.c py/parse: Treat constants that start with underscore as private. 2016-06-06 17:28:32 +01:00
parse.h py/parse: Improve constant folding to operate on small and big ints. 2016-01-07 14:40:35 +00:00
parsenum.c py/parsenum: Use pow function to apply exponent to decimal number. 2016-03-29 22:12:07 +01:00
parsenum.h py/parsenum: Use size_t to count bytes, and int for type of base arg. 2016-03-14 22:34:03 +00:00
parsenumbase.c py/parsenum: Fix compiler warnings for no decl and signed comparison. 2016-03-14 22:52:52 +00:00
parsenumbase.h py/parsenum: Use size_t to count bytes, and int for type of base arg. 2016-03-14 22:34:03 +00:00
py.mk esp8266: Cache Xtensa-built libaxtls.a in local build dir. 2016-07-16 04:56:23 +03:00
qstr.c py: Don't use gc or qstr mutex when the GIL is enabled. 2016-06-28 11:28:50 +01:00
qstr.h py: Rename __QSTR_EXTRACT flag to NO_QSTR. 2016-06-16 01:42:48 +03:00
qstrdefs.h py: Add rules for automated extraction of qstrs from sources. 2016-04-16 13:18:09 +01:00
repl.c py: Declare constant data as properly constant. 2016-05-20 12:46:20 +01:00
repl.h
ringbuf.h py/ringbuf.h: Add reusable ring buffer class. 2016-03-30 14:48:31 +03:00
runtime.c py: Implement a simple global interpreter lock. 2016-06-28 11:28:50 +01:00
runtime.h py: Move call_function_*_protected() functions to py/ for reuse. 2016-04-25 19:31:17 +03:00
runtime0.h py: Extend native type-sig to use 4 bits, so uint is separate to ptr. 2016-02-02 23:16:05 +00:00
runtime_utils.c py/runtime_utils: Fix nanbox build. 2016-04-25 20:03:14 +03:00
scope.c py: Add MICROPY_ENABLE_COMPILER and MICROPY_PY_BUILTINS_EVAL_EXEC opts. 2015-12-18 12:35:44 +00:00
scope.h py: Put all bytecode state (arg count, etc) in bytecode. 2015-11-13 12:49:18 +00:00
sequence.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
showbc.c py: Make UNARY_OP_NOT a first-class op, to agree with Py not semantics. 2015-12-10 22:19:48 +00:00
smallint.c
smallint.h py/smallint: Allow to override MP_SMALL_INT_MIN et al. 2016-01-08 13:43:56 +00:00
stackctrl.c py: Add MP_STATE_THREAD to hold state specific to a given thread. 2016-06-28 11:09:31 +01:00
stackctrl.h py/stackctrl: Add mp_stack_set_top() to explicitly set stack top value. 2016-03-07 14:12:24 +07:00
stream.c py/stream: Implement 2- and 3-arg write() method as an extension to CPython. 2016-07-14 01:44:50 +03:00
stream.h py/stream: Add mp_stream_close() helper function. 2016-05-20 21:18:49 +03:00
unicode.c py/repl: Check for an identifier char after the keyword. 2016-02-17 08:56:15 +00:00
unicode.h
vm.c py: Implement a simple global interpreter lock. 2016-06-28 11:28:50 +01:00
vmentrytable.h py: Declare constant data as properly constant. 2016-05-20 12:46:20 +01:00
vstr.c py/vstr: Change allocation policy, +16 to requested size, instead of *2. 2016-05-10 00:56:51 +03:00
warning.c