dyn_ext_server.c 5.1 KB
Newer Older
1
#include "dyn_ext_server.h"
2
3
4
5

#include <stdio.h>
#include <string.h>

6
#ifdef __linux__
7
#include <dlfcn.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)
12
#elif _WIN32
13
14
15
16
#include <windows.h>
#define LOAD_LIBRARY(lib, flags) LoadLibrary(lib)
#define LOAD_SYMBOL(handle, sym) GetProcAddress(handle, sym)
#define UNLOAD_LIBRARY(handle) FreeLibrary(handle)
Daniel Hiltgen's avatar
Daniel Hiltgen committed
17
18
19
20
21
22
23
24
#define LOAD_ERR() ({\
  LPSTR messageBuffer = NULL; \
  size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, \
                                 NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL); \
  char *resp = strdup(messageBuffer); \
  LocalFree(messageBuffer); \
  resp; \
})
25
26
27
28
#else
#include <dlfcn.h>
#define LOAD_LIBRARY(lib, flags) dlopen(lib, flags)
#define LOAD_SYMBOL(handle, sym) dlsym(handle, sym)
29
#define LOAD_ERR() strdup(dlerror())
30
#define UNLOAD_LIBRARY(handle) dlclose(handle)
31
32
#endif

33
void dyn_init(const char *libPath, struct dynamic_llama_server *s,
34
                       ext_server_resp_t *err) {
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
  int i = 0;
  struct lookup {
    char *s;
    void **p;
  } l[] = {
      {"llama_server_init", (void *)&s->llama_server_init},
      {"llama_server_start", (void *)&s->llama_server_start},
      {"llama_server_stop", (void *)&s->llama_server_stop},
      {"llama_server_completion", (void *)&s->llama_server_completion},
      {"llama_server_completion_next_result",
       (void *)&s->llama_server_completion_next_result},
      {"llama_server_completion_cancel",
       (void *)&s->llama_server_completion_cancel},
      {"llama_server_release_task_result",
       (void *)&s->llama_server_release_task_result},
      {"llama_server_tokenize", (void *)&s->llama_server_tokenize},
      {"llama_server_detokenize", (void *)&s->llama_server_detokenize},
      {"llama_server_embedding", (void *)&s->llama_server_embedding},
      {"llama_server_release_json_resp",
       (void *)&s->llama_server_release_json_resp},
      {"", NULL},
  };

58
  printf("loading library %s\n", libPath);
59
  s->handle = LOAD_LIBRARY(libPath, RTLD_LOCAL|RTLD_NOW);
60
61
  if (!s->handle) {
    err->id = -1;
62
    char *msg = LOAD_ERR();
63
    snprintf(err->msg, err->msg_len,
64
65
             "Unable to load dynamic server library: %s", msg);
    free(msg);
66
67
68
69
70
71
72
73
    return;
  }

  for (i = 0; l[i].p != NULL; i++) {
    *l[i].p = LOAD_SYMBOL(s->handle, l[i].s);
    if (!l[i].p) {
      UNLOAD_LIBRARY(s->handle);
      err->id = -1;
74
      char *msg = LOAD_ERR();
75
      snprintf(err->msg, err->msg_len, "symbol lookup for %s failed: %s",
76
77
               l[i].s, msg);
      free(msg);
78
79
80
81
82
      return;
    }
  }
}

83
inline void dyn_llama_server_init(struct dynamic_llama_server s,
84
85
                                           ext_server_params_t *sparams,
                                           ext_server_resp_t *err) {
86
87
88
  s.llama_server_init(sparams, err);
}

89
inline void dyn_llama_server_start(struct dynamic_llama_server s) {
90
91
92
  s.llama_server_start();
}

93
inline void dyn_llama_server_stop(struct dynamic_llama_server s) {
94
95
96
  s.llama_server_stop();
}

97
inline void dyn_llama_server_completion(struct dynamic_llama_server s,
98
99
                                                 const char *json_req,
                                                 ext_server_resp_t *resp) {
100
101
102
  s.llama_server_completion(json_req, resp);
}

103
inline void dyn_llama_server_completion_next_result(
104
    struct dynamic_llama_server s, const int task_id,
105
106
107
108
    ext_server_task_result_t *result) {
  s.llama_server_completion_next_result(task_id, result);
}

109
inline void dyn_llama_server_completion_cancel(
110
    struct dynamic_llama_server s, const int task_id, ext_server_resp_t *err) {
111
112
  s.llama_server_completion_cancel(task_id, err);
}
113
inline void dyn_llama_server_release_task_result(
114
    struct dynamic_llama_server s, ext_server_task_result_t *result) {
115
116
117
  s.llama_server_release_task_result(result);
}

118
inline void dyn_llama_server_tokenize(struct dynamic_llama_server s,
119
120
121
                                               const char *json_req,
                                               char **json_resp,
                                               ext_server_resp_t *err) {
122
123
124
  s.llama_server_tokenize(json_req, json_resp, err);
}

125
inline void dyn_llama_server_detokenize(struct dynamic_llama_server s,
126
127
128
                                                 const char *json_req,
                                                 char **json_resp,
                                                 ext_server_resp_t *err) {
129
130
131
  s.llama_server_detokenize(json_req, json_resp, err);
}

132
inline void dyn_llama_server_embedding(struct dynamic_llama_server s,
133
134
135
                                                const char *json_req,
                                                char **json_resp,
                                                ext_server_resp_t *err) {
136
137
138
  s.llama_server_embedding(json_req, json_resp, err);
}

139
inline void dyn_llama_server_release_json_resp(
140
    struct dynamic_llama_server s, char **json_resp) {
141
142
  s.llama_server_release_json_resp(json_resp);
}