aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Gavin <danielgavin5@hotmail.com>2022-07-10 00:07:48 +0200
committerDaniel Gavin <danielgavin5@hotmail.com>2022-07-10 00:07:48 +0200
commit96266332bfc5cef2bd06aa88f231999322e0513c (patch)
treeb6009e69d1ad79d11985d981f7ed790256e1435f
parentec8bb7ab5a7aaabd1d8cbd159639b9f29ad4b8e6 (diff)
Fix memory leak
-rw-r--r--src/main.odin46
-rw-r--r--src/server/build.odin9
-rw-r--r--src/server/completion.odin6
-rw-r--r--src/server/documents.odin6
-rw-r--r--src/server/indexer.odin2
5 files changed, 33 insertions, 36 deletions
diff --git a/src/main.odin b/src/main.odin
index b68f90d..6ef4778 100644
--- a/src/main.odin
+++ b/src/main.odin
@@ -31,9 +31,6 @@ os_write :: proc(handle: rawptr, data: []byte) -> (int, int) {
//Note(Daniel, Should look into handling errors without crashing from parsing)
-verbose_logger: log.Logger
-file_logger: log.Logger
-file_logger_init: bool
request_thread: ^thread.Thread
run :: proc(reader: ^server.Reader, writer: ^server.Writer) {
@@ -48,27 +45,20 @@ run :: proc(reader: ^server.Reader, writer: ^server.Writer) {
writer = writer,
}
+ /*
+ tracking_allocator: mem.Tracking_Allocator
+ mem.tracking_allocator_init(&tracking_allocator, context.allocator)
+ context.allocator = mem.tracking_allocator(&tracking_allocator)
+ */
+
server.requests = make([dynamic]server.Request, context.allocator)
server.deletings = make([dynamic]server.Request, context.allocator)
request_thread = thread.create_and_start_with_data(cast(rawptr)&request_thread_data, server.thread_request_main)
server.setup_index();
-
- for common.config.running {
- if common.config.file_log {
- if !file_logger_init {
- if fh, err := os.open("log.txt"); err == 0 {
- file_logger = log.create_file_logger(fh, log.Level.Info)
- }
- }
- context.logger = file_logger
- } else if common.config.verbose {
- context.logger = verbose_logger
- } else {
- context.logger = log.Logger {nil, nil, log.Level.Debug, nil}
- }
+ for common.config.running {
server.consume_requests(&common.config, writer)
}
@@ -83,6 +73,12 @@ run :: proc(reader: ^server.Reader, writer: ^server.Writer) {
server.document_storage_shutdown()
server.free_index()
+
+ /*
+ for key, value in tracking_allocator.allocation_map {
+ log.errorf("%v: Leaked %v bytes\n", value.location, value.size)
+ }
+ */
}
end :: proc() {
@@ -93,11 +89,17 @@ main :: proc() {
reader := server.make_reader(os_read, cast(rawptr)&os.stdin)
writer := server.make_writer(os_write, cast(rawptr)&os.stdout)
- verbose_logger := server.create_lsp_logger(&writer, log.Level.Error)
-
- context.logger = verbose_logger
-
- init_global_temporary_allocator(mem.Megabyte*100)
+ context.logger = server.create_lsp_logger(&writer, log.Level.Error)
+ /*
+ fh, err := os.open("log.txt", os.O_RDWR|os.O_CREATE)
+
+ if err != os.ERROR_NONE {
+ return
+ }
+
+ context.logger = log.create_file_logger(fh, log.Level.Info)
+ */
+ init_global_temporary_allocator(mem.Megabyte*10)
run(&reader, &writer)
}
diff --git a/src/server/build.odin b/src/server/build.odin
index 7fd26d1..741cf6b 100644
--- a/src/server/build.odin
+++ b/src/server/build.odin
@@ -49,8 +49,8 @@ try_build_package :: proc(pkg_name: string) {
temp_arena: mem.Arena
- mem.init_arena(&temp_arena, make([]byte, mem.Megabyte*25))
-
+ mem.init_arena(&temp_arena, make([]byte, mem.Megabyte*25, runtime.default_allocator()))
+
{
context.allocator = mem.arena_allocator(&temp_arena)
@@ -89,6 +89,7 @@ try_build_package :: proc(pkg_name: string) {
if !ok {
log.errorf("error in parse file for indexing %v", fullpath)
+ continue
}
uri := common.create_uri(fullpath, context.allocator)
@@ -112,7 +113,7 @@ setup_index :: proc() {
indexer.index = make_memory_index(symbol_collection)
dir_exe := path.dir(os.args[0])
-
+
try_build_package(path.join(dir_exe, "builtin"))
}
@@ -126,4 +127,4 @@ log_error_handler :: proc(pos: tokenizer.Pos, msg: string, args: ..any) {
log_warning_handler :: proc(pos: tokenizer.Pos, msg: string, args: ..any) {
log.warnf("%v %v %v", pos, msg, args)
-}
+} \ No newline at end of file
diff --git a/src/server/completion.odin b/src/server/completion.odin
index 786db8d..f64e2a8 100644
--- a/src/server/completion.odin
+++ b/src/server/completion.odin
@@ -79,9 +79,7 @@ get_completion_list :: proc(document: ^Document, position: common.Position, comp
}
if position_context.switch_type_stmt != nil && position_context.case_clause != nil {
-
if assign, ok := position_context.switch_type_stmt.tag.derived.(^ast.Assign_Stmt); ok && assign.rhs != nil && len(assign.rhs) == 1 {
-
ast_context.use_globals = true
ast_context.use_locals = true
@@ -163,7 +161,6 @@ get_directive_completion :: proc(ast_context: ^AstContext, position_context: ^Do
}
get_comp_lit_completion :: proc(ast_context: ^AstContext, position_context: ^DocumentPositionContext, list: ^CompletionList) {
-
items := make([dynamic]CompletionItem, context.temp_allocator)
if position_context.parent_comp_lit.type == nil {
@@ -815,7 +812,7 @@ get_identifier_completion :: proc(ast_context: ^AstContext, position_context: ^D
list.isIncomplete = true
- combined := make([dynamic]CombinedResult)
+ combined := make([dynamic]CombinedResult, context.temp_allocator)
lookup_name := ""
@@ -1062,7 +1059,6 @@ get_identifier_completion :: proc(ast_context: ^AstContext, position_context: ^D
}
get_package_completion :: proc(ast_context: ^AstContext, position_context: ^DocumentPositionContext, list: ^CompletionList) {
-
items := make([dynamic]CompletionItem, context.temp_allocator)
list.isIncomplete = false
diff --git a/src/server/documents.odin b/src/server/documents.odin
index 335fc87..9f5be37 100644
--- a/src/server/documents.odin
+++ b/src/server/documents.odin
@@ -53,6 +53,8 @@ document_storage: DocumentStorage
document_storage_shutdown :: proc() {
for k, v in document_storage.documents {
+ common.scratch_allocator_destroy(v.allocator)
+ free(v.allocator)
delete(k)
}
@@ -207,7 +209,6 @@ document_apply_changes :: proc(uri_string: string, changes: [dynamic]TextDocumen
for change in changes {
//for some reason sublime doesn't seem to care even if i tell it to do incremental sync
if range, ok := change.range.(common.Range); ok {
-
absolute_range, ok := common.get_absolute_range(range, document.text[:document.used_text])
if !ok {
@@ -245,7 +246,6 @@ document_apply_changes :: proc(uri_string: string, changes: [dynamic]TextDocumen
copy(document.text[len(lower):], middle)
}
} else {
-
document.used_text = len(change.text)
if document.used_text > len(document.text) {
@@ -384,7 +384,7 @@ parse_document :: proc(document: ^Document, config: ^common.Config) -> ([]Parser
context.allocator = common.scratch_allocator(document.allocator)
pkg := new(ast.Package)
- pkg.kind = .Normal
+ pkg.kind = .Normal
pkg.fullpath = document.fullpath
document.ast = ast.File {
diff --git a/src/server/indexer.odin b/src/server/indexer.odin
index cb24cec..581bd37 100644
--- a/src/server/indexer.odin
+++ b/src/server/indexer.odin
@@ -21,11 +21,9 @@ FuzzyResult :: struct {
lookup :: proc(name: string, pkg: string, loc := #caller_location) -> (Symbol, bool) {
if symbol, ok := memory_index_lookup(&indexer.index, name, pkg); ok {
- log.infof("lookup name: %v pkg: %v, symbol %v location %v", name, pkg, symbol, loc)
return symbol, true
}
- log.infof("lookup failed name: %v pkg: %v location %v", name, pkg, loc)
return {}, false
}