blob: f47192f1d329cbd6a21d06add36117194725b2d7 [file] [log] [blame]
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#ifndef RUNTIME_VM_MICROTASK_MIRROR_QUEUES_H_
#define RUNTIME_VM_MICROTASK_MIRROR_QUEUES_H_
#include <utility>
#include "platform/hashmap.h"
#include "platform/list_queue.h"
#include "platform/synchronization.h"
#include "platform/utils.h"
#include "vm/stack_frame.h"
namespace dart {
class MicrotaskMirrorQueueEntry : public ValueObject {
public:
static constexpr intptr_t kInvalidId = -1;
MicrotaskMirrorQueueEntry() : id_(kInvalidId), stack_trace_(nullptr) {}
MicrotaskMirrorQueueEntry(intptr_t id, CStringUniquePtr&& st)
: id_(id), stack_trace_(std::move(st)) {}
void operator=(MicrotaskMirrorQueueEntry&& other) {
id_ = other.id_;
stack_trace_.swap(other.stack_trace_);
}
intptr_t id() const { return id_; }
CStringUniquePtr const& stack_trace() const { return stack_trace_; }
/// Releases ownership of the stack trace string that this entry is holding.
char* ReleaseStackTrace() { return stack_trace_.release(); }
private:
intptr_t id_;
CStringUniquePtr stack_trace_;
};
/// A queue that mirrors the microtask queue of an isolate. This allows the VM
/// Service to return information about microtasks.
class MicrotaskMirrorQueue {
public:
MicrotaskMirrorQueue()
: is_disabled_(false), queue_(), next_available_id_(0) {}
void OnScheduleAsyncCallback(const StackTrace& st);
void OnSchedulePriorityAsyncCallback();
void OnAsyncCallbackComplete(int64_t start_time, int64_t end_time);
private:
bool is_disabled_;
ListQueue<MicrotaskMirrorQueueEntry> queue_;
// The unique ID that will be assigned to the next |MicrotaskMirrorQueueEntry|
// added to |queue_|.
intptr_t next_available_id_;
DISALLOW_COPY_AND_ASSIGN(MicrotaskMirrorQueue);
};
/// A wrapper around a map from isolate IDs to |MicrotaskMirrorQueue|s.
class MicrotaskMirrorQueues : public AllStatic {
public:
static MicrotaskMirrorQueue* GetQueue(int64_t isolate_id);
static void CleanUp();
private:
static constexpr intptr_t kIsolateIdToQueueInitialCapacity = 1 << 4; // 16
static Mutex isolate_id_to_queue_lock_;
static SimpleHashMap isolate_id_to_queue_;
DISALLOW_COPY_AND_ASSIGN(MicrotaskMirrorQueues);
};
} // namespace dart
#endif // RUNTIME_VM_MICROTASK_MIRROR_QUEUES_H_