view src/parallel_execution/dependency.c @ 119:4df53a60e59a

Add dependency function
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 19 Jul 2016 18:39:22 +0900
parents c9ab10847fc3
children bb8be1820302
line wrap: on
line source

#include <stdio.h>
#include "context.h"
#include "origin_cs.h"

__code meta_waitFor(struct Context* context, struct Queue* queue, enum Code next) {
    context->data[Queue] = (union Data *)queue;
    goto (context->code[next])(context);
}

__code waitFor1(struct Context* context, struct Task* master, struct Task* slave, struct Element* element, union Data* data) {
    struct Integer integer = (struct Integer *)data;
    struct Queue waitMeTasks = (struct Queue *)(integer + integer-> mDataOffset);
    element->data = (union Data *)slave;
    // enqueue waitMe
    goto meta_waitFor(context, waitMeTasks, PutQueue1);
}

__code waitFor1_stub(struct Context* context) {
    // think
}

__code meta_spawnTask(struct Context* context, struct Queue* queue, enum Code next) {
    context->data[Queue] = (union Data *)queue;
    goto (context->code[next])(context);
}

__code spawnTask(struct Context* context, struct Task* task, struct Element* element, struct Queue* activeQueue, struct Queue* waitQueue) {
    if (task->idsCount == 0) {
        //printf("put ActiveQueue\n");
        // enqueue activeQueue
        goto meta_spawnTask(context, activeQueue, PutQueue1);
    } else {
        //printf("put WaitQueue\n");
        // enqueue waitQueue
        goto meta_spawnTask(context, waitQueue, PutQueue1);
    }
}

__code spawnTask_stub(struct Context* context) {
    goto spawnTask(context,
            &context->data[context->dataNum]->task,
            &context->data[Element]->element,
            &context->data[ActiveQueue]->queue,
            &context->data[WaitQueue]->queue);
}

__code meta_check_task_finish1(struct Context* context, struct Queue* queue, enum Code next) {
    context->data[Queue] = (union Data *)queue;
    goto (context->code[next])(context);
}

__code check_task_finish1(struct Context* context, struct Data* data) {
    struct Integer integer = (struct Integer *)data;
    struct Queue waitMeTasks = (struct Queue *)(integer + integer->mDataOffset);
    context->next = check_task_finish2;
    goto meta_check_task_finish1(context, waitMeTasks, CheckTaskFinish2);
}

__code check_task_finish1_stub(struct Context* context) {
}

/*
 * ready input data Gear for waitme task
 */
__code check_task_finish2(struct Context* context) {
    struct Task task = ((struct Task) element -> data);
    task->idsCount--;
}

__code check_task_finish2_stub(struct Context* context) {
}

__code add(struct Context* context, struct Integer* input1, struct Integer* input2, struct Integer* output) {
    output->value = input1->value + input2->value;
}

__code mult(struct Context* context, struct Integer* input1, struct Integer* input2, struct Integer* output) {
    output->value = input1->value * input2->value;
}