summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lsp.c23
-rw-r--r--lsp.h10
-rw-r--r--main.c2
-rw-r--r--make.bat9
-rw-r--r--util.c1
5 files changed, 37 insertions, 8 deletions
diff --git a/lsp.c b/lsp.c
index fe122a0..f1fb452 100644
--- a/lsp.c
+++ b/lsp.c
@@ -6,11 +6,17 @@
const char *language_to_str(Language language);
+static LSPMutex request_id_mutex;
+
// it's nice to have request IDs be totally unique, including across LSP servers.
static LSPRequestID get_request_id(void) {
// it's important that this never returns 0, since that's reserved for "no ID"
- static _Atomic LSPRequestID last_request_id;
- return ++last_request_id;
+ static LSPRequestID last_request_id;
+ assert(request_id_mutex);
+ SDL_LockMutex(request_id_mutex);
+ u32 id = ++last_request_id;
+ SDL_UnlockMutex(request_id_mutex);
+ return id;
}
bool lsp_get_error(LSP *lsp, char *error, size_t error_size, bool clear) {
@@ -271,7 +277,7 @@ static bool lsp_receive(LSP *lsp, size_t max_size) {
// read stderr. if all goes well, we shouldn't get anything over stderr.
char stderr_buf[1024] = {0};
for (size_t i = 0; i < (max_size + sizeof stderr_buf) / sizeof stderr_buf; ++i) {
- ssize_t nstderr = process_read_stderr(lsp->process, stderr_buf, sizeof stderr_buf - 1);
+ long long nstderr = process_read_stderr(lsp->process, stderr_buf, sizeof stderr_buf - 1);
if (nstderr > 0) {
// uh oh
stderr_buf[nstderr] = '\0';
@@ -496,7 +502,9 @@ const char *lsp_document_path(LSP *lsp, LSPDocumentID document) {
LSP *lsp_create(const char *root_dir, const char *command, const char *configuration, FILE *log) {
LSP *lsp = calloc(1, sizeof *lsp);
if (!lsp) return NULL;
-
+ if (!request_id_mutex)
+ request_id_mutex = SDL_CreateMutex();
+
static LSPID curr_id = 1;
lsp->id = curr_id++;
lsp->log = log;
@@ -700,3 +708,10 @@ void lsp_cancel_request(LSP *lsp, LSPRequestID id) {
lsp_send_request(lsp, &request);
}
}
+
+void lsp_quit(void) {
+ if (request_id_mutex) {
+ SDL_DestroyMutex(request_id_mutex);
+ request_id_mutex = NULL;
+ }
+}
diff --git a/lsp.h b/lsp.h
index 1e11180..28ebcd8 100644
--- a/lsp.h
+++ b/lsp.h
@@ -557,10 +557,10 @@ typedef struct LSP {
// has the response to the initialize request been sent?
// thread-safety: this starts out false, and only gets set to true once
// (when the initialize response is received)
- _Atomic bool initialized;
+ bool initialized;
// has the LSP server exited?
- // thread-safety: atomic
- _Atomic bool exited;
+ // thread-safety: this starts out false, and only gets set to true once (when the server exits)
+ bool exited;
// thread-safety: only set once in lsp_create.
char *command;
// this is set in lsp_create, then later set to NULL when we send over the configuration (after the initialized notification).
@@ -628,6 +628,10 @@ LSPDocumentPosition lsp_location_start_position(LSPLocation location);
// get the end of location's range as a LSPDocumentPosition
LSPDocumentPosition lsp_location_end_position(LSPLocation location);
void lsp_free(LSP *lsp);
+// call this to free any global resources used by lsp*.c
+// not strictly necessary, but prevents valgrind errors & stuff.
+// make sure you call lsp_free on every LSP you create before calling this.
+void lsp_quit(void);
#endif // LSP_H_
diff --git a/main.c b/main.c
index a440585..ff73375 100644
--- a/main.c
+++ b/main.c
@@ -1115,6 +1115,8 @@ int main(int argc, char **argv) {
lsp_free(ted->lsps[i]);
ted->lsps[i] = NULL;
}
+ lsp_quit();
+
arr_foreach_ptr(ted->shell_history, char *, cmd) {
free(*cmd);
}
diff --git a/make.bat b/make.bat
index 2490917..b53da09 100644
--- a/make.bat
+++ b/make.bat
@@ -13,7 +13,14 @@ if not exist pcre2-32-static.lib (
SET C_FLAGS=/nologo /W4 /MD /wd4200 /wd4204 /wd4221 /wd4706 /wd4214 /D_CRT_SECURE_NO_WARNINGS /I SDL2/include /I pcre2 SDL2/lib/x64/SDL2main.lib SDL2/lib/x64/SDL2.lib pcre2-32-static.lib
rc /nologo ted.rc
if _%1 == _ (
- cl main.c stb_image.c stb_truetype.c ted.res /DDEBUG /DEBUG /Zi %C_FLAGS% /Fe:ted
+ cl buffer.c build.c colors.c command.c^
+ config.c find.c gl.c ide-autocomplete.c^
+ ide-definitions.c ide-highlights.c ide-hover.c^
+ ide-signature-help.c ide-usages.c lsp.c lsp-json.c^
+ lsp-parse.c lsp-write.c main.c menu.c node.c^
+ os-win.c session.c stb_image.c stb_truetype.c^
+ syntax.c tags.c ted.c text.c ui.c util.c ted.res^
+ /DDEBUG /DEBUG /Zi %C_FLAGS% /Fe:ted
)
if _%1 == _release cl main.c ted.res /O2 /wd4702 %C_FLAGS% /Fe:ted
if _%1 == _release_with_debug_info cl main.c ted.res /DEBUG /Zi /O2 /wd4702 %C_FLAGS% /Fe:ted
diff --git a/util.c b/util.c
index d20077b..d1daa7d 100644
--- a/util.c
+++ b/util.c
@@ -5,6 +5,7 @@
#if _WIN32
#include <intrin.h>
#include <direct.h>
+#include <io.h>
#elif __unix__
#include <unistd.h>
#else