diff --git a/tests/sys/fs/fusefs/mockfs.hh b/tests/sys/fs/fusefs/mockfs.hh --- a/tests/sys/fs/fusefs/mockfs.hh +++ b/tests/sys/fs/fusefs/mockfs.hh @@ -388,6 +388,9 @@ /* Process FUSE requests endlessly */ void loop(); + /* Begin processing requests from the kernel */ + void start_service(); + /* * Send an asynchronous notification to invalidate a directory entry. * Similar to libfuse's fuse_lowlevel_notify_inval_entry diff --git a/tests/sys/fs/fusefs/mockfs.cc b/tests/sys/fs/fusefs/mockfs.cc --- a/tests/sys/fs/fusefs/mockfs.cc +++ b/tests/sys/fs/fusefs/mockfs.cc @@ -550,9 +550,8 @@ if (0 != sigaction(SIGUSR1, &sa, NULL)) throw(std::system_error(errno, std::system_category(), "Couldn't handle SIGUSR1")); - if (pthread_create(&m_daemon_id, NULL, service, (void*)this)) - throw(std::system_error(errno, std::system_category(), - "Couldn't Couldn't start fuse thread")); + if (!no_auto_init) + start_service(); } MockFS::~MockFS() { @@ -1018,6 +1017,12 @@ ASSERT_TRUE(res == static_cast(in.header.len) || m_quit); } +void MockFS::start_service() { + if (pthread_create(&m_daemon_id, NULL, service, (void*)this)) + throw(std::system_error(errno, std::system_category(), + "Couldn't Couldn't start fuse thread")); +} + void MockFS::write_response(const mockfs_buf_out &out) { fd_set writefds; pollfd fds[1]; diff --git a/tests/sys/fs/fusefs/pre-init.cc b/tests/sys/fs/fusefs/pre-init.cc --- a/tests/sys/fs/fusefs/pre-init.cc +++ b/tests/sys/fs/fusefs/pre-init.cc @@ -102,6 +102,8 @@ }))); expect_destroy(0); + m_mock->start_service(); + ASSERT_EQ(0, pthread_create(&th1, NULL, unmount1, NULL)); nap(); /* Wait for th1 to block in unmount() */ sem_post(&sem0); @@ -147,6 +149,8 @@ sem_wait(&sem0); }))); + m_mock->start_service(); + if ((child = ::fork()) == 0) { /* * In child. This will block waiting for FUSE_INIT to complete @@ -219,6 +223,8 @@ out.body.attr.attr_valid = UINT64_MAX; }))); + m_mock->start_service(); + EXPECT_EQ(0, stat("mountpoint", &sb)); EXPECT_EQ(nlink, sb.st_nlink); }