Opti
Bring test back Removed useless arena, making like 40% perf improv Removed shared Loc
This commit is contained in:
+1
-14
@@ -20,7 +20,6 @@ var value_buffer: [1024]u8 = undefined;
|
||||
|
||||
usingnamespace @import("parser.zig");
|
||||
|
||||
arena: *std.heap.ArenaAllocator = undefined,
|
||||
allocator: Allocator = undefined,
|
||||
state: DBEngineState = .Init,
|
||||
file_engine: FileEngine = undefined,
|
||||
@@ -28,16 +27,7 @@ schema_engine: SchemaEngine = undefined,
|
||||
thread_engine: ThreadEngine = undefined,
|
||||
|
||||
pub fn init(allocator: Allocator, potential_main_path: ?[]const u8, potential_schema_path: ?[]const u8) Self {
|
||||
var self = Self{};
|
||||
|
||||
const arena = allocator.create(std.heap.ArenaAllocator) catch {
|
||||
log.err("Error when init Engine DB allocator", .{});
|
||||
self.state = .MissingAllocator;
|
||||
return self;
|
||||
};
|
||||
arena.* = std.heap.ArenaAllocator.init(allocator);
|
||||
self.arena = arena;
|
||||
self.allocator = arena.allocator();
|
||||
var self = Self{ .allocator = allocator };
|
||||
|
||||
self.thread_engine = ThreadEngine.init(self.allocator) catch {
|
||||
log.err("Error initializing thread engine", .{});
|
||||
@@ -159,7 +149,4 @@ pub fn deinit(self: *Self) void {
|
||||
self.thread_engine.deinit();
|
||||
self.schema_engine.deinit();
|
||||
self.file_engine.deinit();
|
||||
const parent_allocator = self.arena.child_allocator;
|
||||
self.arena.deinit();
|
||||
parent_allocator.destroy(self.arena);
|
||||
}
|
||||
|
||||
+2
-2
@@ -135,7 +135,7 @@ pub fn parse(self: *Self, null_term_line_str: [:0]const u8) !bool {
|
||||
.expect_path_to_db => switch (token.tag) {
|
||||
.identifier => {
|
||||
self.deinit();
|
||||
self.* = Self.init(self.arena.child_allocator, toker.getTokenSlice(token), null);
|
||||
self.* = Self.init(self.allocator, toker.getTokenSlice(token), null);
|
||||
state = .end;
|
||||
},
|
||||
else => {
|
||||
@@ -194,7 +194,7 @@ pub fn parse(self: *Self, null_term_line_str: [:0]const u8) !bool {
|
||||
.identifier => {
|
||||
const main_path = try allocator.dupe(u8, self.file_engine.path_to_ZipponDB_dir);
|
||||
self.deinit();
|
||||
self.* = Self.init(self.arena.child_allocator, main_path, toker.getTokenSlice(token));
|
||||
self.* = Self.init(self.allocator, main_path, toker.getTokenSlice(token));
|
||||
try self.file_engine.writeSchemaFile(self.schema_engine.null_terminated);
|
||||
state = .end;
|
||||
},
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
// From https://github.com/ziglang/zig/blob/master/lib/std/zig/tokenizer.zig
|
||||
const std = @import("std");
|
||||
const Loc = @import("../dataStructure/loc.zig");
|
||||
|
||||
const Loc = struct {
|
||||
start: usize,
|
||||
end: usize,
|
||||
};
|
||||
|
||||
pub const Token = struct {
|
||||
tag: Tag,
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
pub const Loc = @This();
|
||||
|
||||
start: usize,
|
||||
end: usize,
|
||||
+3
-10
@@ -20,25 +20,18 @@ pub usingnamespace @import("read.zig");
|
||||
pub usingnamespace @import("write.zig");
|
||||
pub usingnamespace @import("dump.zig");
|
||||
|
||||
arena: *std.heap.ArenaAllocator,
|
||||
allocator: std.mem.Allocator,
|
||||
path_to_ZipponDB_dir: []const u8,
|
||||
thread_pool: *Pool, // same pool as the ThreadEngine
|
||||
schema_engine: SchemaEngine = undefined, // This is init after the FileEngine and I attach after. Do I need to init after tho ?
|
||||
|
||||
pub fn init(allocator: std.mem.Allocator, path: []const u8, thread_pool: *Pool) ZipponError!Self {
|
||||
const arena = allocator.create(std.heap.ArenaAllocator) catch return ZipponError.MemoryError;
|
||||
arena.* = std.heap.ArenaAllocator.init(allocator);
|
||||
return Self{
|
||||
.arena = arena,
|
||||
.allocator = arena.allocator(),
|
||||
.allocator = allocator,
|
||||
.path_to_ZipponDB_dir = std.fmt.bufPrint(&path_to_ZipponDB_dir_buffer, "{s}", .{path}) catch return ZipponError.MemoryError,
|
||||
.thread_pool = thread_pool,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn deinit(self: *Self) void {
|
||||
const parent_allocator = self.arena.child_allocator;
|
||||
self.arena.deinit();
|
||||
parent_allocator.destroy(self.arena);
|
||||
}
|
||||
// The allocator is only use to make arena when parsing and everything is deinit after parsing
|
||||
pub fn deinit(_: *Self) void {}
|
||||
|
||||
+5
-3
@@ -42,7 +42,8 @@ pub fn populateFileIndexUUIDMap(
|
||||
) ZipponError!void {
|
||||
var arena = std.heap.ArenaAllocator.init(self.allocator);
|
||||
defer arena.deinit();
|
||||
const allocator = arena.allocator();
|
||||
var safe_allocator = std.heap.ThreadSafeAllocator{ .child_allocator = arena.allocator() };
|
||||
const allocator = safe_allocator.allocator();
|
||||
|
||||
const dir = try self.printOpenDir("{s}/DATA/{s}", .{ self.path_to_ZipponDB_dir, sstruct.name }, .{});
|
||||
const to_parse = try self.allFileIndex(allocator, sstruct.name);
|
||||
@@ -106,7 +107,8 @@ pub fn populateVoidUUIDMap(
|
||||
) ZipponError!void {
|
||||
var arena = std.heap.ArenaAllocator.init(self.allocator);
|
||||
defer arena.deinit();
|
||||
const allocator = arena.allocator();
|
||||
var safe_allocator = std.heap.ThreadSafeAllocator{ .child_allocator = arena.allocator() };
|
||||
const allocator = safe_allocator.allocator();
|
||||
|
||||
const sstruct = try self.schema_engine.structName2SchemaStruct(struct_name);
|
||||
|
||||
@@ -195,7 +197,7 @@ pub fn parseEntities(
|
||||
) ZipponError![]const u8 {
|
||||
var arena = std.heap.ArenaAllocator.init(self.allocator);
|
||||
defer arena.deinit();
|
||||
var safe_allocator = std.heap.ThreadSafeAllocator{ .child_allocator = self.allocator };
|
||||
var safe_allocator = std.heap.ThreadSafeAllocator{ .child_allocator = arena.allocator() };
|
||||
const allocator = safe_allocator.allocator();
|
||||
|
||||
var buff = std.ArrayList(u8).init(entry_allocator);
|
||||
|
||||
+4
-3
@@ -71,12 +71,13 @@ pub fn updateEntities(
|
||||
struct_name: []const u8,
|
||||
filter: ?Filter,
|
||||
map: std.StringHashMap(ValueOrArray),
|
||||
writer: anytype,
|
||||
writer: anytype, // TODO: Stop using writer and use an allocator + toOwnedSlice like parseEntities
|
||||
additional_data: *AdditionalData,
|
||||
) ZipponError!void {
|
||||
var arena = std.heap.ArenaAllocator.init(self.allocator);
|
||||
defer arena.deinit();
|
||||
const allocator = arena.allocator();
|
||||
var safe_allocator = std.heap.ThreadSafeAllocator{ .child_allocator = arena.allocator() };
|
||||
const allocator = safe_allocator.allocator();
|
||||
|
||||
const sstruct = try self.schema_engine.structName2SchemaStruct(struct_name);
|
||||
|
||||
@@ -229,7 +230,7 @@ pub fn deleteEntities(
|
||||
) ZipponError!void {
|
||||
var arena = std.heap.ArenaAllocator.init(self.allocator);
|
||||
defer arena.deinit();
|
||||
var safe_allocator = std.heap.ThreadSafeAllocator{ .child_allocator = self.allocator };
|
||||
var safe_allocator = std.heap.ThreadSafeAllocator{ .child_allocator = arena.allocator() };
|
||||
const allocator = safe_allocator.allocator();
|
||||
|
||||
const sstruct = try self.schema_engine.structName2SchemaStruct(struct_name);
|
||||
|
||||
+2
-2
@@ -34,11 +34,11 @@ pub fn init(parent_allocator: Allocator, path: []const u8, file_engine: *FileEng
|
||||
const null_terminated = std.fmt.bufPrintZ(&schema_buffer, "{s}", .{buffer[0..len]}) catch return ZipponError.MemoryError;
|
||||
|
||||
var toker = Tokenizer.init(null_terminated);
|
||||
var parser = Parser.init(&toker, allocator);
|
||||
var parser = Parser.init(&toker);
|
||||
|
||||
var struct_array = std.ArrayList(SchemaStruct).init(allocator);
|
||||
errdefer struct_array.deinit();
|
||||
parser.parse(&struct_array) catch return ZipponError.SchemaNotConform;
|
||||
parser.parse(allocator, &struct_array) catch return ZipponError.SchemaNotConform;
|
||||
|
||||
log.debug("SchemaEngine init with {d} SchemaStruct.", .{struct_array.items.len});
|
||||
|
||||
|
||||
+10
-16
@@ -6,7 +6,6 @@ const DataType = @import("dtype").DataType;
|
||||
const UUID = @import("dtype").UUID;
|
||||
const Toker = @import("tokenizer.zig").Tokenizer;
|
||||
const Token = @import("tokenizer.zig").Token;
|
||||
const Loc = @import("../dataStructure/loc.zig");
|
||||
const send = @import("../utils.zig").send;
|
||||
const printError = @import("../utils.zig").printError;
|
||||
|
||||
@@ -29,27 +28,23 @@ const State = enum {
|
||||
pub const Parser = @This();
|
||||
|
||||
toker: *Toker,
|
||||
allocator: Allocator,
|
||||
|
||||
pub fn init(toker: *Toker, allocator: Allocator) Parser {
|
||||
return .{
|
||||
.allocator = allocator,
|
||||
.toker = toker,
|
||||
};
|
||||
pub fn init(toker: *Toker) Parser {
|
||||
return .{ .toker = toker };
|
||||
}
|
||||
|
||||
pub fn parse(self: *Parser, struct_array: *std.ArrayList(SchemaStruct)) !void {
|
||||
pub fn parse(self: *Parser, allocator: Allocator, struct_array: *std.ArrayList(SchemaStruct)) !void {
|
||||
var state: State = .expect_struct_name_OR_end;
|
||||
var keep_next = false;
|
||||
|
||||
var member_token: Token = undefined;
|
||||
|
||||
var name: []const u8 = undefined;
|
||||
var member_list = std.ArrayList([]const u8).init(self.allocator);
|
||||
var member_list = std.ArrayList([]const u8).init(allocator);
|
||||
defer member_list.deinit();
|
||||
var type_list = std.ArrayList(DataType).init(self.allocator);
|
||||
var type_list = std.ArrayList(DataType).init(allocator);
|
||||
defer type_list.deinit();
|
||||
var links = std.StringHashMap([]const u8).init(self.allocator);
|
||||
var links = std.StringHashMap([]const u8).init(allocator);
|
||||
defer links.deinit();
|
||||
|
||||
var token = self.toker.next();
|
||||
@@ -105,18 +100,17 @@ pub fn parse(self: *Parser, struct_array: *std.ArrayList(SchemaStruct)) !void {
|
||||
|
||||
.add_struct => {
|
||||
struct_array.append(try SchemaStruct.init(
|
||||
struct_array.allocator,
|
||||
allocator,
|
||||
name,
|
||||
member_list.toOwnedSlice() catch return ZipponError.MemoryError,
|
||||
type_list.toOwnedSlice() catch return ZipponError.MemoryError,
|
||||
try links.clone(),
|
||||
)) catch return ZipponError.MemoryError;
|
||||
|
||||
links.deinit();
|
||||
links = std.StringHashMap([]const u8).init(self.allocator);
|
||||
links.clearRetainingCapacity();
|
||||
|
||||
member_list = std.ArrayList([]const u8).init(self.allocator);
|
||||
type_list = std.ArrayList(DataType).init(self.allocator);
|
||||
member_list = std.ArrayList([]const u8).init(allocator);
|
||||
type_list = std.ArrayList(DataType).init(allocator);
|
||||
|
||||
state = .expect_struct_name_OR_end;
|
||||
keep_next = true;
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
// From https://github.com/ziglang/zig/blob/master/lib/std/zig/tokenizer.zig
|
||||
const std = @import("std");
|
||||
const Loc = @import("../dataStructure/loc.zig");
|
||||
|
||||
const Loc = struct {
|
||||
start: usize,
|
||||
end: usize,
|
||||
};
|
||||
|
||||
pub const Token = struct {
|
||||
tag: Tag,
|
||||
|
||||
@@ -39,3 +39,12 @@ pub fn deinit(self: *ThreadEngine) void {
|
||||
parent_allocator.destroy(self.thread_arena);
|
||||
parent_allocator.destroy(self.thread_pool);
|
||||
}
|
||||
|
||||
// Not tested, for later when config is runtime
|
||||
pub fn setCpuCore(self: *ThreadEngine, cpu_core: usize) void {
|
||||
self.thread_pool.deinit();
|
||||
self.thread_pool.init(std.Thread.Pool.Options{
|
||||
.allocator = self.thread_arena.allocator(),
|
||||
.n_jobs = cpu_core,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
// From https://github.com/ziglang/zig/blob/master/lib/std/zig/tokenizer.zig
|
||||
const std = @import("std");
|
||||
const Loc = @import("../dataStructure/loc.zig");
|
||||
|
||||
const Loc = struct {
|
||||
start: usize,
|
||||
end: usize,
|
||||
};
|
||||
|
||||
pub const Token = struct {
|
||||
tag: Tag,
|
||||
|
||||
Reference in New Issue
Block a user