| // 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_ |