blob: d4abf065765e1c3f75283be97460dcdfbde57cfc [file] [log] [blame]
#include "mvm/VirtualMachine.h"
#include "mvm/VMKit.h"
#include "MutatorThread.h"
using namespace mvm;
VirtualMachine::VirtualMachine(mvm::BumpPtrAllocator &Alloc, mvm::VMKit* vmk) : allocator(Alloc) {
vmkit = vmk;
vmID = vmkit->addVM(this);
}
VirtualMachine::~VirtualMachine() {
vmkit->removeVM(vmID);
}
class LauncherThread : public MutatorThread {
public:
void (*realStart)(VirtualMachine*, int, char**);
VirtualMachine* vm;
int argc;
char** argv;
LauncherThread(VMKit* vmkit, void (*s)(VirtualMachine*, int, char**), VirtualMachine* v, int ac, char** av) : MutatorThread(vmkit) {
realStart = s;
vm = v;
argc = ac;
argv = av;
}
static void launch(LauncherThread* th) {
if(th->realStart)
th->realStart(th->vm, th->argc, th->argv);
else
th->vm->runApplicationImpl(th->argc, th->argv);
}
};
void VirtualMachine::runApplication(void (*starter)(VirtualMachine*, int, char**), int argc, char **argv) {
(new LauncherThread(vmkit, starter, this, argc, argv))->start((void (*)(Thread*))LauncherThread::launch);
}
void VirtualMachine::runApplication(int argc, char** argv) {
runApplication(0, argc, argv);
}