示例#1
0
void invoke_task(Task *task, const char *invoker) {

  debugPrintf("'%s': task_invoke('%s','%s') at %f\n", rtsys->blockName, task->name, invoker, rtsys->time);

  if (task->isUserTask()) {
    UserTask *usertask = (UserTask*)task;

    usertask->arrival_hook(usertask);
    if (usertask->nbrInvocations == 0) {
      usertask->arrival = rtsys->time;
      usertask->release = rtsys->time;
      usertask->release_hook(usertask);
      usertask->moveToList(rtsys->readyQs[usertask->affinity]);
      usertask->state = READY;
    } else {
      TaskInvocation *ti = new TaskInvocation();
      ti->timestamp = rtsys->time;
      strncpy(ti->invoker, invoker, MAXCHARS); // not used
      usertask->pending->appendNode(new DataNode(ti, NULL));
    }
    usertask->nbrInvocations++;

  } else {

    InterruptHandler *handler = (InterruptHandler*)task;

    if (handler->nbrInvocations == 0) {
      handler->timestamp = rtsys->time;
      strncpy(handler->invoker, invoker, MAXCHARS);
      handler->moveToList(rtsys->readyQs[handler->affinity]);
      handler->state = READY;
    } else {
      TaskInvocation *ti = new TaskInvocation();
      ti->timestamp = rtsys->time;
      strncpy(ti->invoker, invoker, MAXCHARS);
      handler->pending->appendNode(new DataNode(ti, NULL));
    }
    handler->nbrInvocations++;

  }

}