//===- subzero/src/IceBrowserCompileServer.h - Browser server ---*- C++ -*-===//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// \brief Declares the browser-based compile server.
///
//===----------------------------------------------------------------------===//

#ifndef SUBZERO_SRC_ICEBROWSERCOMPILESERVER_H
#define SUBZERO_SRC_ICEBROWSERCOMPILESERVER_H

#include "IceClFlags.h"
#include "IceCompileServer.h"
#include "IceDefs.h"
#include "IceELFStreamer.h"

#include <atomic>
#include <thread>

namespace llvm {
class QueueStreamer;
class raw_fd_ostream;
} // end of namespace llvm

namespace Ice {

/// The browser variant of the compile server. Compared to the commandline
/// version, this version gets compile requests over IPC. Each compile request
/// will have a slimmed down version of argc, argv while other flags are set to
/// defaults that make sense in the browser case. The output file is specified
/// via a posix FD, and input bytes are pushed to the server.
class BrowserCompileServer : public CompileServer {
  BrowserCompileServer(const BrowserCompileServer &) = delete;
  BrowserCompileServer &operator=(const BrowserCompileServer &) = delete;
  class StringStream;

public:
  BrowserCompileServer() : HadError(false) {}

  ~BrowserCompileServer() final;

  void run() final;

  ErrorCode &getErrorCode() final;

  /// Parse and set up the flags for compile jobs.
  void getParsedFlags(uint32_t NumThreads, int argc, char **argv);

  /// Creates the streams + context and starts the compile thread, handing off
  /// the streams + context.
  void startCompileThread(int OutFD);

  /// Call to push more bytes to the current input stream. Returns false on
  /// success and true on error.
  bool pushInputBytes(const void *Data, size_t NumBytes);

  /// Notify the input stream of EOF.
  void endInputStream();

  /// Wait for the compile thread to complete then reset the state.
  void waitForCompileThread() {
    CompileThread.join();
    if (Ctx->getErrorStatus()->value())
      LastError.assign(Ctx->getErrorStatus()->value());
    // Reset some state. The InputStream is deleted by the compiler so only
    // reset this to nullptr. Free and flush the rest of the streams.
    InputStream = nullptr;
    EmitStream.reset(nullptr);
    ELFStream.reset(nullptr);
  }

  StringStream &getErrorStream() { return *ErrorStream; }

  void setFatalError(const std::string &Reason);

private:
  class StringStream {
  public:
    StringStream() : StrBuf(Buffer) {}
    const std::string &getContents() { return StrBuf.str(); }
    Ostream &getStream() { return StrBuf; }

  private:
    std::string Buffer;
    llvm::raw_string_ostream StrBuf;
  };
  /// This currently only handles a single compile request, hence one copy of
  /// the state.
  std::unique_ptr<GlobalContext> Ctx;
  /// A borrowed reference to the current InputStream. The compiler owns the
  /// actual reference so the server must be careful not to access after the
  /// compiler is done.
  llvm::QueueStreamer *InputStream = nullptr;
  std::unique_ptr<Ostream> LogStream;
  std::unique_ptr<llvm::raw_fd_ostream> EmitStream;
  std::unique_ptr<StringStream> ErrorStream;
  std::unique_ptr<ELFStreamer> ELFStream;
  std::thread CompileThread;
  std::atomic<bool> HadError;
};

} // end of namespace Ice

#endif // SUBZERO_SRC_ICEBROWSERCOMPILESERVER_H
