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

#ifndef FLUTTER_TONIC_DART_ISOLATE_RELOADER_H_
#define FLUTTER_TONIC_DART_ISOLATE_RELOADER_H_

#include <string>
#include <vector>
#include <queue>

#include "dart/runtime/include/dart_api.h"
#include "flutter/glue/thread.h"
#include "lib/ftl/macros.h"
#include "lib/ftl/synchronization/monitor.h"

namespace blink {
class DartLibraryProvider;

// Reloading an isolate must be an atomic operation, meaning, no other tasks
// can run while reloading. A nested run loop is not sufficient because other
// tasks that invoke Dart code can be run. When |HandleLibraryTag| is invoked
// the calling thread will be blocked until the load has fully completed. To
// avoid relying on the message loop we use our own queue and notification
// mechanism.
class DartIsolateReloader {
 public:
  // The |DartLibraryProvider| used to load the library sources.
  DartIsolateReloader(DartLibraryProvider* library_provider);
  ~DartIsolateReloader();

  static Dart_Handle HandleLibraryTag(Dart_LibraryTag tag,
                                      Dart_Handle library,
                                      Dart_Handle url);

 private:
  class LoadRequest;
  class LoadResult;

  void SendRequest(Dart_LibraryTag tag,
                   Dart_Handle url,
                   Dart_Handle library_url);

  void PostResult(std::unique_ptr<LoadResult> load_result);

  static void RequestTask(DartLibraryProvider* library_provider,
                          DartIsolateReloader* isolate_reloader,
                          intptr_t tag,
                          const std::string& url,
                          const std::string& library_url);

  void HandleLoadResultLocked(LoadResult* load_result);
  void ProcessResultQueueLocked();
  bool IsCompleteLocked();
  bool BlockUntilComplete();

  glue::Thread thread_;
  DartLibraryProvider* library_provider_;

  ftl::Monitor monitor_;
  // The monitor is used to protect the following fields:
  Dart_Handle load_error_;
  std::queue<std::unique_ptr<LoadResult>> load_results_;
  intptr_t pending_requests_;

  FTL_DISALLOW_COPY_AND_ASSIGN(DartIsolateReloader);
};

}  // namespace blink

#endif  // FLUTTER_TONIC_DART_ISOLATE_RELOADER_H_
