summaryrefslogtreecommitdiff
path: root/Libraries/LibIPC
AgeCommit message (Collapse)Author
2020-08-03LibIPC: Fix waiting for specific messageTom
When waiting for a specific message, only consider messages from the peer endpoint. Otherwise a message with the same id for the local endpoint may be misinterpreted. This fixes the Terminal sometimes hanging after bootup because a local endpoint message is mistaken for the CreateMenuResponse message.
2020-07-15LibIPC: Tweak a misleading perror()Andreas Kling
If we get an error from recv(), let's blame "recv" instead of "read".
2020-07-06LibIPC+Services: Make ClientConnection take socket as NonnullRefPtrAndreas Kling
This avoids getting into the awkward situation where the socket is still part-owned by main() in multi-instance service. Also it just reads nicer.
2020-07-03LibIPC: Don't assert on short writes in IPC::ClientConnectionAndreas Kling
This stops servers from crashing when a client's socket buffer becomes full and we can't post any more messages to it. Normally this means the client process is hanged/spinning, but I suppose this could also happen under severe system load. It's unclear to me what a better solution here would be. We can't keep buffering messages indefinitely if the client is just never going to receive them anyway. At some point we have to cut our losses, and it seems pretty reasonable to let the kernel socket buffer be the cutoff. It will be the responsibility of the individual server implementations to avoid sending messages to clients that may be unable to handle them.
2020-06-22LibIPC: Silence some debug spamAndreas Kling
2020-06-21LibIPC: Add setters for overriding the client/server PID if neededAndreas Kling
Since SO_PEERCRED can only tell us who originally accepted the socket on the other side, we'll sometimes need to negotiate PID info manually.
2020-06-13LibIPC: Only start responsiveness timer after sending client a messageAndreas Kling
Instead of always running the responsiveness timer for IPC clients, we now only start it after sending a message. This avoids waking up otherwise idle clients to do ping/pong busywork.
2020-06-12LibIPC: Use create_single_shot to construct timerKevin Meyer
2020-06-12LibIPC: Actually use the new Core::Timer::restart() I just addedAndreas Kling
Thanks @brynet for noticing. :^)
2020-06-11LibIPC+WindowServer+LibGUI: Detect and highlight unresponsive GUI appsAndreas Kling
IPC::ClientConnection now tracks the time since the last time we got a message from the client and calls a virtual function on itself after 3 seconds: may_have_become_unresponsive(). Subclasses of ClientConnection can then react to this if they like. We use this mechanism in WindowServer to send out a friendly Ping message to the client. If he doesn't Pong within 1 second, we mark the client as "unresponsive" and recompose all of his windows with a darkened appearance and amended title until he Pongs us. This is a little on the aggressive side and we should figure out a way to wake up less often. Perhaps this could only be done to windows the user is currently interacting with, for example. Anyways, this is pretty cool! :^)
2020-06-08LibIPC+LibGfx+IPCCompiler: Drop some unused includesSergey Bugaev
2020-06-07LibIPC+Services: Support URL as a native IPC typeAndreas Kling
2020-05-30LibIPC: Fix server crashes on client disconnectsSergey Bugaev
The server should always survive client communication errors.
2020-05-14Build: Switch to CMake :^)Sergey Bugaev
Closes https://github.com/SerenityOS/serenity/issues/2080
2020-05-12LibIPC+IPCCompiler: Templatize encoding/decoding of Optional<T>Andreas Kling
This was the last one! IPCCompiler no longer has any type-specific encoding/decoding logic! :^)
2020-05-12LibIPC+LibGfx: Templatize IPC encoding as well as decodingAndreas Kling
Now most classes dictate how they are serialized and deserialized when transmitted across LibIPC sockets. This also makes the IPC compiler a bit simpler. :^)
2020-05-09Meta: Delete empty .cpp filesLinus Groh
2020-05-08LibIPC: Use NonnullOwnPtrVector<Message> in IPC::ServerConnectionAndreas Kling
We never want to store null messages, so make it impossible to do so.
2020-05-03LibIPC: Add a simple IPC::Dictionary type (String key -> String value)Andreas Kling
2020-05-02LibIPC: Abort on connection failureSergey Bugaev
...instead of looping for (effectively) ever. Fixes https://github.com/SerenityOS/serenity/issues/1869
2020-04-05AK: Stop allowing implicit downcast with OwnPtr and NonnullOwnPtrAndreas Kling
Same issue here as we had with RefPtr and NonnullRefPtr. Since we can't make copies of an owning pointer, we don't get quite the same static_ptr_cast<T> here. Instead I've only added a new templated version of OwnPtr::release_nonnull() in this patch, to solve the only issue that popped up. I'm not sure what the best solution here is, but this works for now.
2020-03-29LibIPC+LibGfx: Pass the IPC::Decoder to decoding helpersAndreas Kling
Instead of passing the BufferStream, pass the Decoder. I'd like to stop using BufferStream eventually anyway, so it's good to get it out of any API's where it's in currently.
2020-03-29LibIPC: Add forwarding header for LibIPCAndreas Kling
2020-03-01AK: Remove unnecessary casts to size_t, after Vector changesAndreas Kling
Now that Vector uses size_t, we can remove a whole bunch of redundant casts to size_t.
2020-02-25AK: Make Vector use size_t for its size and capacityAndreas Kling
2020-02-16LibGUI: Add forwarding headerAndreas Kling
This patch adds <LibGUI/Forward.h> and uses it a bunch. It also dragged various header dependency reduction changes into it.
2020-02-15LibIPC+IPCCompiler: Add IPC::Decoder, let classes decode themselvesAndreas Kling
This shaves ~5 seconds off of a full build, not too bad. Also it just seems nicer to push this logic out to classes. It could be better but it's a start. :^)
2020-02-15LibIPC: Move IPC::Encoder functions out of lineAndreas Kling
Compiling anything that includes generated IPC messages is painfully slow at the moment. This moves the encoding helpers out of line, which helps a bit. Doing the same for decoding will help more.
2020-02-15LibIPC+IPCCompiler: Remove some unused members from generated messagesAndreas Kling
2020-02-14LibCore: Add a forward declaration headerAndreas Kling
This patch adds <LibCore/Forward.h> and uses it in various places to shrink the header dependency graph.
2020-02-14AK: Add a forward declaration headerAndreas Kling
You can now #include <AK/Forward.h> to get most of the AK types as forward declarations. Header dependency explosion is one of the main contributors to compile times at the moment, so this is a step towards smaller include graphs.
2020-02-06LibCore: Merge the CSyscallUtils namespace into CoreAndreas Kling
2020-02-06LibCore: Remove leading C from filenamesAndreas Kling
2020-02-06LibIPC: Remove leading I from filenamesAndreas Kling
2020-02-05LibIPC: Remove IPC::Encoder overloads for size_tAndreas Kling
Clients of this code should use explicitly-sized types instead.
2020-02-05LibIPC: Put all classes in the IPC namespace and remove the leading IAndreas Kling
2020-02-05LibIPC: Add support for 64-bit size_t in IEncoderjoshua stein
2020-02-02LibCore: Put all classes in the Core namespace and remove the leading CAndreas Kling
I've been wanting to do this for a long time. It's time we start being consistent about how this stuff works. The new convention is: - "LibFoo" is a userspace library that provides the "Foo" namespace. That's it :^) This was pretty tedious to convert and I didn't even start on LibGUI yet. But it's coming up next.
2020-01-25LibIPC: Short-cirtcuit post_message() if socket already disconnectedAndreas Kling
To allow for more asynchronous teardown of IClientConnection, make the post_message() function simply return if called after the IPC socket has been closed.
2020-01-18Meta: Add license header to source filesAndreas Kling
As suggested by Joshua, this commit adds the 2-clause BSD license as a comment block to the top of every source file. For the first pass, I've just added myself for simplicity. I encourage everyone to add themselves as copyright holders of any file they've added or modified in some significant way. If I've added myself in error somewhere, feel free to replace it with the appropriate copyright holder instead. Going forward, all new source files should include a license header.
2019-12-30LibIPC: Let's start building custom message codecs for LibIPCAndreas Kling
Instead of using ByteBuffer (which always malloc() their storage) for IPC message encoding, we now use a Vector<u8, 1024>, which means that messages smaller than 1 KB avoid heap allocation entirely.
2019-12-20Build: clean up build system, use one shared Makefilejoshua stein
Allow everything to be built from the top level directory with just 'make', cleaned with 'make clean', and installed with 'make install'. Also support these in any particular subdirectory. Specifying 'make VERBOSE=1' will print each ld/g++/etc. command as it runs. Kernel and early host tools (IPCCompiler, etc.) are built as object.host.o so that they don't conflict with other things built with the cross-compiler.
2019-12-16LibIPC: Make sure we always process unhandled messagesAndreas Kling
A client that only ever does synchronous IPC calls from its side would never actually process incoming asynchronous messages since they would arrive while waiting for a synchronous response and then end up sitting forever in the "unhandled messages" queue. We now always handle unhandled messages using a deferred invocation. This fixes the bug where Audio.MenuApplet didn't learn that the muted state changed in response to its own request to change it. :^)
2019-12-07LibIPC: Install libipc.a into /usr/libAndreas Kling
2019-12-06LibIPC: Get client/server PIDs using getsockopt(SO_PEERCRED)Andreas Kling
Instead of passing the PIDs back and forth in a handshake "Greet" message, just use getsockopt(SO_PEERCRED) on both sides to get the same information from the kernel. This is a nice little simplification of the IPC protocol, although it does not get rid of the handshake since we still have to pass the "client ID" from the server to each client so they know how to refer to themselves. This might not be necessary and we might be able to get rid of this later on.
2019-12-02WindowServer: Mark clients as misbehaving when they send invalid dataAndreas Kling
If a client sends an invalid window ID or similar to the WindowServer, we'll now immediately mark them as misbehaving and disconnect them. This might be too aggressive in some cases (window management, ...) but it's just a place to start.
2019-12-02LibIPC: Rename IMessage id/name to message_id/message_nameAndreas Kling
Hogging "id" and "name" makes it impossible to use these as message parameter names, which seems silly. :^)
2019-12-02LibIPC: Don't handle incoming messages right away when drainingAndreas Kling
When draining the socket in IServerConnection, we would previously handle each incoming (local endpoint) message as it came in. This would cause unexpected things to happen while blocked waiting for a synchronous response. That's definitely not what we want, so this patch puts all of the incoming messages in a queue and does a separate pass over the queue to handle everything in order.
2019-12-02LibIPC: Rename base classes to IClientConnection and IServerConnectionAndreas Kling
This matches what we're already calling the server-side subclasses better, though we'll probably want to find some better names for the client-side classes eventually.
2019-12-02LibIPC: Move IPC client/server connection templates to LibIPCAndreas Kling
Move over the CoreIPC::Server and CoreIPC::Client namespace stuff into LibIPC where it will soon becomes LibIPC-style things.