mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-21 20:15:17 +00:00
IPCCompiler: Remove hardcoded endpoint magic, attempt deux
This patch removes the IPC endpoint numbers that needed to be specified in the IPC files. Since the string hash is a (hopefully) collision free number that depends on the name of the endpoint, we now use that instead. :^) Additionally, endpoint magic is now treated as a u32, because endpoint numbers were never negative anyway. For cases where the endpoint number does have to be hardcoded (a current case is LookupServer because the endpoint number must be known in LibC), the syntax has been made more explicit to avoid confusing those unfamiliar. To hardcode the endpoint magic, the following syntax is now used: endpoint EndpointName [magic=1234]
This commit is contained in:
parent
64d05152f7
commit
62af6cd4f9
Notes:
sideshowbarker
2024-07-18 19:06:33 +09:00
Author: https://github.com/sin-ack Commit: https://github.com/SerenityOS/serenity/commit/62af6cd4f96 Pull-request: https://github.com/SerenityOS/serenity/pull/6634
28 changed files with 62 additions and 37 deletions
|
@ -1,4 +1,4 @@
|
|||
endpoint LanguageClient = 8002
|
||||
endpoint LanguageClient
|
||||
{
|
||||
AutoCompleteSuggestions(Vector<GUI::AutocompleteProvider::Entry> suggestions) =|
|
||||
DeclarationLocation(GUI::AutocompleteProvider::ProjectLocation location) =|
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint LanguageServer = 8001
|
||||
endpoint LanguageServer
|
||||
{
|
||||
Greet(String project_root) => ()
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ struct Message {
|
|||
|
||||
struct Endpoint {
|
||||
String name;
|
||||
int magic;
|
||||
u32 magic;
|
||||
Vector<Message> messages;
|
||||
};
|
||||
|
||||
|
@ -164,12 +164,32 @@ int main(int argc, char** argv)
|
|||
lexer.consume_specific("endpoint");
|
||||
consume_whitespace();
|
||||
endpoints.last().name = lexer.consume_while([](char ch) { return !isspace(ch); });
|
||||
endpoints.last().magic = Traits<String>::hash(endpoints.last().name);
|
||||
consume_whitespace();
|
||||
assert_specific('=');
|
||||
consume_whitespace();
|
||||
auto magic_string = lexer.consume_while([](char ch) { return !isspace(ch) && ch != '{'; });
|
||||
endpoints.last().magic = magic_string.to_int().value();
|
||||
consume_whitespace();
|
||||
if (lexer.peek() == '[') {
|
||||
// This only supports a single parameter for now, and adding multiple
|
||||
// endpoint parameter support is left as an exercise for the reader. :^)
|
||||
|
||||
lexer.consume_specific('[');
|
||||
consume_whitespace();
|
||||
|
||||
auto parameter = lexer.consume_while([](char ch) { return !isspace(ch) && ch != '='; });
|
||||
consume_whitespace();
|
||||
assert_specific('=');
|
||||
consume_whitespace();
|
||||
|
||||
if (parameter == "magic") {
|
||||
// "magic" overwrites the default magic with a hardcoded one.
|
||||
auto magic_string = lexer.consume_while([](char ch) { return !isspace(ch) && ch != ']'; });
|
||||
endpoints.last().magic = magic_string.to_uint().value();
|
||||
} else {
|
||||
warnln("parse_endpoint: unknown parameter '{}' passed", parameter);
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
assert_specific(']');
|
||||
consume_whitespace();
|
||||
}
|
||||
assert_specific('{');
|
||||
parse_messages();
|
||||
assert_specific('}');
|
||||
|
@ -292,7 +312,7 @@ public:
|
|||
@message.constructor@
|
||||
virtual ~@message.name@() override {}
|
||||
|
||||
virtual i32 endpoint_magic() const override { return @endpoint.magic@; }
|
||||
virtual u32 endpoint_magic() const override { return @endpoint.magic@; }
|
||||
virtual i32 message_id() const override { return (int)MessageID::@message.name@; }
|
||||
static i32 static_message_id() { return (int)MessageID::@message.name@; }
|
||||
virtual const char* message_name() const override { return "@endpoint.name@::@message.name@"; }
|
||||
|
@ -412,15 +432,15 @@ public:
|
|||
@endpoint.name@Endpoint() { }
|
||||
virtual ~@endpoint.name@Endpoint() override { }
|
||||
|
||||
static int static_magic() { return @endpoint.magic@; }
|
||||
virtual int magic() const override { return @endpoint.magic@; }
|
||||
static u32 static_magic() { return @endpoint.magic@; }
|
||||
virtual u32 magic() const override { return @endpoint.magic@; }
|
||||
static String static_name() { return "@endpoint.name@"; }
|
||||
virtual String name() const override { return "@endpoint.name@"; }
|
||||
|
||||
static OwnPtr<IPC::Message> decode_message(ReadonlyBytes buffer, int sockfd)
|
||||
{
|
||||
InputMemoryStream stream { buffer };
|
||||
i32 message_endpoint_magic = 0;
|
||||
u32 message_endpoint_magic = 0;
|
||||
stream >> message_endpoint_magic;
|
||||
if (stream.handle_any_error()) {
|
||||
)~~~");
|
||||
|
@ -437,7 +457,7 @@ public:
|
|||
)~~~");
|
||||
#if GENERATE_DEBUG_CODE
|
||||
endpoint_generator.append(R"~~~(
|
||||
dbgln("Endpoint magic number message_endpoint_magic != @endpoint.magic@");
|
||||
dbgln("@endpoint.name@: Endpoint magic number message_endpoint_magic != @endpoint.magic@, not my message! (the other endpoint may have handled it)");
|
||||
)~~~");
|
||||
#endif
|
||||
endpoint_generator.append(R"~~~(
|
||||
|
|
|
@ -26,6 +26,11 @@ static in_addr_t* __gethostbyname_address_list_buffer[2];
|
|||
|
||||
static hostent __gethostbyaddr_buffer;
|
||||
static in_addr_t* __gethostbyaddr_address_list_buffer[2];
|
||||
// XXX: IPCCompiler depends on LibC. Because of this, it cannot be compiled
|
||||
// before LibC is. However, the lookup magic can only be obtained from the
|
||||
// endpoint itself if IPCCompiler has compiled the IPC file, so this creates
|
||||
// a chicken-and-egg situation. Because of this, the LookupServer endpoint magic
|
||||
// is hardcoded here.
|
||||
static constexpr i32 lookup_server_endpoint_magic = 9001;
|
||||
|
||||
// Get service entry buffers and file information for the getservent() family of functions.
|
||||
|
|
|
@ -21,7 +21,7 @@ class Endpoint {
|
|||
public:
|
||||
virtual ~Endpoint();
|
||||
|
||||
virtual int magic() const = 0;
|
||||
virtual u32 magic() const = 0;
|
||||
virtual String name() const = 0;
|
||||
virtual OwnPtr<Message> handle(const Message&) = 0;
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ class Message {
|
|||
public:
|
||||
virtual ~Message();
|
||||
|
||||
virtual int endpoint_magic() const = 0;
|
||||
virtual u32 endpoint_magic() const = 0;
|
||||
virtual int message_id() const = 0;
|
||||
virtual const char* message_name() const = 0;
|
||||
virtual MessageBuffer encode() const = 0;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint AudioClient = 82
|
||||
endpoint AudioClient
|
||||
{
|
||||
FinishedPlayingBuffer(i32 buffer_id) =|
|
||||
MutedStateChanged(bool muted) =|
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint AudioServer = 85
|
||||
endpoint AudioServer
|
||||
{
|
||||
// Basic protocol
|
||||
Greet() => ()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint ClipboardClient = 804
|
||||
endpoint ClipboardClient
|
||||
{
|
||||
ClipboardDataChanged([UTF8] String mime_type) =|
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint ClipboardServer = 802
|
||||
endpoint ClipboardServer
|
||||
{
|
||||
Greet() => ()
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint ImageDecoderClient = 7002
|
||||
endpoint ImageDecoderClient
|
||||
{
|
||||
Dummy() =|
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint ImageDecoderServer = 7001
|
||||
endpoint ImageDecoderServer
|
||||
{
|
||||
Greet() => ()
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint LaunchClient = 102
|
||||
endpoint LaunchClient
|
||||
{
|
||||
Dummy() =|
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint LaunchServer = 101
|
||||
endpoint LaunchServer
|
||||
{
|
||||
Greet() => ()
|
||||
OpenURL(URL url, String handler_name) => (bool response)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint LookupClient = 9002
|
||||
endpoint LookupClient
|
||||
{
|
||||
Dummy() =|
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint LookupServer = 9001
|
||||
endpoint LookupServer [magic=9001]
|
||||
{
|
||||
LookupName(String name) => (int code, Vector<String> addresses)
|
||||
LookupAddress(String address) => (int code, String name)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint NotificationClient = 92
|
||||
endpoint NotificationClient
|
||||
{
|
||||
Dummy() =|
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint NotificationServer = 95
|
||||
endpoint NotificationServer
|
||||
{
|
||||
// Basic protocol
|
||||
Greet() => ()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint ProtocolClient = 13
|
||||
endpoint ProtocolClient
|
||||
{
|
||||
// Download notifications
|
||||
DownloadProgress(i32 download_id, Optional<u32> total_size, u32 downloaded_size) =|
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint ProtocolServer = 9
|
||||
endpoint ProtocolServer
|
||||
{
|
||||
// Basic protocol
|
||||
Greet() => ()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint SymbolClient = 4541511
|
||||
endpoint SymbolClient
|
||||
{
|
||||
Dummy() =|
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint SymbolServer = 4541510
|
||||
endpoint SymbolServer
|
||||
{
|
||||
Greet() => ()
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint WebContentClient = 90
|
||||
endpoint WebContentClient
|
||||
{
|
||||
DidStartLoading(URL url) =|
|
||||
DidFinishLoading(URL url) =|
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint WebContentServer = 89
|
||||
endpoint WebContentServer
|
||||
{
|
||||
Greet() => ()
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint WindowClient = 4
|
||||
endpoint WindowClient
|
||||
{
|
||||
Paint(i32 window_id, Gfx::IntSize window_size, Vector<Gfx::IntRect> rects) =|
|
||||
MouseMove(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta, bool is_drag, Vector<String> mime_types) =|
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint WindowManagerClient = 1872
|
||||
endpoint WindowManagerClient
|
||||
{
|
||||
WindowRemoved(i32 wm_id, i32 client_id, i32 window_id) =|
|
||||
WindowStateChanged(i32 wm_id, i32 client_id, i32 window_id, i32 parent_client_id, i32 parent_window_id, bool is_active, bool is_minimized, bool is_modal, bool is_frameless, i32 window_type, [UTF8] String title, Gfx::IntRect rect, i32 progress) =|
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint WindowManagerServer = 1871
|
||||
endpoint WindowManagerServer
|
||||
{
|
||||
SetEventMask(u32 event_mask) => ()
|
||||
SetManagerWindow(i32 window_id) => ()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
endpoint WindowServer = 2
|
||||
endpoint WindowServer
|
||||
{
|
||||
Greet() => (Gfx::IntRect screen_rect, Core::AnonymousBuffer theme_buffer)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue