3

pthread_create() で作成した新しいスレッドで、newSVpvn() で SV を作成しようとしています。この時点で、私のプログラムはクラッシュします。クラッシュが発生するC関数はこんな感じ

void *_inet_aton(void *v_arg) {
    SV* rv = &PL_sv_undef;
    struct thread_arg *arg = (struct thread_arg *)v_arg;

    struct hostent *rslv = gethostbyname(arg->host);
    if (!rslv) {
        goto RET;
    }

    if (rslv->h_addrtype == AF_INET && rslv->h_length == 4) {
        // !!!CRASH HERE!!!
        rv = newSVpvn((char *)rslv->h_addr, rslv->h_length);
    }

    RET:
        free(arg->host);
        free(arg);
}

そしてXSUB

void
inet_aton(Net_DNS_Native *self, char *host)
    CODE:
        pthread_t tid;
        struct thread_arg *t_arg = malloc(sizeof(struct thread_arg));
        t_arg->self = self;
        t_arg->host = strdup(host);
        pthread_create(&tid, &self->thread_attrs, _inet_aton, (void *)t_arg);

テスト例

use blib;
use Net::DNS::Native;


my $dns = Net::DNS::Native->new();
$dns->inet_aton("google.com");

# wait for a thread
sleep 10;

完全なコードはこちらにあります: https://github.com/olegwtf/p5-Net-DNS-Native/blob/fbc57dbe9e6832afed8d46cd369db6930bbd53bc/Native.xs

それで、私がやりたいことをすることは可能ですか?

4

1 に答える 1

2

クラッシュしているという事実は、あなたができないというかなり良い兆候です:)

実際に Perl インタープリターを持つスレッドで SV を作成します。つまり、解決された名前を取得するときに作成します。

于 2014-09-18T13:43:58.610 に答える