Skip to content

Commit e7b7510

Browse files
committed
Free client after each init
1 parent 20d3d51 commit e7b7510

8 files changed

Lines changed: 51 additions & 6 deletions

File tree

‎benchmark/aws-sdk-cpp/task.cpp‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,7 @@ extern "C" const char *get_object(bench::ClientHandle handle,
108108
result = do_get_object(handle, bucket, key);
109109
return result.c_str();
110110
}
111+
112+
extern "C" void free_client(bench::ClientHandle handle) noexcept {
113+
delete reinterpret_cast<Aws::S3::S3Client *>(handle);
114+
}

‎benchmark/aws-sdk-go-v2/main.go‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,10 @@ func get_object(handle unsafe.Pointer, bucket *C.char, key *C.char) *C.char {
120120
return C.CString(contents)
121121
}
122122

123+
//export free_client
124+
func free_client(handle unsafe.Pointer) {
125+
h := *(*cgo.Handle)(handle)
126+
h.Delete()
127+
}
128+
123129
func main() {}

‎benchmark/aws-sdk-rust/src/lib.rs‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@ struct ClientState {
1111
}
1212

1313
fn initialize_client(access: String, secret: String, endpoint: String) -> ClientState {
14-
let runtime = tokio::runtime::Runtime::new().unwrap_or_else(|err| {
15-
eprintln!("fatal(rust): failed to create tokio runtime: {err}");
16-
std::process::exit(1);
17-
});
14+
let runtime = tokio::runtime::Builder::new_current_thread()
15+
.enable_all()
16+
.build()
17+
.unwrap_or_else(|err| {
18+
eprintln!("fatal(rust): failed to create tokio runtime: {err}");
19+
std::process::exit(1);
20+
});
1821

1922
let credentials = Credentials::from_keys(access, secret, None);
2023
let config = Config::builder()
@@ -140,3 +143,8 @@ pub unsafe extern "C" fn get_object(handle: *mut c_void, bucket: *const c_char,
140143
})
141144
.into_raw()
142145
}
146+
147+
#[unsafe(no_mangle)]
148+
pub unsafe extern "C" fn free_client(handle: *mut c_void) {
149+
drop(unsafe { Box::from_raw(handle as *mut ClientState) });
150+
}

‎benchmark/benchmark.cpp‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ static void benchmark_init_client(::benchmark::State &state, s3b::implementation
1111
const std::string secret_ = "minio_secret";
1212
const std::string endpoint_ = "127.0.0.1:9000";
1313
for (auto _ : state) {
14-
::benchmark::DoNotOptimize(impl.init_client("minio_access", "minio_secret", "127.0.0.1:9000"));
14+
auto handle = impl.init_client("minio_access", "minio_secret", "127.0.0.1:9000");
15+
::benchmark::DoNotOptimize(handle);
16+
state.PauseTiming();
17+
impl.free_client(handle);
18+
state.ResumeTiming();
1519
}
1620
s3b::clean_up();
1721
}
@@ -33,6 +37,7 @@ static void benchmark_create_bucket(::benchmark::State &state, s3b::implementati
3337
state.ResumeTiming();
3438
impl.create_bucket(handle, bucket.c_str());
3539
}
40+
3641
s3b::clean_up();
3742
}
3843

‎benchmark/implementations.h‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ struct implementation {
2626
bench::create_bucket_f *create_bucket;
2727
bench::put_object_f *put_object;
2828
bench::get_object_f *get_object;
29+
bench::free_client_f *free_client;
2930
};
3031

3132
inline implementation parse_implementation(const char *so_path) {
@@ -69,9 +70,17 @@ inline implementation parse_implementation(const char *so_path) {
6970
std::exit(1);
7071
}
7172

73+
symbol_name = "free_client";
74+
bench::free_client_f *free_client =
75+
reinterpret_cast<bench::free_client_f *>(dlsym(so_handle, symbol_name.c_str()));
76+
if (free_client == NULL) {
77+
std::println(stderr, "fatal: {} for {}", ::dlerror(), so_path);
78+
std::exit(1);
79+
}
80+
7281
return implementation{so_path, init_client("minio_access", "minio_secret", "127.0.0.1:9000"),
7382
init_client, create_bucket,
74-
put_object, get_object};
83+
put_object, get_object, free_client};
7584
}
7685

7786
inline std::array<implementation, implementations_count> parse_implementations() {

‎benchmark/s3cpp/task.cpp‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,7 @@ extern "C" const char *get_object(bench::ClientHandle handle,
7272
result = do_get_object(handle, bucket, key);
7373
return result.c_str();
7474
}
75+
76+
extern "C" void free_client(bench::ClientHandle handle) noexcept {
77+
delete reinterpret_cast<S3Client *>(handle);
78+
}

‎benchmark/tasks.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ using init_client_f = ClientHandle(const char *access, const char *secret, const
88
using create_bucket_f = void(ClientHandle client, const char *bucketName) noexcept;
99
using put_object_f = void(ClientHandle client, const char *bucket, const char* key, const char* contents) noexcept;
1010
using get_object_f = const char *(ClientHandle client, const char *bucket, const char *key) noexcept;
11+
using free_client_f = void(ClientHandle client) noexcept;
1112

1213
extern "C" {
1314
__attribute__((visibility("default"))) init_client_f init_client;
1415
__attribute__((visibility("default"))) create_bucket_f create_bucket;
1516
__attribute__((visibility("default"))) put_object_f put_object;
1617
__attribute__((visibility("default"))) get_object_f get_object;
18+
__attribute__((visibility("default"))) free_client_f free_client;
1719
}
1820

1921
} // namespace bench

‎benchmark/test.cpp‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ void test_init_client(implementation impl) {
3131
}
3232

3333

34+
void test_free_client(implementation impl) {
35+
bench::ClientHandle handle = impl.init_client("minio_access", "minio_secret", "127.0.0.1:9000");
36+
impl.free_client(handle);
37+
std::println(" OK free_client");
38+
}
39+
3440
void test_create_bucket(implementation impl, const std::string &bucket) {
3541
bench::ClientHandle handle = impl.handler;
3642
impl.create_bucket(handle, bucket.c_str());
@@ -66,6 +72,7 @@ int main() {
6672
for (const auto &impl : implementations) {
6773
std::println("{}", impl.name);
6874
s3b::test_init_client(impl);
75+
s3b::test_free_client(impl);
6976
std::string bucket = s3b::bucket_name_for(impl.name);
7077
s3b::test_create_bucket(impl, bucket);
7178
s3b::test_put_object(impl, bucket);

0 commit comments

Comments
 (0)