-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathconvec.c
More file actions
66 lines (57 loc) · 1.53 KB
/
Copy pathconvec.c
File metadata and controls
66 lines (57 loc) · 1.53 KB
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
#include <stdio.h>
#include <sys/stat.h>
#include <dlfcn.h>
#include <stdbool.h>
#include <assert.h>
#include "convec.h"
static __darwin_ino_t fileId(const char *path) {
struct stat stats;
stat(path, &stats);
return stats.st_ino;
}
static void unloadLib(void *lib) {
if (dlclose(lib) == -1) {
assert(false);
}
}
static void *loadLib(const char *path) {
void *lib = dlopen(path, RTLD_NOW | RTLD_LOCAL);
if (lib == NULL) {
assert(false);
}
return lib;
}
static void *loadSymbol(void *handle, const char *symbol) {
void *address = dlsym(handle, symbol);
if (address == NULL) {
assert(false);
}
return address;
}
Convec ConvecInit(const char *libPath, const char *funcName, void *state,
int waitCycles) {
void *lib = loadLib(libPath);
return (Convec) {
.libPath = libPath,
.fileId = fileId(libPath),
.lib = lib,
.funcName = funcName,
.callback = loadSymbol(lib, funcName),
.state = state,
.waitCycles = waitCycles,
};
}
void ConvecRunAndUpdate(Convec *cv) {
cv->callback(cv);
cv->cycles += 1;
if (cv->cycles >= cv->waitCycles) {
cv->cycles = 0;
__darwin_ino_t maybeNewFileId = fileId(cv->libPath);
if (cv->fileId != maybeNewFileId) {
cv->fileId = maybeNewFileId;
unloadLib(cv->lib);
cv->lib = loadLib(cv->libPath);
cv->callback = loadSymbol(cv->lib, cv->funcName);
}
}
}