[pypy-commit] pypy default: remove old files

plan_rich pypy.commits at gmail.com
Tue Jul 25 09:50:01 EDT 2017


Author: Richard Plangger <planrichi at gmail.com>
Branch: 
Changeset: r91966:cb8f734c831d
Date: 2017-07-23 16:27 -0400
http://bitbucket.org/pypy/pypy/changeset/cb8f734c831d/

Log:	remove old files

diff --git a/rpython/rlib/rvmprof/src/shared/rss_darwin.h b/rpython/rlib/rvmprof/src/shared/rss_darwin.h
deleted file mode 100644
--- a/rpython/rlib/rvmprof/src/shared/rss_darwin.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* On OS X we can get RSS using the Mach API. */
-#include <mach/mach.h>
-#include <mach/message.h>
-#include <mach/kern_return.h>
-#include <mach/task_info.h>
-
-static mach_port_t mach_task;
-
-static int setup_rss(void)
-{
-    mach_task = mach_task_self();
-    return 0;
-}
-
-static int teardown_rss(void)
-{
-    return 0;
-}
-
-static long get_current_proc_rss(void)
-{
-    mach_msg_type_number_t out_count = MACH_TASK_BASIC_INFO_COUNT;
-    mach_task_basic_info_data_t taskinfo = { .resident_size = 0 };
-
-    kern_return_t error = task_info(mach_task, MACH_TASK_BASIC_INFO, (task_info_t)&taskinfo, &out_count);
-    if (error == KERN_SUCCESS) {
-        return (long)(taskinfo.resident_size / 1024);
-    } else {
-        return -1;
-    }
-}
diff --git a/rpython/rlib/rvmprof/src/shared/rss_unix.h b/rpython/rlib/rvmprof/src/shared/rss_unix.h
deleted file mode 100644
--- a/rpython/rlib/rvmprof/src/shared/rss_unix.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <stdlib.h>
-
-/* On normal Unices we can get RSS from '/proc/<pid>/status'. */
-static int proc_file = -1;
-
-static int setup_rss(void)
-{
-    char buf[128];
-
-    sprintf(buf, "/proc/%d/status", getpid());
-    proc_file = open(buf, O_RDONLY);
-    return proc_file;
-}
-
-static int teardown_rss(void) {
-    close(proc_file);
-    proc_file = -1;
-    return 0;
-}
-
-static long get_current_proc_rss(void)
-{
-    char buf[1024];
-    int i = 0;
-
-    if (lseek(proc_file, 0, SEEK_SET) == -1)
-        return -1;
-    if (read(proc_file, buf, 1024) == -1)
-        return -1;
-    while (i < 1020) {
-        if (strncmp(buf + i, "VmRSS:\t", 7) == 0) {
-            i += 7;
-            return atoi(buf + i);
-        }
-        i++;
-    }
-    return -1;
-}
diff --git a/rpython/rlib/rvmprof/src/shared/vmprof_main.c b/rpython/rlib/rvmprof/src/shared/vmprof_main.c
deleted file mode 100644
--- a/rpython/rlib/rvmprof/src/shared/vmprof_main.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifdef VMPROF_UNIX
-
-#include <unistd.h>
-/* value: LSB bit is 1 if signals must be ignored; all other bits
-   are a counter for how many threads are currently in a signal handler */
-static long volatile signal_handler_value = 1;
-
-void vmprof_ignore_signals(int ignored)
-{
-    if (!ignored) {
-        __sync_fetch_and_and(&signal_handler_value, ~1L);
-    } else {
-        /* set the last bit, and wait until concurrently-running signal
-           handlers finish */
-        while (__sync_or_and_fetch(&signal_handler_value, 1L) != 1L) {
-            usleep(1);
-        }
-    }
-}
-
-long vmprof_enter_signal(void)
-{
-    return __sync_fetch_and_add(&signal_handler_value, 2L);
-}
-
-long vmprof_exit_signal(void)
-{
-    return __sync_sub_and_fetch(&signal_handler_value, 2L);
-}
-#endif
diff --git a/rpython/rlib/rvmprof/src/shared/vmprof_main.h b/rpython/rlib/rvmprof/src/shared/vmprof_main.h
deleted file mode 100644
--- a/rpython/rlib/rvmprof/src/shared/vmprof_main.h
+++ /dev/null
@@ -1,549 +0,0 @@
-#pragma once
-
-/* VMPROF
- *
- * statistical sampling profiler specifically designed to profile programs
- * which run on a Virtual Machine and/or bytecode interpreter, such as Python,
- * etc.
- *
- * The logic to dump the C stack traces is partly stolen from the code in
- * gperftools.
- * The file "getpc.h" has been entirely copied from gperftools.
- *
- * Tested only on gcc, linux, x86_64.
- *
- * Copyright (C) 2014-2017
- *   Antonio Cuni - anto.cuni at gmail.com
- *   Maciej Fijalkowski - fijall at gmail.com
- *   Armin Rigo - arigo at tunes.org
- *   Richard Plangger - planrichi at gmail.com
- *
- */
-
-#define _GNU_SOURCE 1
-
-#include <dlfcn.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-
-#include "vmprof.h"
-
-#include "vmp_stack.h"
-#include "vmprof_getpc.h"
-#include "vmprof_mt.h"
-#include "vmprof_common.h"
-#include "compat.h"
-
-#if defined(__unix__)
-#include "rss_unix.h"
-#elif defined(__APPLE__)
-#include "rss_darwin.h"
-#endif
-
-#if VMPROF_LINUX
-#include <syscall.h>
-#endif
-
-/************************************************************/
-
-static void *(*mainloop_get_virtual_ip)(char *) = 0;
-static int opened_profile(const char *interp_name, int memory, int proflines, int native, int real_time);
-static void flush_codes(void);
-
-/************************************************************/
-
-RPY_EXTERN void vmprof_ignore_signals(int ignored);
-RPY_EXTERN long vmprof_enter_signal(void);
-RPY_EXTERN long vmprof_exit_signal(void);
-
-/* *************************************************************
- * functions to write a profile file compatible with gperftools
- * *************************************************************
- */
-
-static char atfork_hook_installed = 0;
-
-
-/* *************************************************************
- * functions to dump the stack trace
- * *************************************************************
- */
-
-int get_stack_trace(PY_THREAD_STATE_T * current, void** result, int max_depth, intptr_t pc)
-{
-    PY_STACK_FRAME_T * frame;
-#ifdef RPYTHON_VMPROF
-    // do nothing here,
-    frame = (PY_STACK_FRAME_T*)current;
-#else
-    if (current == NULL) {
-        fprintf(stderr, "WARNING: get_stack_trace, current is NULL\n");
-        return 0;
-    }
-    frame = current->frame;
-#endif
-    if (frame == NULL) {
-        fprintf(stderr, "WARNING: get_stack_trace, frame is NULL\n");
-        return 0;
-    }
-    return vmp_walk_and_record_stack(frame, result, max_depth, 1, pc);
-}
-
-/* *************************************************************
- * the signal handler
- * *************************************************************
- */
-
-#include <setjmp.h>
-
-volatile int spinlock;
-jmp_buf restore_point;
-
-static void segfault_handler(int arg)
-{
-    longjmp(restore_point, SIGSEGV);
-}
-
-int _vmprof_sample_stack(struct profbuf_s *p, PY_THREAD_STATE_T * tstate, ucontext_t * uc)
-{
-    int depth;
-    struct prof_stacktrace_s *st = (struct prof_stacktrace_s *)p->data;
-    st->marker = MARKER_STACKTRACE;
-    st->count = 1;
-#ifdef RPYTHON_VMPROF
-    depth = get_stack_trace(get_vmprof_stack(), st->stack, MAX_STACK_DEPTH-1, (intptr_t)GetPC(uc));
-#else
-    depth = get_stack_trace(tstate, st->stack, MAX_STACK_DEPTH-1, (intptr_t)NULL);
-#endif
-    if (depth == 0) {
-        return 0;
-    }
-    st->depth = depth;
-    st->stack[depth++] = tstate;
-    long rss = get_current_proc_rss();
-    if (rss >= 0)
-        st->stack[depth++] = (void*)rss;
-    p->data_offset = offsetof(struct prof_stacktrace_s, marker);
-    p->data_size = (depth * sizeof(void *) +
-                    sizeof(struct prof_stacktrace_s) -
-                    offsetof(struct prof_stacktrace_s, marker));
-    return 1;
-}
-
-#ifndef RPYTHON_VMPROF
-static PY_THREAD_STATE_T * _get_pystate_for_this_thread(void) {
-    // see issue 116 on github.com/vmprof/vmprof-python.
-    // PyGILState_GetThisThreadState(); can hang forever
-    //
-    PyInterpreterState * istate;
-    PyThreadState * state;
-    long mythread_id;
-
-    mythread_id = PyThread_get_thread_ident();
-    istate = PyInterpreterState_Head();
-    if (istate == NULL) {
-        fprintf(stderr, "WARNING: interp state head is null (for thread id %ld)\n", mythread_id);
-        return NULL;
-    }
-    // fish fish fish, it will NOT lock the keymutex in pythread
-    do {
-        state = PyInterpreterState_ThreadHead(istate);
-        do {
-            if (state->thread_id == mythread_id) {
-                return state;
-            }
-        } while ((state = PyThreadState_Next(state)) != NULL);
-    } while ((istate = PyInterpreterState_Next(istate)) != NULL);
-
-    // uh? not found?
-    fprintf(stderr, "WARNING: cannot find thread state (for thread id %ld), sample will be thrown away\n", mythread_id);
-    return NULL;
-}
-#endif
-
-#ifdef VMPROF_UNIX
-static int broadcast_signal_for_threads(void)
-{
-    int done = 1;
-    size_t i = 0;
-    pthread_t self = pthread_self();
-    pthread_t tid;
-    while (i < thread_count) {
-        tid = threads[i];
-        if (pthread_equal(tid, self)) {
-            done = 0;
-        } else if (pthread_kill(tid, SIGALRM)) {
-            remove_thread(tid, i);
-        }
-        i++;
-    }
-    return done;
-}
-#endif
-
-#ifdef VMPROF_LINUX
-static inline int is_main_thread(void)
-{
-    pid_t pid = getpid();
-    pid_t tid = (pid_t) syscall(SYS_gettid);
-    return (pid == tid);
-}
-#endif
-
-#ifdef VMPROF_APPLE
-static inline int is_main_thread(void)
-{
-    return pthread_main_np();
-}
-#endif
-
-static void sigprof_handler(int sig_nr, siginfo_t* info, void *ucontext)
-{
-    int commit;
-    PY_THREAD_STATE_T * tstate = NULL;
-    void (*prevhandler)(int);
-
-#ifndef RPYTHON_VMPROF
-
-    // Even though the docs say that this function call is for 'esoteric use'
-    // it seems to be correctly set when the interpreter is teared down!
-    if (!Py_IsInitialized()) {
-        return;
-    }
-
-    // TERRIBLE HACK AHEAD
-    // on OS X, the thread local storage is sometimes uninitialized
-    // when the signal handler runs - it means it's impossible to read errno
-    // or call any syscall or read PyThread_Current or pthread_self. Additionally,
-    // it seems impossible to read the register gs.
-    // here we register segfault handler (all guarded by a spinlock) and call
-    // longjmp in case segfault happens while reading a thread local
-    //
-    // We do the same error detection for linux to ensure that
-    // get_current_thread_state returns a sane result
-    while (__sync_lock_test_and_set(&spinlock, 1)) {
-    }
-
-#ifdef VMPROF_UNIX
-    // SIGNAL ABUSE AHEAD
-    // On linux, the prof timer will deliver the signal to the thread which triggered the timer,
-    // because these timers are based on process and system time, and as such, are thread-aware.
-    // For the real timer, the signal gets delivered to the main thread, seemingly always.
-    // Consequently if we want to sample multiple threads, we need to forward this signal.
-    if (signal_type == SIGALRM) {
-        if (is_main_thread() && broadcast_signal_for_threads()) {
-            __sync_lock_release(&spinlock);
-            return;
-        }
-    }
-#endif
-
-    prevhandler = signal(SIGSEGV, &segfault_handler);
-    int fault_code = setjmp(restore_point);
-    if (fault_code == 0) {
-        pthread_self();
-        tstate = _get_pystate_for_this_thread();
-    } else {
-        signal(SIGSEGV, prevhandler);
-        __sync_lock_release(&spinlock);
-        return;
-    }
-    signal(SIGSEGV, prevhandler);
-    __sync_lock_release(&spinlock);
-#endif
-
-    long val = vmprof_enter_signal();
-
-    if ((val & 1) == 0) {
-        int saved_errno = errno;
-        int fd = vmp_profile_fileno();
-        assert(fd >= 0);
-
-        struct profbuf_s *p = reserve_buffer(fd);
-        if (p == NULL) {
-            /* ignore this signal: there are no free buffers right now */
-        } else {
-#ifdef RPYTHON_VMPROF
-            commit = _vmprof_sample_stack(p, NULL, (ucontext_t*)ucontext);
-#else
-            commit = _vmprof_sample_stack(p, tstate, (ucontext_t*)ucontext);
-#endif
-            if (commit) {
-                commit_buffer(fd, p);
-            } else {
-#ifndef RPYTHON_VMPROF
-                fprintf(stderr, "WARNING: canceled buffer, no stack trace was written %d\n", is_enabled);
-#else
-                fprintf(stderr, "WARNING: canceled buffer, no stack trace was written\n");
-#endif
-                cancel_buffer(p);
-            }
-        }
-
-        errno = saved_errno;
-    }
-
-    vmprof_exit_signal();
-}
-
-
-
-/* *************************************************************
- * the setup and teardown functions
- * *************************************************************
- */
-
-static int install_sigprof_handler(void)
-{
-    struct sigaction sa;
-    memset(&sa, 0, sizeof(sa));
-    sa.sa_sigaction = sigprof_handler;
-    sa.sa_flags = SA_RESTART | SA_SIGINFO;
-    if (sigemptyset(&sa.sa_mask) == -1 ||
-        sigaction(signal_type, &sa, NULL) == -1)
-        return -1;
-    return 0;
-}
-
-static int remove_sigprof_handler(void)
-{
-    struct sigaction ign_sigint, prev;
-    ign_sigint.sa_handler = SIG_IGN;
-    ign_sigint.sa_flags = 0;
-    sigemptyset(&ign_sigint.sa_mask);
-
-    if (sigaction(signal_type, &ign_sigint, NULL) < 0) {
-        fprintf(stderr, "Could not remove the signal handler (for profiling)\n");
-        return -1;
-    }
-    return 0;
-}
-
-static int install_sigprof_timer(void)
-{
-    static struct itimerval timer;
-    timer.it_interval.tv_sec = 0;
-    timer.it_interval.tv_usec = (int)profile_interval_usec;
-    timer.it_value = timer.it_interval;
-    if (setitimer(itimer_type, &timer, NULL) != 0)
-        return -1;
-    return 0;
-}
-
-static int remove_sigprof_timer(void) {
-    static struct itimerval timer;
-    timerclear(&(timer.it_interval));
-    timerclear(&(timer.it_value));
-    if (setitimer(itimer_type, &timer, NULL) != 0) {
-        fprintf(stderr, "Could not disable the signal handler (for profiling)\n");
-        return -1;
-    }
-    return 0;
-}
-
-static void atfork_disable_timer(void) {
-    if (profile_interval_usec > 0) {
-        remove_sigprof_timer();
-#ifndef RPYTHON_VMPROF
-        is_enabled = 0;
-#endif
-    }
-}
-
-static void atfork_enable_timer(void) {
-    if (profile_interval_usec > 0) {
-        install_sigprof_timer();
-#ifndef RPYTHON_VMPROF
-        is_enabled = 1;
-#endif
-    }
-}
-
-static void atfork_close_profile_file(void) {
-    int fd = vmp_profile_fileno();
-    if (fd != -1)
-        close(fd);
-    vmp_set_profile_fileno(-1);
-}
-
-static int install_pthread_atfork_hooks(void) {
-    /* this is needed to prevent the problems described there:
-         - http://code.google.com/p/gperftools/issues/detail?id=278
-         - http://lists.debian.org/debian-glibc/2010/03/msg00161.html
-
-        TL;DR: if the RSS of the process is large enough, the clone() syscall
-        will be interrupted by the SIGPROF before it can complete, then
-        retried, interrupted again and so on, in an endless loop.  The
-        solution is to disable the timer around the fork, and re-enable it
-        only inside the parent.
-    */
-    if (atfork_hook_installed)
-        return 0;
-    int ret = pthread_atfork(atfork_disable_timer, atfork_enable_timer, atfork_close_profile_file);
-    if (ret != 0)
-        return -1;
-    atfork_hook_installed = 1;
-    return 0;
-}
-
-#ifdef VMP_SUPPORTS_NATIVE_PROFILING
-void init_cpyprof(int native)
-{
-    // skip this if native should not be enabled
-    if (!native) {
-        vmp_native_disable();
-        return;
-    }
-    vmp_native_enable();
-}
-
-static void disable_cpyprof(void)
-{
-    vmp_native_disable();
-}
-#endif
-
-RPY_EXTERN
-int vmprof_enable(int memory, int native, int real_time)
-{
-#ifdef VMP_SUPPORTS_NATIVE_PROFILING
-    init_cpyprof(native);
-#endif
-    assert(vmp_profile_fileno() >= 0);
-    assert(prepare_interval_usec > 0);
-    profile_interval_usec = prepare_interval_usec;
-    if (memory && setup_rss() == -1)
-        goto error;
-#if VMPROF_UNIX
-    if (real_time && insert_thread(pthread_self(), -1) == -1)
-        goto error;
-#endif
-    if (install_pthread_atfork_hooks() == -1)
-        goto error;
-    if (install_sigprof_handler() == -1)
-        goto error;
-    if (install_sigprof_timer() == -1)
-        goto error;
-    vmprof_ignore_signals(0);
-    return 0;
-
- error:
-    vmp_set_profile_fileno(-1);
-    profile_interval_usec = 0;
-    return -1;
-}
-
-
-int close_profile(void)
-{
-    int fileno = vmp_profile_fileno();
-    fsync(fileno);
-    (void)vmp_write_time_now(MARKER_TRAILER);
-    teardown_rss();
-
-    /* don't close() the file descriptor from here */
-    vmp_set_profile_fileno(-1);
-    return 0;
-}
-
-RPY_EXTERN
-int vmprof_disable(void)
-{
-    vmprof_ignore_signals(1);
-    profile_interval_usec = 0;
-#ifdef VMP_SUPPORTS_NATIVE_PROFILING
-    disable_cpyprof();
-#endif
-
-    if (remove_sigprof_timer() == -1) {
-        return -1;
-    }
-    if (remove_sigprof_handler() == -1) {
-        return -1;
-    }
-#ifdef VMPROF_UNIX
-    if ((signal_type == SIGALRM) && remove_threads() == -1) {
-        return -1;
-    }
-#endif
-    flush_codes();
-    if (shutdown_concurrent_bufs(vmp_profile_fileno()) < 0)
-        return -1;
-    return close_profile();
-}
-
-RPY_EXTERN
-int vmprof_register_virtual_function(char *code_name, intptr_t code_uid,
-                                     int auto_retry)
-{
-    long namelen = strnlen(code_name, 1023);
-    long blocklen = 1 + sizeof(intptr_t) + sizeof(long) + namelen;
-    struct profbuf_s *p;
-    char *t;
-
- retry:
-    p = current_codes;
-    if (p != NULL) {
-        if (__sync_bool_compare_and_swap(&current_codes, p, NULL)) {
-            /* grabbed 'current_codes': we will append the current block
-               to it if it contains enough room */
-            size_t freesize = SINGLE_BUF_SIZE - p->data_size;
-            if (freesize < (size_t)blocklen) {
-                /* full: flush it */
-                commit_buffer(vmp_profile_fileno(), p);
-                p = NULL;
-            }
-        }
-        else {
-            /* compare-and-swap failed, don't try again */
-            p = NULL;
-        }
-    }
-
-    if (p == NULL) {
-        p = reserve_buffer(vmp_profile_fileno());
-        if (p == NULL) {
-            /* can't get a free block; should almost never be the
-               case.  Spin loop if allowed, or return a failure code
-               if not (e.g. we're in a signal handler) */
-            if (auto_retry > 0) {
-                auto_retry--;
-                usleep(1);
-                goto retry;
-            }
-            return -1;
-        }
-    }
-
-    t = p->data + p->data_size;
-    p->data_size += blocklen;
-    assert(p->data_size <= SINGLE_BUF_SIZE);
-    *t++ = MARKER_VIRTUAL_IP;
-    memcpy(t, &code_uid, sizeof(intptr_t)); t += sizeof(intptr_t);
-    memcpy(t, &namelen, sizeof(long)); t += sizeof(long);
-    memcpy(t, code_name, namelen);
-
-    /* try to reattach 'p' to 'current_codes' */
-    if (!__sync_bool_compare_and_swap(&current_codes, NULL, p)) {
-        /* failed, flush it */
-        commit_buffer(vmp_profile_fileno(), p);
-    }
-    return 0;
-}
-
-static void flush_codes(void)
-{
-    struct profbuf_s *p = current_codes;
-    if (p != NULL) {
-        current_codes = NULL;
-        commit_buffer(vmp_profile_fileno(), p);
-    }
-}
diff --git a/rpython/rlib/rvmprof/src/shared/vmprof_main_win32.c b/rpython/rlib/rvmprof/src/shared/vmprof_main_win32.c
deleted file mode 100644
--- a/rpython/rlib/rvmprof/src/shared/vmprof_main_win32.c
+++ /dev/null
@@ -1,42 +0,0 @@
-// cannot include this header because it also has definitions
-#include "windows.h"
-#include "compat.h"
-#include "vmp_stack.h"
-
-HANDLE write_mutex;
-
-int prepare_concurrent_bufs(void)
-{
-    if (!(write_mutex = CreateMutex(NULL, FALSE, NULL)))
-        return -1;
-    return 0;
-}
-
-#include <tlhelp32.h>
-
-int vmp_write_all(const char *buf, size_t bufsize)
-{
-    int res;
-    int fd;
-    int count;
-
-    res = WaitForSingleObject(write_mutex, INFINITE);
-    fd = vmp_profile_fileno();
-
-    if (fd == -1) {
-        ReleaseMutex(write_mutex);
-        return -1;
-    }
-    while (bufsize > 0) {
-        count = _write(fd, buf, (long)bufsize);
-        if (count <= 0) {
-            ReleaseMutex(write_mutex);
-            return -1;   /* failed */
-        }
-        buf += count;
-        bufsize -= count;
-    }
-    ReleaseMutex(write_mutex);
-    return 0;
-}
-
diff --git a/rpython/rlib/rvmprof/src/shared/vmprof_main_win32.h b/rpython/rlib/rvmprof/src/shared/vmprof_main_win32.h
deleted file mode 100644
--- a/rpython/rlib/rvmprof/src/shared/vmprof_main_win32.h
+++ /dev/null
@@ -1,203 +0,0 @@
-#pragma once
-
-#include "windows.h"
-#include "compat.h"
-#include "vmp_stack.h"
-
-HANDLE write_mutex;
-
-int prepare_concurrent_bufs(void);
-
-#include "vmprof_common.h"
-#include <tlhelp32.h>
-
-// This file has been inspired (but not copied from since the LICENSE
-// would not allow it) from verysleepy profiler
-
-volatile int thread_started = 0;
-volatile int enabled = 0;
-
-int vmp_write_all(const char *buf, size_t bufsize);
-
-#ifdef RPYTHON_VMPROF
-typedef struct pypy_threadlocal_s PY_WIN_THREAD_STATE;
-#else
-typedef PyThreadState PY_WIN_THREAD_STATE;
-#endif
-
-
-RPY_EXTERN
-int vmprof_register_virtual_function(char *code_name, intptr_t code_uid,
-                                     int auto_retry)
-{
-    char buf[2048];
-    long namelen;
-
-    namelen = (long)strnlen(code_name, 1023);
-    buf[0] = MARKER_VIRTUAL_IP;
-    *(intptr_t*)(buf + 1) = code_uid;
-    *(long*)(buf + 1 + sizeof(intptr_t)) = namelen;
-    memcpy(buf + 1 + sizeof(intptr_t) + sizeof(long), code_name, namelen);
-    vmp_write_all(buf, 1 + sizeof(intptr_t) + sizeof(long) + namelen);
-    return 0;
-}
-
-int vmprof_snapshot_thread(DWORD thread_id, PY_WIN_THREAD_STATE *tstate, prof_stacktrace_s *stack)
-{
-    HRESULT result;
-    HANDLE hThread;
-    int depth;
-    CONTEXT ctx;
-#ifdef RPYTHON_LL2CTYPES
-    return 0; // not much we can do
-#else
-#if !defined(RPY_TLOFS_thread_ident) && defined(RPYTHON_VMPROF)
-    return 0; // we can't freeze threads, unsafe
-#else
-    hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, thread_id);
-    if (!hThread) {
-        return -1;
-    }
-    result = SuspendThread(hThread);
-    if(result == 0xffffffff)
-        return -1; // possible, e.g. attached debugger or thread alread suspended
-    // find the correct thread
-#ifdef RPYTHON_VMPROF
-    ctx.ContextFlags = CONTEXT_FULL;
-    if (!GetThreadContext(hThread, &ctx))
-        return -1;
-    depth = get_stack_trace(tstate->vmprof_tl_stack,
-                     stack->stack, MAX_STACK_DEPTH-2, ctx.Eip);
-    stack->depth = depth;
-    stack->stack[depth++] = thread_id;
-    stack->count = 1;
-    stack->marker = MARKER_STACKTRACE;
-    ResumeThread(hThread);
-    return depth;
-#else
-    depth = vmp_walk_and_record_stack(tstate->frame, stack->stack,
-                                      MAX_STACK_DEPTH, 0, 0);
-    stack->depth = depth;
-    stack->stack[depth++] = (void*)((ULONG_PTR)thread_id);
-    stack->count = 1;
-    stack->marker = MARKER_STACKTRACE;
-    ResumeThread(hThread);
-    return depth;
-#endif
-
-#endif
-#endif
-}
-
-#ifndef RPYTHON_VMPROF
-static
-PY_WIN_THREAD_STATE * get_current_thread_state(void)
-{
-#if PY_MAJOR_VERSION < 3
-    return _PyThreadState_Current;
-#elif PY_VERSION_HEX < 0x03050200
-    return (PyThreadState*) _Py_atomic_load_relaxed(&_PyThreadState_Current);
-#else
-    return _PyThreadState_UncheckedGet();
-#endif
-}
-#endif
-
-long __stdcall vmprof_mainloop(void *arg)
-{
-#ifdef RPYTHON_LL2CTYPES
-    // for tests only
-    return 0;
-#else
-    // it is not a test case!
-    PY_WIN_THREAD_STATE *tstate;
-    HANDLE hThreadSnap = INVALID_HANDLE_VALUE; 
-    prof_stacktrace_s *stack = (prof_stacktrace_s*)malloc(SINGLE_BUF_SIZE);
-    int depth;
-#ifndef RPYTHON_VMPROF
-    // cpython version
-    while (1) {
-        Sleep(profile_interval_usec * 1000);
-        if (!enabled) {
-            continue;
-        }
-        tstate = get_current_thread_state();
-        if (!tstate)
-            continue;
-        depth = vmprof_snapshot_thread(tstate->thread_id, tstate, stack);
-        if (depth > 0) {
-            vmp_write_all((char*)stack + offsetof(prof_stacktrace_s, marker),
-                          SIZEOF_PROF_STACKTRACE + depth * sizeof(void*));
-        }
-    }
-#else
-    // pypy version
-    while (1) {
-        //Sleep(profile_interval_usec * 1000);
-        Sleep(10);
-        if (!enabled) {
-            continue;
-        }
-        _RPython_ThreadLocals_Acquire();
-        tstate = _RPython_ThreadLocals_Head(); // the first one is one behind head
-        tstate = _RPython_ThreadLocals_Enum(tstate);
-        while (tstate) {
-            if (tstate->ready == 42) {
-                depth = vmprof_snapshot_thread(tstate->thread_ident, tstate, stack);
-                if (depth > 0) {
-                    vmp_write_all((char*)stack + offsetof(prof_stacktrace_s, marker),
-                         depth * sizeof(void *) +
-                         sizeof(struct prof_stacktrace_s) -
-                         offsetof(struct prof_stacktrace_s, marker));
-                }
-            }
-            tstate = _RPython_ThreadLocals_Enum(tstate);
-        }
-        _RPython_ThreadLocals_Release();
-    }
-#endif
-#endif
-}
-
-RPY_EXTERN
-int vmprof_enable(int memory, int native, int real_time)
-{
-    if (!thread_started) {
-        if (!CreateThread(NULL, 0, vmprof_mainloop, NULL, 0, NULL)) {
-            return -1;
-        }
-        thread_started = 1;
-    }
-    enabled = 1;
-    return 0;
-}
-
-RPY_EXTERN
-int vmprof_disable(void)
-{
-    char marker = MARKER_TRAILER;
-    (void)vmp_write_time_now(MARKER_TRAILER);
-
-    enabled = 0;
-    vmp_set_profile_fileno(-1);
-    return 0;
-}
-
-RPY_EXTERN
-void vmprof_ignore_signals(int ignored)
-{
-    enabled = !ignored;
-}
-
-int vmp_native_enable(void) {
-    return 0;
-}
-
-void vmp_native_disable(void) {
-}
-
-int get_stack_trace(PY_WIN_THREAD_STATE * current, void** result,
-		    int max_depth, intptr_t pc)
-{
-    return 0;
-}


More information about the pypy-commit mailing list