view src/parallel_execution/generate_context.pl @ 208:b6ffdd99e525

fix generate_context
author mir3636
date Tue, 20 Dec 2016 19:39:51 +0900 (2016-12-20)
parents 42dbe54332a0
children ba56dab79dc4
line wrap: on
line source
#!/usr/bin/perl


# CodeGear
# 
# *.c
# __code taskManager_stub(struct Context* context) {
# 
# context.h
# C_taskManager,
# 
# context.c
# extern __code taskManager_stub(struct Context*);
# 
# context->code[C_taskManager]   = taskManager_stub;
# 
# DataGear
# 
# context.h
# struct Worker {
#         int id;
#         struct Context* contexts;
#         enum Code execute;
#         enum Code taskSend;
#         enum Code taskRecive;
#         enum Code shutdown;
#         struct Queue* tasks;
#     } Worker;
# 
# typedef struct Worker Worker;
# D_Worker,
# 
# context.c
# ALLOC_DATA(context, Worker);

system "rm -rf c";
system "mkdir c";

while (<*.c test/*.c>) {
    next if (/context.c/);
    &getStubInfo($_);
}

&generateContext();

sub getStubInfo {
    my ($filename) = @_;
    open my $fd,"<",$filename or die("can't open $filename $!");
    while (<$fd>) {
        if (/^__code (\w+)_stub\(struct Context\* context\)/ or /^\s__code (\w+)_stub\(struct Context\* context\)/) {
            $codeGear{$1} = $filename;
        }
    }

    open my $cx,"<","context.h" or die("can't open context.h $!");
    while (<$cx>) {
        if (! $inUnionData) {
            if ( /^union Data/) {
                $inUnionData = 1;
            }
            next;
        }
        last if (/union Data end/);
        if (/struct (\w+) \{/) {
            $dataGear{$1} = $1;
        }
    }
}

sub generateContext {
    open my $fd,">","c/extern.h" or die("can't open c/extern.h $!");
    for my $code ( sort keys %codeGear ) {
        print $fd "extern __code ${code}_stub(struct Context*);\n";
    }
    print $fd "\n";

    open my $fd,">","c/enumCode.h" or die("can't open c/enumCode.h $!");
    print $fd "enum Code {\n";
    for my $code ( sort keys %codeGear ) {
        print $fd "    C_${code},\n";
    }
    print $fd "};\n";
    
    open my $fd,">","c/codeGearInit.c" or die("can't open c/codeGearInit.c $!");
    for my $code ( sort keys %codeGear ) {
        print $fd "    context->code[C_${code}]    = ${code}_stub;\n";
    }

    open my $fd,">","c/enumData.h" or die("can't open c/enumData.h $!");
    print $fd "enum DataType {\n";
    for my $data ( sort keys %dataGear ) {
        print $fd "    D_${data},\n";
    }
    print $fd "};\n\n";
    
    open my $fd,">","c/typedefData.h" or die("can't open c/typedefData.h $!");
    for my $data ( sort keys %dataGear ) {
        print $fd "typedef struct ${data} ${data};\n";
    }

    open my $fd,">","c/dataGearInit.c" or die("can't open c/dataGearInit.c $!");
    for my $data ( sort keys %dataGear ) {
        print $fd "    ALLOC_DATA(context, ${data});\n";
    }
}

# end