summaryrefslogtreecommitdiff
path: root/WindowServer/WSClientConnection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WindowServer/WSClientConnection.cpp')
-rw-r--r--WindowServer/WSClientConnection.cpp64
1 files changed, 27 insertions, 37 deletions
diff --git a/WindowServer/WSClientConnection.cpp b/WindowServer/WSClientConnection.cpp
index d049994533..320b0edd6a 100644
--- a/WindowServer/WSClientConnection.cpp
+++ b/WindowServer/WSClientConnection.cpp
@@ -6,16 +6,18 @@
#include <WindowServer/WSWindow.h>
#include <WindowServer/WSWindowManager.h>
#include <WindowServer/WSAPITypes.h>
-#include <Kernel/Process.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
-Lockable<HashMap<int, WSClientConnection*>>* s_connections;
+HashMap<int, WSClientConnection*>* s_connections;
void WSClientConnection::for_each_client(Function<void(WSClientConnection&)> callback)
{
if (!s_connections)
return;
- LOCKER(s_connections->lock());
- for (auto& it : s_connections->resource()) {
+ for (auto& it : *s_connections) {
callback(*it.value);
}
}
@@ -24,36 +26,29 @@ WSClientConnection* WSClientConnection::from_client_id(int client_id)
{
if (!s_connections)
return nullptr;
- LOCKER(s_connections->lock());
- auto it = s_connections->resource().find(client_id);
- if (it == s_connections->resource().end())
+ auto it = s_connections->find(client_id);
+ if (it == s_connections->end())
return nullptr;
return (*it).value;
}
-WSClientConnection* WSClientConnection::ensure_for_client_id(int client_id)
-{
- if (auto* client = from_client_id(client_id))
- return client;
- return new WSClientConnection(client_id);
-}
-
WSClientConnection::WSClientConnection(int fd)
: m_fd(fd)
{
- int rc = current->sys$ioctl(m_fd, 413, (int)&m_pid);
+ static int s_next_client_id = 0;
+ m_client_id = ++s_next_client_id;
+
+ int rc = ioctl(m_fd, 413, (int)&m_pid);
ASSERT(rc == 0);
if (!s_connections)
- s_connections = new Lockable<HashMap<int, WSClientConnection*>>;
- LOCKER(s_connections->lock());
- s_connections->resource().set(m_client_id, this);
+ s_connections = new HashMap<int, WSClientConnection*>;
+ s_connections->set(m_client_id, this);
}
WSClientConnection::~WSClientConnection()
{
- LOCKER(s_connections->lock());
- s_connections->resource().remove(m_client_id);
+ s_connections->remove(m_client_id);
}
void WSClientConnection::post_error(const String& error_message)
@@ -69,14 +64,23 @@ void WSClientConnection::post_error(const String& error_message)
void WSClientConnection::post_message(const WSAPI_ServerMessage& message)
{
- int nwritten = WSMessageLoop::the().server_process().sys$write(m_fd, &message, sizeof(message));
+ int nwritten = write(m_fd, &message, sizeof(message));
+ if (nwritten < 0) {
+ if (errno == EPIPE) {
+ dbgprintf("WSClientConnection::post_message: Disconnected from peer.\n");
+ return;
+ }
+ perror("WSClientConnection::post_message write");
+ ASSERT_NOT_REACHED();
+ }
+
ASSERT(nwritten == sizeof(message));
}
-RetainPtr<GraphicsBitmap> WSClientConnection::create_bitmap(const Size& size)
+RetainPtr<GraphicsBitmap> WSClientConnection::create_shared_bitmap(const Size& size)
{
RGBA32* buffer;
- int shared_buffer_id = current->sys$create_shared_buffer(m_pid, size.area() * sizeof(RGBA32), (void**)&buffer);
+ int shared_buffer_id = create_shared_buffer(m_pid, size.area() * sizeof(RGBA32), (void**)&buffer);
ASSERT(shared_buffer_id >= 0);
ASSERT(buffer);
ASSERT(buffer != (void*)-1);
@@ -352,13 +356,9 @@ void WSClientConnection::handle_request(WSAPIGetWindowBackingStoreRequest& reque
auto& window = *(*it).value;
auto* backing_store = window.backing();
- // FIXME: It shouldn't work this way!
- backing_store->retain();
-
WSAPI_ServerMessage response;
response.type = WSAPI_ServerMessage::Type::DidGetWindowBackingStore;
response.window_id = window_id;
- response.backing.backing_store_id = backing_store;
response.backing.bpp = sizeof(RGBA32);
response.backing.pitch = backing_store->pitch();
response.backing.size = backing_store->size();
@@ -366,14 +366,6 @@ void WSClientConnection::handle_request(WSAPIGetWindowBackingStoreRequest& reque
WSMessageLoop::the().post_message_to_client(request.client_id(), response);
}
-void WSClientConnection::handle_request(WSAPIReleaseWindowBackingStoreRequest& request)
-{
- int backing_store_id = request.backing_store_id();
- // FIXME: It shouldn't work this way!
- auto* backing_store = (GraphicsBitmap*)backing_store_id;
- backing_store->release();
-}
-
void WSClientConnection::handle_request(WSAPISetGlobalCursorTrackingRequest& request)
{
int window_id = request.window_id();
@@ -423,8 +415,6 @@ void WSClientConnection::on_request(WSAPIClientRequest& request)
return handle_request(static_cast<WSAPIDidFinishPaintingNotification&>(request));
case WSMessage::APIGetWindowBackingStoreRequest:
return handle_request(static_cast<WSAPIGetWindowBackingStoreRequest&>(request));
- case WSMessage::APIReleaseWindowBackingStoreRequest:
- return handle_request(static_cast<WSAPIReleaseWindowBackingStoreRequest&>(request));
case WSMessage::APISetGlobalCursorTrackingRequest:
return handle_request(static_cast<WSAPISetGlobalCursorTrackingRequest&>(request));
default: