/*
 * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 *
 */

#ifndef SHARE_JFR_RECORDER_SERVICE_JFRRECORDERSERVICE_HPP
#define SHARE_JFR_RECORDER_SERVICE_JFRRECORDERSERVICE_HPP

#include "jfr/utilities/jfrAllocation.hpp"

class JfrCheckpointManager;
class JfrChunkWriter;
class JfrRepository;
class JfrStackTraceRepository;
class JfrStorage;
class JfrStringPool;

class JfrRecorderService : public StackObj {
 private:
  JfrCheckpointManager& _checkpoint_manager;
  JfrChunkWriter& _chunkwriter;
  JfrRepository& _repository;
  JfrStackTraceRepository& _stack_trace_repository;
  JfrStorage& _storage;
  JfrStringPool& _string_pool;

  void open_new_chunk(bool vm_error = false);
  void chunk_rotation();
  void in_memory_rotation();
  void serialize_storage_from_in_memory_recording();
  void finalize_current_chunk();
  void finalize_current_chunk_on_vm_error();
  void prepare_for_vm_error_rotation();
  void vm_error_rotation();

  void clear();
  void pre_safepoint_clear();
  void safepoint_clear();
  void invoke_safepoint_clear();
  void post_safepoint_clear();

  void write();
  void pre_safepoint_write();
  void safepoint_write();
  void invoke_safepoint_write();
  void post_safepoint_write();

 public:
  JfrRecorderService();
  void start();
  void rotate(int msgs);
  void process_full_buffers();
  void scavenge();
  void evaluate_chunk_size_for_rotation();
  static bool is_recording();
};

#endif // SHARE_JFR_RECORDER_SERVICE_JFRRECORDERSERVICE_HPP
