diff --git a/src/tests/Makefile b/src/tests/Makefile
index dec1334..e2152f9 100644
--- a/src/tests/Makefile
+++ b/src/tests/Makefile
@@ -9,7 +9,7 @@ ALL_PRGS = test_allocator test_skiplist test_multi_skiplist test_mblock test_blo
test_logger test_skiplist_set test_crc32 test_thourands_seperator test_sched_thread \
test_json_parser test_pthread_lock test_uniq_skiplist test_split_string \
test_server_id_func test_pipe test_atomic test_file_write_hole test_file_lock \
- test_thread_pool
+ test_thread_pool test_data_visible
all: $(ALL_PRGS)
.c:
diff --git a/src/tests/test_data_visible.c b/src/tests/test_data_visible.c
new file mode 100644
index 0000000..5a0f408
--- /dev/null
+++ b/src/tests/test_data_visible.c
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2020 YuQing <384681@qq.com>
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the Lesser GNU General Public License, version 3
+ * or later ("LGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the Lesser GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "fastcommon/logger.h"
+#include "fastcommon/fc_queue.h"
+#include "fastcommon/shared_func.h"
+#include "fastcommon/pthread_func.h"
+
+typedef struct fs_api_slice_entry {
+ int data;
+ volatile int v;
+ struct fs_api_slice_entry *next;
+} FSAPISliceEntry;
+
+static bool continue_flag = true;
+static struct fast_mblock_man allocator;
+static struct fc_queue queue;
+
+static void *thread_func(void *arg)
+{
+ FSAPISliceEntry *slice;
+ int value;
+
+ printf("file: "__FILE__", line: %d, "
+ "thread enter ...\n", __LINE__);
+ while (continue_flag) {
+ slice = (FSAPISliceEntry *)fc_queue_pop(&queue);
+ if (slice != NULL) {
+ value = __sync_fetch_and_add(&slice->v, 0);
+ if (slice->data != value) {
+ printf("data: %d != value: %d\n", slice->data, value);
+ }
+ fast_mblock_free_object(&allocator, slice);
+ }
+ }
+
+ printf("file: "__FILE__", line: %d, "
+ "thread done! \n", __LINE__);
+ return NULL;
+}
+
+static void sigQuitHandler(int sig)
+{
+ if (continue_flag) {
+ continue_flag = false;
+ printf("file: "__FILE__", line: %d, "
+ "catch signal %d, program exiting...\n",
+ __LINE__, sig);
+ }
+}
+
+static void sigHupHandler(int sig)
+{
+ printf("file: "__FILE__", line: %d, "
+ "catch signal %d\n", __LINE__, sig);
+}
+
+static int setup_signal_handler()
+{
+ struct sigaction act;
+ memset(&act, 0, sizeof(act));
+ sigemptyset(&act.sa_mask);
+
+ signal(SIGHUP, sigHupHandler);
+
+ /*
+ act.sa_handler = sigHupHandler;
+ if(sigaction(SIGHUP, &act, NULL) < 0) {
+ fprintf(stderr, "file: "__FILE__", line: %d, "
+ "call sigaction fail, errno: %d, error info: %s\n",
+ __LINE__, errno, strerror(errno));
+ return errno;
+ }
+ */
+
+ act.sa_handler = sigQuitHandler;
+ if(sigaction(SIGINT, &act, NULL) < 0 ||
+ sigaction(SIGTERM, &act, NULL) < 0 ||
+ sigaction(SIGQUIT, &act, NULL) < 0)
+ {
+ fprintf(stderr, "file: "__FILE__", line: %d, "
+ "call sigaction fail, errno: %d, error info: %s\n",
+ __LINE__, errno, strerror(errno));
+ return errno;
+ }
+
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ int result;
+ int i;
+ int total;
+ pthread_t tid;
+ FSAPISliceEntry *slice;
+ pthread_mutex_t lock;
+
+ log_init();
+
+ if ((result=setup_signal_handler()) != 0) {
+ return result;
+ }
+
+ if ((result=fast_mblock_init_ex1(&allocator, "slice_entry",
+ sizeof(FSAPISliceEntry), 1024, 1024,
+ NULL, NULL, true)) != 0)
+ {
+ return result;
+ }
+ allocator.exceed_log_level = LOG_NOTHING;
+
+ if ((result=init_pthread_lock(&lock)) != 0) {
+ return result;
+ }
+
+ if ((result=fc_queue_init(&queue, (long)
+ (&((FSAPISliceEntry *)NULL)->next))) != 0)
+ {
+ return result;
+ }
+
+ if ((result=pthread_create(&tid, NULL, thread_func, NULL)) != 0) {
+ return result;
+ }
+
+ total = 0;
+ i = 0;
+ while (continue_flag && i++ < 100 * 1000 * 1000) {
+ slice = (FSAPISliceEntry *)fast_mblock_alloc_object(&allocator);
+ if (slice != NULL) {
+ slice->data = __sync_add_and_fetch(&slice->v, 1);
+ fc_queue_push(&queue, slice);
+ total++;
+ }
+ }
+
+ continue_flag = false;
+ fc_sleep_ms(1000);
+ printf("file: "__FILE__", line: %d, "
+ "total count: %d.\n", __LINE__, total);
+ return 0;
+}