summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authormyang6 <myang6@hdfgroup.org>2021-10-27 17:30:40 (GMT)
committermyang6 <myang6@hdfgroup.org>2021-10-27 17:30:40 (GMT)
commitf3bca0e22f1ae6dded606e170bfb5699fe8f42a2 (patch)
treee58758f5425011fc4f7449bd8dee1fe57e75c01c /src
parent060d02023bce2f2922a7c548636d628e396f70e6 (diff)
downloadhdf5-f3bca0e22f1ae6dded606e170bfb5699fe8f42a2.zip
hdf5-f3bca0e22f1ae6dded606e170bfb5699fe8f42a2.tar.gz
hdf5-f3bca0e22f1ae6dded606e170bfb5699fe8f42a2.tar.bz2
Add comments, descriptions for the VFD log feature.
Diffstat (limited to 'src')
-rw-r--r--src/H5FDvfd_swmr_private.h28
-rw-r--r--src/H5Fint.c4
-rw-r--r--src/H5Fpkg.h69
-rw-r--r--src/H5Fvfd_swmr.c103
4 files changed, 127 insertions, 77 deletions
diff --git a/src/H5FDvfd_swmr_private.h b/src/H5FDvfd_swmr_private.h
index 9e56d00..a2c29cd 100644
--- a/src/H5FDvfd_swmr_private.h
+++ b/src/H5FDvfd_swmr_private.h
@@ -89,34 +89,8 @@ H5_DLL herr_t H5F_dump_eot_queue(void);
/***************************************/
/* VFD SWMR Helper macros to calcuate the elapsed time */
-/* The total time in seconds */
+/* The total time is in seconds */
#define TOTAL_TIME_PASSED(X, Y) \
((double)((Y.tv_sec - X.tv_sec) * 1000000000 + (Y.tv_nsec - X.tv_nsec))) / 1000000000.0
-/*
-#define TIME_PASSED_MIN(X) (unsigned int)(X / 60000)
-#define TIME_PASSED_SEC(X, Y) (unsigned int)((X - Y * 60000) / 1000)
-#define TIME_PASSED_MSEC(X, Y, Z) (unsigned int)(X - Y * 60000 - Z * 1000)
-*/
-
-/* Add more tags */
-/* The VFD SMWR Log tags. Note this array of string is used to generate the
- * entry tag by the log reporting function H5F_POST_VFD_SWMR_LOG_ENTRY.
- * If the entry code is 0, H5Fvfd_swmr_log_tags[0] is used to report the entry tag.
- * H5F_POST_VFD_SWMR_LOG_ENTRY(f, 3, log_msg) will put the log_msg attached to
- * the entry tag "EOT_PROCESSING_TIME".
- */
-#if 0
-/* clang-format off */
-/* The entry code number is listed in the comment for convenience. */
-static const char *H5Fvfd_swmr_log_tags[] = {
- "FILE_OPEN", /* 0 */
- "FILE_CLOSE", /* 1 */
- "EOT_TRIGGER_TIME", /* 2 */
- "EOT_PROCESSING_TIME", /* 3 */
- "EOT_META_FILE_INDEX" /* 4 */
- };
-/* clang-format on */
-#endif
-
#endif /* H5FDvfd_swmr_private_H */
diff --git a/src/H5Fint.c b/src/H5Fint.c
index f7a988b..6827158 100644
--- a/src/H5Fint.c
+++ b/src/H5Fint.c
@@ -2226,8 +2226,8 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
/* Success */
ret_value = file;
-#if 1 /*Kent: write to the log file when H5F_open ends. Tested, now comment out.*/
- H5F_POST_VFD_SWMR_LOG_ENTRY(file, 0, "File open ends")
+#if 1 /*Kent: write to the log file when H5F_open ends. Tested, can be commented out if necessary.*/
+ H5F_POST_VFD_SWMR_LOG_ENTRY(file, 1, "File open ends");
#endif
done:
if ((NULL == ret_value) && file) {
diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h
index 41c4b6b..2fc896a 100644
--- a/src/H5Fpkg.h
+++ b/src/H5Fpkg.h
@@ -612,29 +612,52 @@ H5_DLL htri_t H5F__same_file_test(hid_t file_id1, hid_t file_id2);
H5_DLL herr_t H5F__reparse_file_lock_variable_test(void);
#endif /* H5F_TESTING */
-/* VFD SMWR log reporting macros */
-/* The first argument is the HDF5 file pointer(H5F_t *). Its value needs to be checked
- * to avoid a failure caused by "Low-Level File I/O " in the testhdf5 which involves
- * the test of a non-existing HDF5 file. */
-#define H5F_POST_VFD_SWMR_LOG_ENTRY(fp, entry_type_code, body) \
- if (fp != NULL) \
- if (fp->shared != NULL) \
- if (fp->shared->vfd_swmr_log_on == TRUE) \
- H5F_post_vfd_swmr_log_entry(fp, entry_type_code, body);
-
-H5_DLL herr_t H5F_post_vfd_swmr_log_entry(H5F_t *f, int entry_type_code, char *body);
-/* clang-format off */
-/* The entry code number is listed in the comment for convenience. */
-
-#if 0
-static const char *H5Fvfd_swmr_log_tags[] = {
- "FILE_OPEN", /* 0 */
- "FILE_CLOSE", /* 1 */
- "EOT_TRIGGER_TIME", /* 2 */
- "EOT_PROCESSING_TIME", /* 3 */
- "EOT_META_FILE_INDEX" /* 4 */
- };
+/* VFD SMWR LOG REPORTING MACROS */
+
+/* H5F_POST_VFD_SWMR_LOG_ENTRY is the macro that needs to be used by the developers.
+ * It calls an internal reporting function H5F_post_vfd_swmr_log_entry() that receives
+ * the log entry_type_code, which generates the log tag, and the message log_info, which
+ * the library developer wants to save into the log file.
+ *
+ * The macro H5F_POST_VFD_SWMR_LOG_ENTRY_RELEASE(f, c, number_entry_production, m) is
+ * called by H5F_POST_VFD_SWMR_LOG_ENTRY when the HDF5 library is built with the
+ * production mode. Number_entry_production will control the number of entry tags that
+ * applications can receive. Currently this number is set to 1 and is subject to change
+ * when more tags are useful to be present to applications.
+ *
+ * The first argument of the macro is the HDF5 file pointer(H5F_t *).
+ * Its value needs to be checked to avoid a failure caused by "Low-Level File I/O "
+ * in the testhdf5 program, which involves the test of a non-existing HDF5 file.
+ */
+
+H5_DLL void H5F_post_vfd_swmr_log_entry(H5F_t *f, int entry_type_code, char *log_info);
+
+#define H5F_POST_VFD_SWMR_LOG_ENTRY_INTERNAL(fp, entry_type_code, log_info) \
+ do { \
+ if (fp != NULL) { \
+ if (fp->shared != NULL) { \
+ if (fp->shared->vfd_swmr_log_on == TRUE) { \
+ H5F_post_vfd_swmr_log_entry(fp, entry_type_code, log_info); \
+ } \
+ } \
+ } \
+ } while (0)
+
+#define H5F_POST_VFD_SWMR_LOG_ENTRY_RELEASE(fp, entry_type_code, max_code, log_info) \
+ do { \
+ if (entry_type_code <max_code) { \
+ H5F_POST_VFD_SWMR_LOG_ENTRY_INTERNAL(fp,entry_type_code,log_info); \
+ } \
+ } while (0)
+
+/* Note: change H5F_POST_VFD_SWMR_LOG_ENTRY_RELEASE(f, c, 1, m) on the following lines to
+ * H5F_POST_VFD_SWMR_LOG_ENTRY_RELEASE(f, c, your_number_entry_production, m)
+ * as necessary.
+ */
+#ifndef NDEBUG
+#define H5F_POST_VFD_SWMR_LOG_ENTRY(f, c, m) H5F_POST_VFD_SWMR_LOG_ENTRY_INTERNAL(f, c, m)
+#else
+#define H5F_POST_VFD_SWMR_LOG_ENTRY(f, c, m) H5F_POST_VFD_SWMR_LOG_ENTRY_RELEASE(f, c, 1, m)
#endif
-/* clang-format on */
#endif /* H5Fpkg_H */
diff --git a/src/H5Fvfd_swmr.c b/src/H5Fvfd_swmr.c
index 5119b38..3f24352 100644
--- a/src/H5Fvfd_swmr.c
+++ b/src/H5Fvfd_swmr.c
@@ -54,17 +54,38 @@
#define nanosecs_per_second 1000000000 /* nanoseconds per second */
#define nanosecs_per_tenth_sec 100000000 /* nanoseconds per 0.1 second */
+/* Declare an array of string to identify the VFD SMWR Log tags.
+ * Note this array is used to generate the entry tag by the log reporting macro
+ * H5F_POST_VFD_SWMR_LOG_ENTRY.
+ *
+ * The following is the first version. Developers can add/modify the tags as necessary.
+ *
+ * If the entry code is 0, H5Fvfd_swmr_log_tags[0] is used to report the entry tag.
+ * H5F_POST_VFD_SWMR_LOG_ENTRY(f, 0, log_msg) will put the log_msg attached to
+ * the entry tag "EOT_PROCESSING_TIME".
+ * The entry code number is listed in the comment for convenience.
+ * Currently for the production mode, only the "EOT_PROCESSING_TIME" is present.
+ */
+
/* clang-format off */
-/* The entry code number is listed in the comment for convenience. */
static const char *H5Fvfd_swmr_log_tags[] = {
- "FILE_OPEN", /* 0 */
- "FILE_CLOSE", /* 1 */
- "EOT_TRIGGER_TIME", /* 2 */
- "EOT_PROCESSING_TIME", /* 3 */
+ "EOT_PROCESSING_TIME", /* 0 */
+ "FILE_OPEN", /* 1 */
+ "FILE_CLOSE", /* 2 */
+ "EOT_TRIGGER_TIME", /* 3 */
"EOT_META_FILE_INDEX" /* 4 */
};
/* clang-format on */
+/* This string defines the format of the VFD SWMR log file.
+ * The current maximum length of entry tag string is set to 26.
+ * One can enlarge or reduce this number as necessary.
+ * For example, to enlarge the maximum length of entry tag string to 30,
+ * Just change 26 to 30 in the following line, like
+ * const char *log_fmt_str="%-30s: %.3lf s: %s\n";
+ */
+const char *log_fmt_str="%-26s: %.3lf s: %s\n";
+
/********************/
/* Local Prototypes */
/********************/
@@ -329,14 +350,16 @@ H5F_vfd_swmr_close_or_flush(H5F_t *f, hbool_t closing)
if (H5F__vfd_swmr_update_end_of_tick_and_tick_num(shared, TRUE) < 0)
HDONE_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to update end of tick");
}
-#if 1 /*Kent */
- H5F_POST_VFD_SWMR_LOG_ENTRY(f, 1, "VFD SWMR File close or flush ends")
+#if 1 /*Kent Save the end of close or flush info. to the log file, subject to comment out. */
+ H5F_POST_VFD_SWMR_LOG_ENTRY(f, 2, "VFD SWMR File close or flush ends");
#endif
done:
+ /* Kent: close the VFD SWMR log file if it is turned on */
if (shared->vfd_swmr_log_on) {
HDfclose(shared->vfd_swmr_log_file_ptr);
}
+ /* Kent */
FUNC_LEAVE_NOAPI(ret_value)
}
@@ -782,10 +805,14 @@ H5F_vfd_swmr_writer_end_of_tick(H5F_t *f, hbool_t wait_for_reader)
HDassert(shared->page_buf);
HDassert(shared->vfd_swmr_writer);
- if (f->shared->vfd_swmr_log_on == true) {
+ /* Kent */
+ /* Obtain the starting time for the logging info: the processing time of this function. */
+ if (shared->vfd_swmr_log_on == true) {
if (HDclock_gettime(CLOCK_MONOTONIC, &start_time) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get time via clock_gettime");
}
+ /* Kent */
+
if (!vfd_swmr_writer_may_increase_tick_to(shared->tick_num + 1, wait_for_reader))
goto update_eot;
@@ -908,15 +935,17 @@ update_eot:
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to insert entry into the EOT queue")
done:
- if (f->shared->vfd_swmr_log_on == true) {
+ /* Kent: Calcuate the processing time and write the time info to the log file */
+ if (shared->vfd_swmr_log_on == true) {
if (HDclock_gettime(CLOCK_MONOTONIC, &end_time) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get time via clock_gettime");
log_msg = HDmalloc(48);
temp_time = (unsigned int)(TOTAL_TIME_PASSED(start_time, end_time) * 1000);
HDsprintf(log_msg, "Writer time is %u milliseconds", temp_time);
- H5F_POST_VFD_SWMR_LOG_ENTRY(f, 3, log_msg)
+ H5F_POST_VFD_SWMR_LOG_ENTRY(f, 0, log_msg);
HDfree(log_msg);
}
+ /* Kent */
FUNC_LEAVE_NOAPI(ret_value)
}
@@ -1921,22 +1950,46 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
}
-/* Log reporting function, called by macro H5F_POST_VFD_SWMR_LOG_ENTRY */
-herr_t
-H5F_post_vfd_swmr_log_entry(H5F_t *f, int entry_type_code, char *body)
+/*-------------------------------------------------------------------------
+ *
+ * Function: H5F_post_vfd_swmr_log_entry
+ *
+ * Purpose: Write the log information to the log file.
+ *
+ * Parameters:
+ * H5F_t *f IN: HDF5 file pointer
+ * int entry_type_code IN: The entry type code to identify the
+ * log entry tag.
+ * char *log_info IN: The information to be stored in the
+ * log file.
+ * Return: None
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+H5F_post_vfd_swmr_log_entry(H5F_t *f, int entry_type_code, char *log_info)
{
- herr_t ret_value = SUCCEED;
double temp_time;
struct timespec current_time;
- FUNC_ENTER_NOAPI(FAIL)
- if (HDclock_gettime(CLOCK_MONOTONIC, &current_time) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get time via clock_gettime");
- temp_time = TOTAL_TIME_PASSED(f->shared->vfd_swmr_log_start_time, current_time);
-
- /* TODO: add a check for the range of entry_type_code to separate debug mode from the production mode.*/
- HDfprintf(f->shared->vfd_swmr_log_file_ptr, "%-25s: %.3lf s: %s\n", H5Fvfd_swmr_log_tags[entry_type_code],
- temp_time, body);
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
+ char *gettime_error;
+
+ /* Obtain the current time.
+ If failed, write an error message to the log file.
+ else calcluate the elapsed time in seconds since the log file
+ was created and wirte the time to the log file. */
+ if (HDclock_gettime(CLOCK_MONOTONIC, &current_time) < 0) {
+ gettime_error = HDmalloc(14);
+ HDsprintf(gettime_error, "gettime_error");
+ HDfprintf(f->shared->vfd_swmr_log_file_ptr,
+ "%-26s: %s\n", H5Fvfd_swmr_log_tags[entry_type_code],
+ gettime_error);
+ HDfree(gettime_error);
+ }
+ else {
+ temp_time = TOTAL_TIME_PASSED(f->shared->vfd_swmr_log_start_time, current_time);
+ HDfprintf(f->shared->vfd_swmr_log_file_ptr,log_fmt_str,
+ H5Fvfd_swmr_log_tags[entry_type_code], temp_time, log_info);
+ }
+ return;
}