dyn_ext_server.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "dyn_ext_server.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #ifdef __linux__
  5. #include <dlfcn.h>
  6. #define LOAD_LIBRARY(lib, flags) dlopen(lib, flags)
  7. #define LOAD_SYMBOL(handle, sym) dlsym(handle, sym)
  8. #define LOAD_ERR() strdup(dlerror())
  9. #define UNLOAD_LIBRARY(handle) dlclose(handle)
  10. #elif _WIN32
  11. #include <windows.h>
  12. #define LOAD_LIBRARY(lib, flags) LoadLibrary(lib)
  13. #define LOAD_SYMBOL(handle, sym) GetProcAddress(handle, sym)
  14. #define UNLOAD_LIBRARY(handle) FreeLibrary(handle)
  15. inline char *LOAD_ERR() {
  16. LPSTR messageBuffer = NULL;
  17. size_t size = FormatMessageA(
  18. FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
  19. FORMAT_MESSAGE_IGNORE_INSERTS,
  20. NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  21. (LPSTR)&messageBuffer, 0, NULL);
  22. char *resp = strdup(messageBuffer);
  23. LocalFree(messageBuffer);
  24. return resp;
  25. }
  26. #else
  27. #include <dlfcn.h>
  28. #define LOAD_LIBRARY(lib, flags) dlopen(lib, flags)
  29. #define LOAD_SYMBOL(handle, sym) dlsym(handle, sym)
  30. #define LOAD_ERR() strdup(dlerror())
  31. #define UNLOAD_LIBRARY(handle) dlclose(handle)
  32. #endif
  33. void dyn_init(const char *libPath, struct dynamic_llama_server *s,
  34. ext_server_resp_t *err) {
  35. int i = 0;
  36. struct lookup {
  37. char *s;
  38. void **p;
  39. } l[] = {
  40. {"llama_server_init", (void *)&s->llama_server_init},
  41. {"llama_server_start", (void *)&s->llama_server_start},
  42. {"llama_server_stop", (void *)&s->llama_server_stop},
  43. {"llama_server_completion", (void *)&s->llama_server_completion},
  44. {"llama_server_completion_next_result",
  45. (void *)&s->llama_server_completion_next_result},
  46. {"llama_server_completion_cancel",
  47. (void *)&s->llama_server_completion_cancel},
  48. {"llama_server_release_task_result",
  49. (void *)&s->llama_server_release_task_result},
  50. {"llama_server_tokenize", (void *)&s->llama_server_tokenize},
  51. {"llama_server_detokenize", (void *)&s->llama_server_detokenize},
  52. {"llama_server_embedding", (void *)&s->llama_server_embedding},
  53. {"llama_server_release_json_resp",
  54. (void *)&s->llama_server_release_json_resp},
  55. {"", NULL},
  56. };
  57. printf("loading library %s\n", libPath);
  58. s->handle = LOAD_LIBRARY(libPath, RTLD_LOCAL|RTLD_NOW);
  59. if (!s->handle) {
  60. err->id = -1;
  61. char *msg = LOAD_ERR();
  62. snprintf(err->msg, err->msg_len,
  63. "Unable to load dynamic server library: %s", msg);
  64. free(msg);
  65. return;
  66. }
  67. for (i = 0; l[i].p != NULL; i++) {
  68. *l[i].p = LOAD_SYMBOL(s->handle, l[i].s);
  69. if (!l[i].p) {
  70. UNLOAD_LIBRARY(s->handle);
  71. err->id = -1;
  72. char *msg = LOAD_ERR();
  73. snprintf(err->msg, err->msg_len, "symbol lookup for %s failed: %s",
  74. l[i].s, msg);
  75. free(msg);
  76. return;
  77. }
  78. }
  79. }
  80. inline void dyn_llama_server_init(struct dynamic_llama_server s,
  81. ext_server_params_t *sparams,
  82. ext_server_resp_t *err) {
  83. s.llama_server_init(sparams, err);
  84. }
  85. inline void dyn_llama_server_start(struct dynamic_llama_server s) {
  86. s.llama_server_start();
  87. }
  88. inline void dyn_llama_server_stop(struct dynamic_llama_server s) {
  89. s.llama_server_stop();
  90. }
  91. inline void dyn_llama_server_completion(struct dynamic_llama_server s,
  92. const char *json_req,
  93. ext_server_resp_t *resp) {
  94. s.llama_server_completion(json_req, resp);
  95. }
  96. inline void dyn_llama_server_completion_next_result(
  97. struct dynamic_llama_server s, const int task_id,
  98. ext_server_task_result_t *result) {
  99. s.llama_server_completion_next_result(task_id, result);
  100. }
  101. inline void dyn_llama_server_completion_cancel(
  102. struct dynamic_llama_server s, const int task_id, ext_server_resp_t *err) {
  103. s.llama_server_completion_cancel(task_id, err);
  104. }
  105. inline void dyn_llama_server_release_task_result(
  106. struct dynamic_llama_server s, ext_server_task_result_t *result) {
  107. s.llama_server_release_task_result(result);
  108. }
  109. inline void dyn_llama_server_tokenize(struct dynamic_llama_server s,
  110. const char *json_req,
  111. char **json_resp,
  112. ext_server_resp_t *err) {
  113. s.llama_server_tokenize(json_req, json_resp, err);
  114. }
  115. inline void dyn_llama_server_detokenize(struct dynamic_llama_server s,
  116. const char *json_req,
  117. char **json_resp,
  118. ext_server_resp_t *err) {
  119. s.llama_server_detokenize(json_req, json_resp, err);
  120. }
  121. inline void dyn_llama_server_embedding(struct dynamic_llama_server s,
  122. const char *json_req,
  123. char **json_resp,
  124. ext_server_resp_t *err) {
  125. s.llama_server_embedding(json_req, json_resp, err);
  126. }
  127. inline void dyn_llama_server_release_json_resp(
  128. struct dynamic_llama_server s, char **json_resp) {
  129. s.llama_server_release_json_resp(json_resp);
  130. }