-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy paththread.cpp
72 lines (62 loc) · 2.01 KB
/
thread.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/**
* Copyright 2010 by Benjamin J. Land (a.k.a. BenLand100)
*
* This file is part of SJVM the Simple Java Virtual Machine.
*
* SJVM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* SJVM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with SJVM. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Thread.h"
#include "SJVM.h"
#include <iostream>
#include <pthread.h>
#include <cstring>
#define DEBUG_OUTPUT
#ifdef DEBUG_OUTPUT
#define debug(v) std::cout << v;
#else
#define debug(v)
#endif
Thread::Thread(SJVM *_sjvm) : sjvm(_sjvm), nativeException(0) {
debug("Thread Entered\n");
jnienv = new JNIEnv;
JNINativeInterface_ *functions = new JNINativeInterface_;
memcpy(functions, &SJVM_JNINativeInterface, sizeof(JNINativeInterface_));
functions->reserved0 = sjvm;
functions->reserved1 = this;
jnienv->functions = functions;
id = pthread_self();
sjvm->threads[id] = this;
nativeLocal = 0;
new LocalGC(sjvm->gc,this); //Perisistes until gc is destroyed... not so smart
sjvm->gc->objects.insert(this);
nativeLocal->addLocal(this);
}
Thread::~Thread() {
debug("Thread Exited\n");
sjvm->threads.erase(id);
delete jnienv->functions;
delete jnienv;
}
Thread* Thread::getThread(SJVM *sjvm) {
unsigned int id = pthread_self();
if (sjvm->threads.find(id) == sjvm->threads.end()) {
return new Thread(sjvm);
}
return sjvm->threads[id];
}
JNIEnv* Thread::getEnv() {
return jnienv;
}
void Thread::start() {
}