corda/src/system.h

154 lines
3.2 KiB
C
Raw Normal View History

#ifndef SYSTEM_H
#define SYSTEM_H
#include "common.h"
#include "allocator.h"
namespace vm {
2007-07-07 12:09:16 -06:00
class System: public Allocator {
public:
2007-06-20 15:27:22 -06:00
typedef intptr_t Status;
2007-09-16 18:13:36 -06:00
enum FileType {
Unknown,
DoesNotExist,
File,
Directory
};
class Thread {
public:
virtual ~Thread() { }
2007-07-28 15:28:25 -06:00
virtual void interrupt() = 0;
2007-07-07 12:09:16 -06:00
virtual void join() = 0;
virtual void dispose() = 0;
};
class Runnable {
public:
virtual ~Runnable() { }
2007-07-28 15:28:25 -06:00
virtual void attach(Thread*) = 0;
virtual void run() = 0;
virtual bool interrupted() = 0;
virtual void setInterrupted(bool v) = 0;
};
class Monitor {
public:
virtual ~Monitor() { }
2007-07-28 15:28:25 -06:00
virtual bool tryAcquire(Thread* context) = 0;
virtual void acquire(Thread* context) = 0;
virtual void release(Thread* context) = 0;
virtual bool wait(Thread* context, int64_t time) = 0;
virtual void notify(Thread* context) = 0;
virtual void notifyAll(Thread* context) = 0;
virtual Thread* owner() = 0;
virtual void dispose() = 0;
};
class Local {
public:
virtual ~Local() { }
virtual void* get() = 0;
virtual void set(void* p) = 0;
virtual void dispose() = 0;
};
2007-09-16 18:13:36 -06:00
class Region {
public:
virtual ~Region() { }
virtual const uint8_t* start() = 0;
virtual size_t length() = 0;
virtual void dispose() = 0;
};
2007-06-23 19:39:49 -06:00
class Library {
public:
virtual ~Library() { }
virtual void* resolve(const char* function) = 0;
virtual const char* name() = 0;
virtual bool mapName() = 0;
2007-06-23 19:39:49 -06:00
virtual Library* next() = 0;
virtual void dispose() = 0;
2007-06-23 19:39:49 -06:00
};
2007-12-30 15:24:48 -07:00
class SignalHandler {
public:
virtual ~SignalHandler() { }
virtual bool handleSignal(void** ip, void** base, void** stack,
void** thread) = 0;
2007-12-30 15:24:48 -07:00
};
virtual ~System() { }
virtual Allocator* codeAllocator() = 0;
virtual bool success(Status) = 0;
2007-07-28 15:28:25 -06:00
virtual Status attach(Runnable*) = 0;
2007-07-07 12:09:16 -06:00
virtual Status start(Runnable*) = 0;
virtual Status make(Monitor**) = 0;
virtual Status make(Local**) = 0;
2007-12-30 15:24:48 -07:00
virtual Status handleSegFault(SignalHandler* handler) = 0;
2007-06-28 20:58:48 -06:00
virtual uint64_t call(void* function, uintptr_t* arguments, uint8_t* types,
unsigned count, unsigned size,
unsigned returnType) = 0;
2007-09-16 18:13:36 -06:00
virtual Status map(Region**, const char* name) = 0;
virtual FileType identify(const char* name) = 0;
virtual Status load(Library**, const char* name, bool mapName, Library* next)
= 0;
virtual char pathSeparator() = 0;
2007-08-18 16:35:22 -06:00
virtual int64_t now() = 0;
virtual void exit(int code) = 0;
2007-06-17 22:25:42 -06:00
virtual void abort() = 0;
virtual void dispose() = 0;
2007-06-20 13:20:25 -06:00
2007-07-07 12:09:16 -06:00
virtual void* allocate(unsigned size) {
2007-06-21 20:13:17 -06:00
void* p = tryAllocate(size);
if (p == 0) {
2007-06-20 13:20:25 -06:00
abort();
}
return p;
}
};
inline void NO_RETURN
abort(System* s)
{
s->abort(); // this should not return
::abort();
}
inline void NO_RETURN
sysAbort(System* s)
{
abort(s);
}
inline void
expect(System* s, bool v)
{
if (UNLIKELY(not v)) abort(s);
}
#ifdef NDEBUG
2007-07-28 15:28:25 -06:00
# define assert(a, b)
2007-07-28 15:28:25 -06:00
#else // not NDEBUG
inline void
assert(System* s, bool v)
{
expect(s, v);
}
2007-07-28 15:28:25 -06:00
#endif // not NDEBUG
System*
makeSystem(unsigned heapSize);
} // namespace vm
#endif//SYSTEM_H