// 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 "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"

#include <lib/fdio/directory.h>
#include <lib/fdio/fd.h>
#include <lib/fdio/fdio.h>
#include <lib/fsl/io/fd.h>
#include <lib/sync/completion.h>
#include <src/lib/fxl/logging.h>
#include <zircon/processargs.h>

namespace scoped_tmpfs {

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

ScopedTmpFS::ScopedTmpFS() : config_(MakeConfig()), loop_(&config_) {
  zx_status_t status = loop_.StartThread("tmpfs_thread");
  FXL_CHECK(status == ZX_OK);
  zx_handle_t root_handle;
  status = memfs_create_filesystem(loop_.dispatcher(), &memfs_, &root_handle);
  FXL_CHECK(status == ZX_OK);
  root_fd_ = fsl::OpenChannelAsFileDescriptor(zx::channel(root_handle));
  FXL_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(3));
  FXL_DCHECK(status == ZX_OK);
}

}  // namespace scoped_tmpfs
