Skip to content

Commit

Permalink
Implement heap snapsnot memory tracking for Event, EventTarget
Browse files Browse the repository at this point in the history
  • Loading branch information
jasnell committed Feb 5, 2024
1 parent 6283473 commit 8691915
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 61 deletions.
41 changes: 41 additions & 0 deletions src/workerd/api/basics.c++
Original file line number Diff line number Diff line change
Expand Up @@ -768,4 +768,45 @@ CustomEvent::CustomEventInit::operator Event::Init() {
};
}

size_t EventTarget::EventHandler::JavaScriptHandler::jsgGetMemorySelfSize() const {
return sizeof(JavaScriptHandler);
}

void EventTarget::EventHandler::JavaScriptHandler::jsgGetMemoryInfo(
jsg::MemoryTracker& tracker) const {
tracker.trackField("identity", identity);
tracker.trackField("callback", callback);
if (abortHandler != kj::none) {
tracker.trackFieldWithSize("abortHandler", sizeof(kj::Own<NativeHandler>) +
sizeof(NativeHandler));
}
}

size_t EventTarget::EventHandler::jsgGetMemorySelfSize() const {
return sizeof(EventHandler);
}

void EventTarget::EventHandler::jsgGetMemoryInfo(jsg::MemoryTracker& tracker) const {
KJ_SWITCH_ONEOF(handler) {
KJ_CASE_ONEOF(js, JavaScriptHandler) {
tracker.trackField("js", js);
}
KJ_CASE_ONEOF(native, NativeHandlerRef) {
tracker.trackFieldWithSize("native", sizeof(NativeHandlerRef));
}
}
}

size_t EventTarget::EventHandlerSet::jsgGetMemorySelfSize() const {
return sizeof(EventHandlerSet);
}

void EventTarget::EventHandlerSet::jsgGetMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("handlers", handlers, kj::none, kj::none, false);
}

void EventTarget::visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("typeMap", typeMap);
}

} // namespace workerd::api
34 changes: 34 additions & 0 deletions src/workerd/api/basics.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,11 @@ class Event: public jsg::Object {
JSG_STATIC_CONSTANT(BUBBLING_PHASE);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("type", ownType);
tracker.trackField("target", target);
}

private:
kj::StringPtr type;
kj::String ownType;
Expand Down Expand Up @@ -215,6 +220,10 @@ class CustomEvent: public Event {
JSG_READONLY_PROTOTYPE_PROPERTY(detail, getDetail);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("detail", detail);
}

private:
jsg::Optional<jsg::JsRef<jsg::JsValue>> detail;
};
Expand Down Expand Up @@ -308,6 +317,8 @@ class EventTarget: public jsg::Object {
jsg::Function<void(jsg::Ref<Event>)> func,
bool once = false);

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const;

private:
void addNativeListener(jsg::Lock& js, NativeHandler& handler);
bool removeNativeListener(NativeHandler& handler);
Expand All @@ -323,6 +334,10 @@ class EventTarget: public jsg::Object {
void visitForGc(jsg::GcVisitor& visitor) {
visitor.visit(identity, callback);
}

kj::StringPtr jsgGetMemoryName() const { return "JavaScriptHandler"_kjc; }
size_t jsgGetMemorySelfSize() const;
void jsgGetMemoryInfo(jsg::MemoryTracker& tracker) const;
};

struct NativeHandlerRef {
Expand All @@ -338,6 +353,10 @@ class EventTarget: public jsg::Object {

// When once is true, the handler will be removed after it is invoked one time.
bool once = false;

kj::StringPtr jsgGetMemoryName() const { return "EventHandler"_kjc; }
size_t jsgGetMemorySelfSize() const;
void jsgGetMemoryInfo(jsg::MemoryTracker& tracker) const;
};

struct EventHandlerHashCallbacks {
Expand All @@ -360,6 +379,10 @@ class EventTarget: public jsg::Object {

EventHandlerSet()
: handlers(EventHandlerHashCallbacks(), {}) {}

kj::StringPtr jsgGetMemoryName() const { return "EventHandlerSet"_kjc; }
size_t jsgGetMemorySelfSize() const;
void jsgGetMemoryInfo(jsg::MemoryTracker& tracker) const;
};

EventHandlerSet& getOrCreate(kj::StringPtr str) KJ_LIFETIMEBOUND;
Expand Down Expand Up @@ -463,6 +486,13 @@ class AbortSignal final: public EventTarget {

RefcountedCanceler& getCanceler();

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
EventTarget::visitForMemoryInfo(tracker);
tracker.trackInlineFieldWithSize("IoOwn<RefcountedCanceler>",
sizeof(IoOwn<RefcountedCanceler>));
tracker.trackField("reason", reason);
}

private:
IoOwn<RefcountedCanceler> canceler;
Flag flag;
Expand Down Expand Up @@ -496,6 +526,10 @@ class AbortController final: public jsg::Object {
JSG_METHOD(abort);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("signal", signal);
}

private:
jsg::Ref<AbortSignal> signal;

Expand Down
9 changes: 9 additions & 0 deletions src/workerd/api/global-scope.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,11 @@ class PromiseRejectionEvent: public Event {
JSG_READONLY_INSTANCE_PROPERTY(reason, getReason);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("promise", promise);
tracker.trackField("reason", reason);
}

private:
jsg::V8Ref<v8::Promise> promise;
jsg::Value reason;
Expand Down Expand Up @@ -656,6 +661,10 @@ class ServiceWorkerGlobalScope: public WorkerGlobalScope {
TimeoutId::Generator timeoutIdGenerator;
// The generator for all timeout IDs associated with this scope.

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("unhandledRejections", unhandledRejections);
}

private:
jsg::UnhandledRejectionHandler unhandledRejections;

Expand Down
4 changes: 4 additions & 0 deletions src/workerd/api/gpu/gpu-device.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,10 @@ class GPUUncapturedErrorEvent : public Event {
JSG_READONLY_INSTANCE_PROPERTY(error, getError);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("error", error_);
}

private:
jsg::Ref<GPUError> error_;

Expand Down
13 changes: 13 additions & 0 deletions src/workerd/api/web-socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ class MessageEvent: public Event {
});
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("data", data);
}

private:
jsg::JsRef<jsg::JsValue> data;

Expand Down Expand Up @@ -112,6 +116,10 @@ class CloseEvent: public Event {
// CloseEvent will be referenced from the `WebSocketEventMap` define
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("reason", reason);
}

private:
int code;
kj::String reason;
Expand Down Expand Up @@ -147,6 +155,11 @@ class ErrorEvent: public Event {
// ErrorEvent will be referenced from the `WebSocketEventMap` define
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("message", message);
tracker.trackField("error", error);
}

private:
kj::String message;
jsg::JsRef<jsg::JsValue> error;
Expand Down
2 changes: 1 addition & 1 deletion src/workerd/jsg/iterator.h
Original file line number Diff line number Diff line change
Expand Up @@ -813,7 +813,7 @@ class AsyncIteratorBase: public Object {
if constexpr (MemoryRetainer<State>) {
tracker.trackField("state", state);
} else {
tracker.trackField("state", sizeof(State));
tracker.trackFieldWithSize("state", sizeof(State));
}
tracker.trackField("impl", impl);
}
Expand Down
Loading

0 comments on commit 8691915

Please sign in to comment.