Skip to content
Draft
4 changes: 2 additions & 2 deletions Core/Generators/CPlusPlus/CPlusPlusGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,7 @@ public override ValueTask<Artifact[]> Compile(BebopSchema schema, GeneratorConfi
builder.AppendLine($" return result;");
builder.AppendLine(" }");
builder.AppendLine("");
builder.AppendLine($" static {td.Name} decode(std::vector<uint8_t> sourceBuffer) {{");
builder.AppendLine($" static {td.Name} decode(const std::vector<uint8_t>& sourceBuffer) {{");
builder.AppendLine($" return {td.Name}::decode(sourceBuffer.data(), sourceBuffer.size());");
builder.AppendLine(" }");
builder.AppendLine("");
Expand All @@ -479,7 +479,7 @@ public override ValueTask<Artifact[]> Compile(BebopSchema schema, GeneratorConfi
builder.AppendLine($" return {td.Name}::decodeInto(reader, target);");
builder.AppendLine(" }");
builder.AppendLine("");
builder.AppendLine($" static size_t decodeInto(std::vector<uint8_t> sourceBuffer, {td.Name}& target) {{");
builder.AppendLine($" static size_t decodeInto(const std::vector<uint8_t>& sourceBuffer, {td.Name}& target) {{");
builder.AppendLine($" return {td.Name}::decodeInto(sourceBuffer.data(), sourceBuffer.size(), target);");
builder.AppendLine(" }");
builder.AppendLine("");
Expand Down
28 changes: 28 additions & 0 deletions Laboratory/C++/cmake/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
cmake_minimum_required(VERSION 3.20)
set(RUNTIME_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../Runtime/C++/src")
set(GEN_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../gen")
project(sandbox LANGUAGES CXX)

add_custom_command(
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.."
COMMAND dotnet run --project ../../Compiler --trace --include "../Schemas/Valid/jazz.bop" build --generator "cpp:gen/jazz.hpp"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../../Schemas/Valid/jazz.bop"
OUTPUT "${GEN_SOURCE_DIR}/bebop.hpp" "${GEN_SOURCE_DIR}/jazz.hpp"
COMMENT "Compiling jazz.bop"
)
add_custom_target(bebopc_jazz DEPENDS
"${GEN_SOURCE_DIR}/bebop.hpp"
"${GEN_SOURCE_DIR}/jazz.hpp"
)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(sandbox
"${GEN_SOURCE_DIR}/bebop.hpp"
"${GEN_SOURCE_DIR}/jazz.hpp"
"${GEN_SOURCE_DIR}/../test/jazz.cpp"
)
target_include_directories(sandbox PRIVATE ${RUNTIME_SOURCE_DIR})
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT sandbox)
add_dependencies(sandbox bebopc_jazz)
5 changes: 5 additions & 0 deletions Laboratory/C/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.vs
gen
cmake/build
*.bak
*.lnk
31 changes: 31 additions & 0 deletions Laboratory/C/cmake/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
cmake_minimum_required(VERSION 3.20)
set(RUNTIME_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../Runtime/C/src")
set(GEN_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../gen")
project(sandbox LANGUAGES C)

add_custom_command(
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.."
COMMAND dotnet run --project ../../Compiler --trace --include "../Schemas/Valid/jazz.bop" build --generator "c:gen/jazz.c"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../../Schemas/Valid/jazz.bop"
OUTPUT "${GEN_SOURCE_DIR}/bebop.h" "${GEN_SOURCE_DIR}/bebop.c" "${GEN_SOURCE_DIR}/jazz.h" "${GEN_SOURCE_DIR}/jazz.c"
COMMENT "Compiling jazz.bop"
)
add_custom_target(bebopc_jazz DEPENDS "${GEN_SOURCE_DIR}/bebop.h" "${GEN_SOURCE_DIR}/bebop.c" "${GEN_SOURCE_DIR}/jazz.h" "${GEN_SOURCE_DIR}/jazz.c")

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)

# NOTE: We could have checked for __STDC_NO_ATOMICS__, and then also this might be not required if we were to build with BEBOP_SINGLE_THREADED
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /experimental:c11atomics")

add_executable(sandbox
"${GEN_SOURCE_DIR}/bebop.h"
"${GEN_SOURCE_DIR}/bebop.c"
"${GEN_SOURCE_DIR}/jazz.h"
"${GEN_SOURCE_DIR}/jazz.c"
#sandbox.c
"${GEN_SOURCE_DIR}/../test/jazz_bench.c"
)
target_include_directories(sandbox PRIVATE ${RUNTIME_SOURCE_DIR})
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT sandbox)
add_dependencies(sandbox bebopc_jazz)
6 changes: 6 additions & 0 deletions Laboratory/C/cmake/sandbox.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#include "bebop.h"

int main()
{
return 0;
}
27 changes: 25 additions & 2 deletions Laboratory/C/test/jazz_bench.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
#include <string.h>
#include <assert.h>

#if defined(WIN32)
#include <windows.h>
#endif

typedef struct
{
double encode_time_ms;
Expand All @@ -20,7 +24,20 @@ typedef struct
static double get_time_ms(void)
{
struct timespec ts;
#if defined(WIN32)
static LARGE_INTEGER frequency;
static bool frequency_has_value = false;
if (!frequency_has_value) {
QueryPerformanceFrequency(&frequency);
frequency_has_value = true;
}
LARGE_INTEGER count;
QueryPerformanceCounter(&count);
ts.tv_sec = count.QuadPart / frequency.QuadPart;
ts.tv_nsec = (long)((count.QuadPart % frequency.QuadPart) * 1e9 / frequency.QuadPart);
#else
clock_gettime(CLOCK_MONOTONIC, &ts);
#endif
return ts.tv_sec * 1000.0 + ts.tv_nsec / 1000000.0;
}

Expand Down Expand Up @@ -291,16 +308,20 @@ static benchmark_result_t benchmark_decoding(bebop_context_t *context, size_t it
return result;
}

uint8_t* local_template_encoded = malloc(template_size);
assert(local_template_encoded);
memcpy(local_template_encoded, template_encoded, template_size);

result.encoded_size_bytes = template_size;
bebop_context_reset(context);
bebop_context_reset(context); // invalidates template_encoded data

double start_time = get_time_ms();
size_t total_bytes = 0;

for (size_t i = 0; i < iterations; i++)
{
library_t decoded_lib;
if (decode_library(template_encoded, template_size, &decoded_lib, context))
if (decode_library(local_template_encoded, template_size, &decoded_lib, context))
{
total_bytes += template_size;
is_valid(&decoded_lib);
Expand All @@ -310,6 +331,8 @@ static benchmark_result_t benchmark_decoding(bebop_context_t *context, size_t it

double end_time = get_time_ms();

free(local_template_encoded);

result.decode_time_ms = end_time - start_time;
result.throughput_mb_per_sec = (total_bytes / 1024.0 / 1024.0) / (result.decode_time_ms / 1000.0);

Expand Down
10 changes: 4 additions & 6 deletions Runtime/C/src/bebop.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,12 @@ static bebop_arena_block_t *arena_allocate_block(const bebop_arena_t *arena,
size_t capacity = arena->options.initial_block_size;
size_t required = align_size(min_size, BEBOP_ARENA_DEFAULT_ALIGNMENT);

if (capacity < required) {
if (required > arena->options.max_block_size)
return NULL;
if (capacity < required)
capacity = required;
}

if (capacity > arena->options.max_block_size &&
required <= arena->options.max_block_size) {
if (capacity > arena->options.max_block_size)
capacity = arena->options.max_block_size;
}

size_t total_size = sizeof(bebop_arena_block_t) + capacity;

Expand Down