1
#include "dyn_ext_server.h"
8
#define LOAD_LIBRARY(lib, flags) dlopen(lib, flags)
9
#define LOAD_SYMBOL(handle, sym) dlsym(handle, sym)
10
#define LOAD_ERR() strdup(dlerror())
11
#define UNLOAD_LIBRARY(handle) dlclose(handle)
14
#define LOAD_LIBRARY(lib, flags) LoadLibrary(lib)
15
#define LOAD_SYMBOL(handle, sym) GetProcAddress(handle, sym)
16
#define UNLOAD_LIBRARY(handle) FreeLibrary(handle)
17
inline char *LOAD_ERR() {
18
LPSTR messageBuffer = NULL;
19
size_t size = FormatMessageA(
20
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
21
FORMAT_MESSAGE_IGNORE_INSERTS,
22
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
23
(LPSTR)&messageBuffer, 0, NULL);
24
char *resp = strdup(messageBuffer);
25
LocalFree(messageBuffer);
30
#define LOAD_LIBRARY(lib, flags) dlopen(lib, flags)
31
#define LOAD_SYMBOL(handle, sym) dlsym(handle, sym)
32
#define LOAD_ERR() strdup(dlerror())
33
#define UNLOAD_LIBRARY(handle) dlclose(handle)
36
void dyn_init(const char *libPath, struct dynamic_llama_server *s,
37
ext_server_resp_t *err) {
43
{"llama_server_init", (void *)&s->llama_server_init},
44
{"llama_server_start", (void *)&s->llama_server_start},
45
{"llama_server_stop", (void *)&s->llama_server_stop},
46
{"llama_server_completion", (void *)&s->llama_server_completion},
47
{"llama_server_completion_next_result",
48
(void *)&s->llama_server_completion_next_result},
49
{"llama_server_completion_cancel",
50
(void *)&s->llama_server_completion_cancel},
51
{"llama_server_release_task_result",
52
(void *)&s->llama_server_release_task_result},
53
{"llama_server_tokenize", (void *)&s->llama_server_tokenize},
54
{"llama_server_detokenize", (void *)&s->llama_server_detokenize},
55
{"llama_server_embedding", (void *)&s->llama_server_embedding},
56
{"llama_server_release_json_resp",
57
(void *)&s->llama_server_release_json_resp},
61
printf("loading library %s\n", libPath);
62
s->handle = LOAD_LIBRARY(libPath, RTLD_LOCAL|RTLD_NOW);
65
char *msg = LOAD_ERR();
66
snprintf(err->msg, err->msg_len,
67
"Unable to load dynamic server library: %s", msg);
72
for (i = 0; l[i].p != NULL; i++) {
73
*l[i].p = LOAD_SYMBOL(s->handle, l[i].s);
75
UNLOAD_LIBRARY(s->handle);
77
char *msg = LOAD_ERR();
78
snprintf(err->msg, err->msg_len, "symbol lookup for %s failed: %s",
86
inline void dyn_llama_server_init(struct dynamic_llama_server s,
87
ext_server_params_t *sparams,
88
ext_server_resp_t *err) {
89
s.llama_server_init(sparams, err);
92
inline void dyn_llama_server_start(struct dynamic_llama_server s) {
93
s.llama_server_start();
96
inline void dyn_llama_server_stop(struct dynamic_llama_server s) {
97
s.llama_server_stop();
100
inline void dyn_llama_server_completion(struct dynamic_llama_server s,
101
const char *json_req,
102
ext_server_resp_t *resp) {
103
s.llama_server_completion(json_req, resp);
106
inline void dyn_llama_server_completion_next_result(
107
struct dynamic_llama_server s, const int task_id,
108
ext_server_task_result_t *result) {
109
s.llama_server_completion_next_result(task_id, result);
112
inline void dyn_llama_server_completion_cancel(
113
struct dynamic_llama_server s, const int task_id, ext_server_resp_t *err) {
114
s.llama_server_completion_cancel(task_id, err);
116
inline void dyn_llama_server_release_task_result(
117
struct dynamic_llama_server s, ext_server_task_result_t *result) {
118
s.llama_server_release_task_result(result);
121
inline void dyn_llama_server_tokenize(struct dynamic_llama_server s,
122
const char *json_req,
124
ext_server_resp_t *err) {
125
s.llama_server_tokenize(json_req, json_resp, err);
128
inline void dyn_llama_server_detokenize(struct dynamic_llama_server s,
129
const char *json_req,
131
ext_server_resp_t *err) {
132
s.llama_server_detokenize(json_req, json_resp, err);
135
inline void dyn_llama_server_embedding(struct dynamic_llama_server s,
136
const char *json_req,
138
ext_server_resp_t *err) {
139
s.llama_server_embedding(json_req, json_resp, err);
142
inline void dyn_llama_server_release_json_resp(
143
struct dynamic_llama_server s, char **json_resp) {
144
s.llama_server_release_json_resp(json_resp);