| 463 | } |
| 464 | |
| 465 | txID fxExecuteModulesFrom(txMachine* the, txSlot* queue, txSlot* module, txSlot** exception) |
| 466 | { |
| 467 | txSlot* fromModules = mxModuleTransfers(module)->value.reference; |
| 468 | txSlot* fromModule; |
| 469 | if (mxModuleTransfers(module)->kind == XS_NULL_KIND) |
| 470 | return XS_MODULE_STATUS_LINKED; |
| 471 | fromModule = fromModules->next; |
| 472 | while (fromModule) { |
| 473 | if (mxModuleStatus(fromModule) == XS_MODULE_STATUS_ERROR) { |
| 474 | *exception = mxModuleMeta(fromModule); |
| 475 | return XS_MODULE_STATUS_ERROR; |
| 476 | } |
| 477 | fromModule = fromModule->next; |
| 478 | } |
| 479 | fromModule = fromModules->next; |
| 480 | while (fromModule) { |
| 481 | if (mxModuleStatus(fromModule) == XS_MODULE_STATUS_EXECUTING) { |
| 482 | return XS_MODULE_STATUS_EXECUTING; |
| 483 | } |
| 484 | fromModule = fromModule->next; |
| 485 | } |
| 486 | fromModule = fromModules->next; |
| 487 | while (fromModule) { |
| 488 | if (mxModuleStatus(fromModule) == XS_MODULE_STATUS_LINKED) { |
| 489 | txSlot* waitingModule = queue->next; |
| 490 | while (waitingModule) { |
| 491 | if (module->value.reference == waitingModule->value.reference) |
| 492 | break; |
| 493 | if (fromModule->value.reference == waitingModule->value.reference) |
| 494 | return XS_MODULE_STATUS_EXECUTING; |
| 495 | waitingModule = waitingModule->next; |
| 496 | } |
| 497 | } |
| 498 | fromModule = fromModule->next; |
| 499 | } |
| 500 | return XS_MODULE_STATUS_LINKED; |
| 501 | } |
| 502 | |
| 503 | void fxExecuteModulesFulfilled(txMachine* the) |
| 504 | { |