From 2044df660f193d6eb26e2e5121fb33d2f1dcc145 Mon Sep 17 00:00:00 2001 From: Nikolaus Rath Date: Mon, 10 Oct 2016 11:18:00 -0700 Subject: Fix race condition in notify_* examples The fix in commit cf4159156b was incomplete. While some false positives are caused by sleep() in the file system taking longer than expected, there was also a race condition where the file system would run before the contents are initialized properly. --- example/notify_inval_inode.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'example/notify_inval_inode.c') diff --git a/example/notify_inval_inode.c b/example/notify_inval_inode.c index 9cd7e95..1b813a0 100644 --- a/example/notify_inval_inode.c +++ b/example/notify_inval_inode.c @@ -255,19 +255,23 @@ static struct fuse_lowlevel_ops tfs_oper = { .forget = tfs_forget, }; -static void* update_fs(void *data) { - struct fuse_session *se = (struct fuse_session*) data; +static void update_fs(void) { struct tm *now; time_t t; + t = time(NULL); + now = localtime(&t); + assert(now != NULL); - while(1) { - t = time(NULL); - now = localtime(&t); - assert(now != NULL); + file_size = strftime(file_contents, MAX_STR_LEN, + "The current time is %H:%M:%S\n", now); + assert(file_size != 0); +} - file_size = strftime(file_contents, MAX_STR_LEN, - "The current time is %H:%M:%S\n", now); - assert(file_size != 0); +static void* update_fs_loop(void *data) { + struct fuse_session *se = (struct fuse_session*) data; + + while(1) { + update_fs(); if (!options.no_notify && lookup_cnt) { /* Only send notification if the kernel is aware of the inode */ @@ -318,6 +322,9 @@ int main(int argc, char *argv[]) { goto err_out1; } + /* Initial contents */ + update_fs(); + se = fuse_session_new(&args, &tfs_oper, sizeof(tfs_oper), NULL); if (se == NULL) @@ -332,7 +339,7 @@ int main(int argc, char *argv[]) { fuse_daemonize(opts.foreground); /* Start thread to update file contents */ - ret = pthread_create(&updater, NULL, update_fs, (void *)se); + ret = pthread_create(&updater, NULL, update_fs_loop, (void *)se); if (ret != 0) { fprintf(stderr, "pthread_create failed with %s\n", strerror(ret)); -- cgit v1.2.3