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
|
#pragma once
#include "Core/Io/Url.h"
#include "Core/SharedLib.h"
#include "SharedOS.h"
#include "World.h"
#include "CppLoader.h"
namespace storm {
STORM_PKG(core.lang);
class Thread;
class Package;
/**
* Represents a single loaded shared library.
*/
class SharedLib : NoCopy {
public:
// Load and initialize a library. Returns null on failure.
static SharedLib *load(Url *file);
// Destroy.
~SharedLib();
// Signal to this library that shutdown is in progress.
void shutdown();
// Any previous instance of this library?
SharedLib *prevInstance();
// Create a CppLoader for this shared library.
CppLoader createLoader(Engine &e, Package *into);
private:
// Entry point type.
typedef bool (*EntryFn)(const SharedLibStart *, SharedLibInfo *);
// Create and initialize a library.
SharedLib(Url *file, LoadedLib lib, EntryFn entry);
// The OS handle to the library.
LoadedLib lib;
// All data in a GC root.
struct Root {
SharedLibInfo info;
Url *srcDir;
};
// Data managed by the GC.
Root root;
// GC root.
Gc::Root *gcRoot;
// The world loaded by this shared library.
World world;
// Was the library loaded without issues?
bool ok;
// Implementation of the unique functions.
static Type *cppType(Engine &e, void *lib, Nat id);
static Type *cppTemplate(Engine &e, void *lib, Nat id, Nat count, va_list params);
static Thread *getThread(Engine &e, void *lib, const DeclThread *decl);
static void *getData(Engine &e, void *lib);
};
}
|