Author: fijal Branch: vmprof-newstack Changeset: r80533:92eb26363b25 Date: 2015-11-01 12:36 +0000 http://bitbucket.org/pypy/pypy/changeset/92eb26363b25/
Log: random progres diff --git a/rpython/rlib/rvmprof/cintf.py b/rpython/rlib/rvmprof/cintf.py --- a/rpython/rlib/rvmprof/cintf.py +++ b/rpython/rlib/rvmprof/cintf.py @@ -52,10 +52,22 @@ vmprof_register_virtual_function = rffi.llexternal( "vmprof_register_virtual_function", [rffi.CCHARP, rffi.LONG, rffi.INT], - rffi.INT, compilation_info=eci) + rffi.INT, compilation_info=eci, + _nowrapper=True) vmprof_ignore_signals = rffi.llexternal("vmprof_ignore_signals", [rffi.INT], lltype.Void, - compilation_info=eci) + compilation_info=eci, + _nowrapper=True) + vmprof_stack_new = rffi.llexternal("vmprof_stack_new", + [], rffi.VOIDP, compilation_info=eci, _nowrapper=True) + vmprof_stack_append = rffi.llexternal("vmprof_stack_append", + [rffi.VOIDP, lltype.Signed], rffi.INT, compilation_info=eci, + _nowrapper=True) + vmprof_stack_pop = rffi.llexternal("vmprof_stack_pop", + [rffi.VOIDP], lltype.Signed, compilation_info=eci, + _nowrapper=True) + vmprof_stack_free = rffi.llexternal("vmprof_stack_free", + [rffi.VOIDP], lltype.Void, compilation_info=eci, _nowrapper=True) return CInterface(locals()) diff --git a/rpython/rlib/rvmprof/rvmprof.py b/rpython/rlib/rvmprof/rvmprof.py --- a/rpython/rlib/rvmprof/rvmprof.py +++ b/rpython/rlib/rvmprof/rvmprof.py @@ -19,6 +19,8 @@ class VMProf(object): + _immutable_fields_ = ['is_enabled?'] + def __init__(self): "NOT_RPYTHON: use _get_vmprof()" self._code_classes = set() diff --git a/rpython/rlib/rvmprof/src/rvmprof.h b/rpython/rlib/rvmprof/src/rvmprof.h --- a/rpython/rlib/rvmprof/src/rvmprof.h +++ b/rpython/rlib/rvmprof/src/rvmprof.h @@ -4,3 +4,7 @@ RPY_EXTERN int vmprof_enable(void); RPY_EXTERN int vmprof_disable(void); RPY_EXTERN int vmprof_register_virtual_function(char *, long, int); +RPY_EXTERN void* vmprof_stack_new(void); +RPY_EXTERN int vmprof_stack_append(void*, long); +RPY_EXTERN long vmprof_stack_pop(void*); +RPY_EXTERN void vmprof_stack_free(void*); \ No newline at end of file diff --git a/rpython/rlib/rvmprof/src/vmprof_main.h b/rpython/rlib/rvmprof/src/vmprof_main.h --- a/rpython/rlib/rvmprof/src/vmprof_main.h +++ b/rpython/rlib/rvmprof/src/vmprof_main.h @@ -37,6 +37,7 @@ #include "vmprof_unwind.h" #endif #include "vmprof_mt.h" +#include "vmprof_stack.h" /************************************************************/ diff --git a/rpython/rlib/rvmprof/src/vmprof_stack.h b/rpython/rlib/rvmprof/src/vmprof_stack.h new file mode 100644 --- /dev/null +++ b/rpython/rlib/rvmprof/src/vmprof_stack.h @@ -0,0 +1,42 @@ + +#define STACK_SIZE 8192 +#include <stdlib.h> + +typedef struct vmprof_stack { + volatile long stack_depth; + long stack_items[STACK_SIZE]; +} vmprof_stack; + +void *vmprof_stack_new(void) +{ + vmprof_stack* stack = (vmprof_stack *)malloc(sizeof(vmprof_stack)); + stack->stack_depth = 0; + return (void*)stack; +} + +int vmprof_stack_append(void *_stack, long item) +{ + vmprof_stack* stack = (vmprof_stack*)_stack; + if (stack->stack_depth >= STACK_SIZE - 1) + return -1; + stack->stack_items[stack->stack_depth] = item; + stack->stack_depth += 1; + return 0; +} + +long vmprof_stack_pop(void *_stack) +{ + vmprof_stack* stack = (vmprof_stack*)_stack; + long res; + + if (stack->stack_depth <= 0) + return -1; + res = stack->stack_items[stack->stack_depth]; + stack->stack_depth -= 1; + return res; +} + +void vmprof_stack_free(void* stack) +{ + free(stack); +} \ No newline at end of file _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit