From 318640572f7a87bae138cd1069ae06369c5a0b70 Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Sun, 9 Feb 2025 09:26:34 +0800 Subject: [PATCH] sf_file_writer.[hc]: support write done callback --- src/sf_binlog_writer.h | 3 +++ src/sf_file_writer.c | 6 ++++++ src/sf_file_writer.h | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/src/sf_binlog_writer.h b/src/sf_binlog_writer.h index 0e09bca..478a7f5 100644 --- a/src/sf_binlog_writer.h +++ b/src/sf_binlog_writer.h @@ -247,6 +247,9 @@ int sf_binlog_writer_notify_exit(SFBinlogWriterInfo *writer); #define sf_binlog_writer_set_flags(writer, flags) \ sf_file_writer_set_flags(&(writer)->fw, flags) +#define sf_binlog_writer_set_write_done_callback(writer, callback, args) \ + sf_file_writer_set_write_done_callback(&(writer)->fw, callback, args) + #define sf_binlog_writer_get_last_version_ex(writer, log_level) \ sf_file_writer_get_last_version_ex(&(writer)->fw, log_level) diff --git a/src/sf_file_writer.c b/src/sf_file_writer.c index ad0b850..2ac47ed 100644 --- a/src/sf_file_writer.c +++ b/src/sf_file_writer.c @@ -244,6 +244,11 @@ static int do_write_to_file(SFFileWriterInfo *writer, } writer->file.size += len; + if (writer->write_done_callback.func != NULL) { + writer->write_done_callback.func(writer, + writer->write_done_callback.args); + } + return 0; } @@ -422,6 +427,7 @@ int sf_file_writer_init(SFFileWriterInfo *writer, const char *data_path, writer->last_versions.pending = 0; writer->last_versions.done = 0; writer->flags = 0; + sf_file_writer_set_write_done_callback(writer, NULL, NULL); if ((result=sf_binlog_buffer_init(&writer-> binlog_buffer, buffer_size)) != 0) { diff --git a/src/sf_file_writer.h b/src/sf_file_writer.h index 8567e24..936bbd8 100644 --- a/src/sf_file_writer.h +++ b/src/sf_file_writer.h @@ -30,6 +30,11 @@ #define SF_BINLOG_FILE_PREFIX "binlog" #define SF_BINLOG_FILE_EXT_FMT ".%06d" +struct sf_file_writer_info; + +typedef void (*sf_file_write_done_callback)( + struct sf_file_writer_info *writer, void *args); + typedef struct sf_file_writer_info { struct { const char *data_path; @@ -60,6 +65,12 @@ typedef struct sf_file_writer_info { int64_t pending; volatile int64_t done; } last_versions; + + struct { + sf_file_write_done_callback func; + void *args; + } write_done_callback; + } SFFileWriterInfo; #ifdef __cplusplus @@ -103,6 +114,14 @@ static inline void sf_file_writer_set_call_fsync( writer->cfg.call_fsync = call_fsync; } +static inline void sf_file_writer_set_write_done_callback ( + SFFileWriterInfo *writer, sf_file_write_done_callback callback, + void *args) +{ + writer->write_done_callback.func = callback; + writer->write_done_callback.args = args; +} + static inline int64_t sf_file_writer_get_last_version_ex( SFFileWriterInfo *writer, const int log_level) {