K.Sasada's Home Page

こめんとのついか

こめんとこめんと!

message

please add long comment :).

_20(Fri)

Python の JIT コンパイラ作りたい,って人が python-dev にあらわれ,色々意見が飛び交っているスレッドが面白い.

これまで,どんな努力が行われてきており,そこから得られた知見とはなんだったのか,などを言い合ってる.おおむねそんなところだろうなぁ,という話が多い.互換性が問題になるのはどこも一緒,とか.LLVM についての議論もある.

Python ってこんなにコンパイラがあったんだな.


シグナルはスタックを汚すか,という話を住井先生の https://twitter.com/esumii/status/226282543912214529 を見て確認してみた.

#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>

char *
g(void)
{
    char str[1024];
    memset(str, 'x', 1024);
    return str;
}

int g_index;

void
f(void)
{
    char *str = g();
    int miss = 0;

    while (miss == 0) {
	for (g_index=0; g_index<1024; g_index++) {
	    if (str[g_index] != 'x') {
		printf("modified (%d: 0x%x)\n", g_index, (int)str[g_index]);
		miss += 1;
	    }
	}
    }
}

#define ALTSTACK_SIZE (4096 * 1024)
char altstack[ALTSTACK_SIZE];

void 
handler(int sig)
{
    char str[1024];
    printf("SIGINT received\n");
    g_index = 0;
    memset(str, 'y', 1024);
}

main(int argc, char *argv[])
{
    if (argc > 1) {
	stack_t stack;
	stack.ss_sp = altstack;
	stack.ss_flags = 0;
	stack.ss_size = ALTSTACK_SIZE;

	if (sigaltstack(&stack, 0) != 0) {
	    perror("sigaltstack");
	    exit(1);
	}
	printf("use sigaltstack(2)\n");
    }

    if (argc > 1 && strcmp(argv[1], "signal") == 0) {
	signal(SIGINT, handler);
	printf("use signal(2)\n");
    }
    else {
	struct sigaction act;
	act.sa_handler = handler;
	act.sa_flags = SA_ONSTACK;
	sigaction(SIGINT, &act, 0);
	printf("use sigaction(2)\n");
    }
    f();
}

シグナルで汚す.

と設定して,Ctrl-C をフック.その時,スタックが汚れてたら終了する.

3番目は見事に汚さないことがわかる(kill -9 しないと止まらなくなるので注意).

x86 において,割り込み時に CPU が PC をどうストアするのか,よく覚えていない.というか,どうなるんだっけ.

_maeda(Sat Jul 21 09:12:44 +0900 2012)

(kill -9 しないと止まらなくなるので注意).

どうでもいいツッコミですが、Quit (Ctrl-\)で止まるかと。

_ささだ(Mon Jul 23 13:19:13 +0900 2012)

 な,なんだってー.(以前見たことがあるんですが,すっかり忘れていました,ありがとうございます.)


好きなだけ長いコメントをどうぞ。

お名前


back

tton 記述が使えます。YukiWikiな記述してりゃ問題ありません。

「行頭に#code」 と、「行頭に#end」 で挟むと、その間の行は pre で囲まれます。プログラムのソースを書くときに使ってください。

例:

#code

(なんかプログラム書く)

#end

リンクは

[[なまえ|http://www.example.org]]

とか

[[http://www.example.org]]

で貼れます。

$Date: 2003/04/28 10:27:51 $