#pragma once #include "root.h" #include "BunBuiltinNames.h" #include "BunClientData.h" #include "JSEventEmitter.h" namespace Bun { // TODO: find a better place for this int getRSS(size_t* rss); using namespace JSC; class Process : public WebCore::JSEventEmitter { using Base = WebCore::JSEventEmitter; LazyProperty m_cpuUsageStructure; LazyProperty m_memoryUsageStructure; LazyProperty m_bindingUV; LazyProperty m_bindingNatives; public: Process(JSC::Structure* structure, WebCore::JSDOMGlobalObject& globalObject, Ref&& impl) : Base(structure, globalObject, WTFMove(impl)) { } void emitSignalEvent(int signalNumber); DECLARE_EXPORT_INFO; static void destroy(JSC::JSCell* cell) { static_cast(cell)->Process::~Process(); } ~Process(); static constexpr unsigned StructureFlags = Base::StructureFlags | HasStaticPropertyTable; static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype) { return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info()); } static Process* create(WebCore::JSDOMGlobalObject& globalObject, JSC::Structure* structure) { auto emitter = WebCore::EventEmitter::create(*globalObject.scriptExecutionContext()); Process* accessor = new (NotNull, JSC::allocateCell(globalObject.vm())) Process(structure, globalObject, WTFMove(emitter)); accessor->finishCreation(globalObject.vm()); return accessor; } DECLARE_VISIT_CHILDREN; template static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM& vm) { if constexpr (mode == JSC::SubspaceAccess::Concurrently) return nullptr; return WebCore::subspaceForImpl( vm, [](auto& spaces) { return spaces.m_clientSubspaceForProcessObject.get(); }, [](auto& spaces, auto&& space) { spaces.m_clientSubspaceForProcessObject = std::forward(space); }, [](auto& spaces) { return spaces.m_subspaceForProcessObject.get(); }, [](auto& spaces, auto&& space) { spaces.m_subspaceForProcessObject = std::forward(space); }); } void finishCreation(JSC::VM& vm); inline Structure* cpuUsageStructure() { return m_cpuUsageStructure.getInitializedOnMainThread(this); } inline Structure* memoryUsageStructure() { return m_memoryUsageStructure.getInitializedOnMainThread(this); } inline JSObject* bindingUV() { return m_bindingUV.getInitializedOnMainThread(this); } inline JSObject* bindingNatives() { return m_bindingNatives.getInitializedOnMainThread(this); } }; } // namespace Bun