// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/modular/lib/scoped_tmpfs/scoped_tmpfs.h"

#include <lib/fdio/directory.h>
#include <lib/fdio/fd.h>
#include <lib/fdio/fdio.h>
#include <lib/sync/completion.h>
#include <lib/syslog/cpp/macros.h>
#include <zircon/processargs.h>

#include "src/lib/fsl/io/fd.h"

namespace scoped_tmpfs {

namespace {
async_loop_config_t MakeConfig() {
  async_loop_config_t result = kAsyncLoopConfigAttachToCurrentThread;
  result.make_default_for_current_thread = false;
  return result;
}
}  // namespace

ScopedTmpFS::ScopedTmpFS() : config_(MakeConfig()), loop_(&config_) {
  zx_status_t status = loop_.StartThread("tmpfs_thread");
  FX_CHECK(status == ZX_OK);
  zx_handle_t root_handle;
  status = memfs_create_filesystem(loop_.dispatcher(), &memfs_, &root_handle);
  FX_CHECK(status == ZX_OK);
  root_fd_ = fsl::OpenChannelAsFileDescriptor(zx::channel(root_handle));
  FX_CHECK(root_fd_.is_valid());
}

ScopedTmpFS::~ScopedTmpFS() {
  root_fd_.reset();
  sync_completion_t unmounted;
  memfs_free_filesystem(memfs_, &unmounted);
  zx_status_t status = sync_completion_wait(&unmounted, ZX_SEC(10));
  FX_DCHECK(status == ZX_OK) << status;
}

}  // namespace scoped_tmpfs
