Commit graph

98 commits

Author SHA1 Message Date
Kristian Høgsberg
88f3bd84c8 Avoid printing to stderr
Use wl_log in the last few places where we print to stderr.  Remove
logging in a couple of places where we properly return an error code.

https://bugs.freedesktop.org/show_bug.cgi?id=73339
2014-04-30 12:18:52 -07:00
Kristian Høgsberg
051f3838de client: Delay EPIPE handling so we get a chance to handle error events 2014-03-26 13:28:27 -07:00
Jasper St. Pierre
ac188e9e44 wayland-client: Set a proper errno
errno is supposed to be positive, not negative. It seems that
everything else that calls display_fatal_error() calls it with
a positive error code, so do it here as well.
2014-02-18 13:39:59 -08:00
Kristian Høgsberg
b9eebce0aa client: Queue display events on private queue and always dispatch
The wl_display events (error and delete_id) need to be handled even
if the default queue doesn't get dispatched for a while.  For example,
a busy EGL rendering loop hits wl_display.sync every eglSwapBuffers()
and we need to process the delete_id events to maintain the object ID
data structure.

As it is, that doesn't happen, but with this change we special case
wl_display events.  We put them on a custom, private queue and when
dispatching events, we always dispatch display_queue events first.
The wl_display proxy should still be the default_queue, so that objects
created from wl_display requests get assigned to that.
2014-02-07 16:50:50 -08:00
Kristian Høgsberg
a9eb563fb7 client: Rename display->queue to default_queue
We'll add a new queue next, so rename the default queue first.
2014-02-07 16:00:21 -08:00
Jason Ekstrand
8fd2520d80 Rename wl_debug to debug_server/client
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
2014-02-05 20:54:33 -08:00
Jonas 'Sortie' Termansen
ed139ddcd7 client: Include poll.h instead of sys/poll.h
POSIX mandates the poll.h header as the standard location of poll(2).
2014-01-17 11:27:26 -08:00
Kristian Høgsberg
1a58c7f211 client: Handle EINTR in wl_display_dispatch_queue()
Restart the poll() if we take a signal.  This is easily triggered in
an application that ends up blocking in eglSwapBuffers(), and causes EGL
to fail to allocate a back buffer.
2013-12-09 16:19:33 -08:00
Jonas Ådahl
09877f3231 doc: Fix spelling of parameters
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2013-12-09 15:50:01 -08:00
Neil Roberts
1521c62a31 client: Make wl_proxy_set_queue() with NULL revert to default queue
This will be useful in order to implement the
EGL_WL_create_wayland_buffer_from_image extension. The buffers created
within Mesa's Wayland platform are created using the the wl_drm object
as a proxy factory which means they will be set to use Mesa's internal
event queue. However, these buffers will be owned by the client
application so they ideally need to use the default event loop. This
function provides a way to set the proxy's event queue back to the
default.

krh: Edited from Neils original patch to just use wl_proxy_set_queue() with
a NULL argument instead of introducing a new function.
2013-12-04 17:01:01 -08:00
Kristian Høgsberg
853c24e699 client: Introduce functions to allocate and marshal proxies atomically
The server requires clients to only allocate one ID ahead of the previously
highest ID in order to keep the ID range tight.  Failure to do so will
make the server close the client connection.  However, the way we allocate
new IDs is racy.  The generated code looks like:

  new_proxy = wl_proxy_create(...);
  wl_proxy_marshal(proxy, ... new_proxy, ...);

If two threads do this at the same time, there's a chance that thread A
will allocate a proxy, then get pre-empted by thread B which then allocates
a proxy and then passes it to wl_proxy_marshal().  The ID for thread As
proxy will be one higher that the currently highest ID, but the ID for
thread Bs proxy will be two higher.  But since thread B prempted thread A
before it could send its new ID, B will send its new ID first, the server
will see the ID from thread Bs proxy first, and will reject it.

We fix this by introducing wl_proxy_marshal_constructor().  This
function is identical to wl_proxy_marshal(), except that it will
allocate a wl_proxy for NEW_ID arguments and send it, all under the
display mutex.  By introducing a new function, we maintain backwards
compatibility with older code from the generator, and make sure that
the new generated code has an explicit dependency on a new enough
libwayland-client.so.

A virtual Wayland merit badge goes to Kalle Vahlman, who tracked this
down and analyzed the issue.

Reported-by: Kalle Vahlman <kalle.vahlman@movial.com>
2013-11-15 20:49:36 -08:00
Neil Roberts
799ea7206b client: Fix handling display->reader_count if poll fails
In wl_display_dispatch_queue, if poll fails then it would previously
return immediately and leak a reference in display->reader_count. Then
if the application ignores the error and tries to read again it will
block forever. This can happen for example if the poll fails with
EINTR which the application might consider to be a recoverable error.
This patch makes it cancel the read so the reader_count will be
decremented when poll fails.
2013-09-25 10:11:20 -07:00
Chang Liu
5cf31443c5 client: fix an inconsistency in documentation
The errno is set to EAGAIN when there are undispatched events, according
to L1066 of wayland-client.c.
2013-09-21 11:34:57 -07:00
Jason Ekstrand
eb947e9408 Add support for client-side language bindings
This commit adds support for language bindings on the client half of the
library.  The idea is the same as for server-side dispatchers.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
2013-08-19 16:23:08 -07:00
Rob Bradford
4ad58fbb4a wayland-client: Add wl_proxy_get_listener
This is the mirror function to wl_proxy_add_listener and is useful
inside client libraries to differentiate events on listeners for which
multiple proxies have been created.
2013-08-12 16:26:36 -07:00
Bryce W. Harrington
65efa2ed3a client: Improve spelling and grammar in comments
Signed-off-by: Bryce Harrington <b.harrington@samsung.com>
2013-08-08 21:41:33 -07:00
Jiergir Ogoerg
c1fd097cd9 client: Simply wl_display_dispatch_queue_pending() and fix return value
We're supposed to return number of events dispatched on success, not 0.
Refactor to avoid goto and just return ret.
2013-07-29 16:50:44 -07:00
Kristian Høgsberg
e0579bfb61 wayland-client: Handle potential NULL-deref
Instead, return -1 on out-of-memory.  errno will be set to ENOMEM by
the failing malloc.
2013-07-13 00:42:14 -04:00
Kristian Høgsberg
93d888aec6 wayland-server: Don't close display fd in fatal error handler
We can't do that there, we have to make sure it stays a valid fd until
the application calls wl_display_disconnect().  Otherwise the application
may end up poll()ing on a stale or wrong fd in case another part of the
application (or another thread) triggered a fatal error.
2013-07-09 18:59:11 -04:00
Kristian Høgsberg
becca5fcf7 wayland-server: Return 0 from read_events() in case of EAGAIN
Getting no data from the socket is not an error condition.  This may
happen in case of calling prepare_read() and then read_events() with
no other pending readers and no data in the socket.  In general,
read_events() may not queue up events in the given event queue.  From
a given threads point of view it doesn't matter whether events were
read and put in a different event queue or no events were read at all.
2013-07-09 18:00:00 -04:00
Neil Roberts
12cea95593 wayland-client: Treat EOF when reading the wayland socket as an error
If EOF is encountered while reading from the Wayland socket, make
wl_display_read_events() return -1 so that it will be treated as an
error. The documentation for this function states that it will set
errno when there is an error so it additionally makes up an errno of
EPIPE.

If we don't do this then when the compositor quits the Wayland socket
will be become ready for reading but wl_display_dispatch will do
nothing which typically makes the application take up 100% CPU. In
particular eglSwapBuffers will likely get stuck in an infinite busy
loop because it repeatedly calls wl_display_dispatch_queue while it
waits for the frame callback.

https://bugzilla.gnome.org/show_bug.cgi?id=703892
2013-07-09 17:59:56 -04:00
Kristian Høgsberg
d94a8722cb server: Make wl_object and wl_resource opaque structs
With the work to add wl_resource accessors and port weston to use them,
we're ready to make wl_resource and wl_object opaque structs.  We keep
wl_buffer in the header for EGL stacks to use, but don't expose it by
default.  In time we'll remove it completely, but for now it provides a
transition paths for code that still uses wl_buffer.

Reviewed-by: Jason Ekstrand<jason@jlekstrand.net>
2013-07-02 15:52:47 -04:00
Kristian Høgsberg
3c7e8bfbb4 client: Add wl_display_prepare_read() API to relax thread model assumptions
The current thread model assumes that the application or toolkit will have
one thread that either polls the display fd and dispatches events or just
dispatches in a loop.  Only this main thread will read from the fd while
all other threads will block on a pthread condition and expect the main
thread to deliver events to them.

This turns out to be too restrictive.  We can't assume that there
always will be a thread like that.  Qt QML threaded rendering will
block the main thread on a condition that's signaled by a rendering
thread after it finishes rendering.  This leads to a deadlock when the
rendering threads blocks in eglSwapBuffers(), and the main thread is
waiting on the condition.  Another problematic use case is with games
that has a rendering thread for a splash screen while the main thread
is busy loading game data or compiling shaders.  The main thread isn't
responsive and ends up blocking eglSwapBuffers() in the rendering thread.

We also can't assume that there will be only one thread polling on the
file descriptor.  A valid use case is a thread receiving data from a
custom wayland interface as well as a device fd or network socket.
The thread may want to wait on either events from the wayland
interface or data from the fd, in which case it needs to poll on both
the wayland display fd and the device/network fd.

The solution seems pretty straightforward: just let all threads read
from the fd.  However, the main-thread restriction was introduced to
avoid a race.  Simplified, main loops will do something like this:

	wl_display_dispatch_pending(display);

	/* Race here if other thread reads from fd and places events
	 * in main eent queue.  We go to sleep in poll while sitting on
	 * events that may stall the application if not dispatched. */

	poll(fds, nfds, -1);

	/* Race here if other thread reads and doesn't queue any
	 * events for main queue. wl_display_dispatch() below will block
	 * trying to read from the fd, while other fds in the mainloop
	 * are ignored. */

	wl_display_dispatch(display);

The restriction that only the main thread can read from the fd avoids
these races, but has the problems described above.

This patch introduces new API to solve both problems.  We add

	int wl_display_prepare_read(struct wl_display *display);

and

	int wl_display_read_events(struct wl_display *display);

wl_display_prepare_read() registers the calling thread as a potential
reader of events.  Once data is available on the fd, all reader
threads must call wl_display_read_events(), at which point one of the
threads will read from the fd and distribute the events to event
queues.  When that is done, all threads return from
wl_display_read_events().

From the point of view of a single thread, this ensures that between
calling wl_display_prepare_read() and wl_display_read_events(), no
other thread will read from the fd and queue events in its event
queue.  This avoids the race conditions described above, and we avoid
relying on any one thread to be available to read events.
2013-06-17 11:50:42 -04:00
Jason Ekstrand
2c7468b868 Add support for flags in the wl_map API and add a WL_MAP_ENTRY_LEGACY flag
The implementation in this commit allows for one bit worth of flags.  If
more flags are desired at a future date, then the wl_map implementation
will have to change but the wl_map API will not.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
2013-06-05 00:55:17 -04:00
Jason Ekstrand
28472970df Add a "side" field and some sanity checks to wl_map.
The original wl_map implementation did no checking to ensures that ids fell
on the correct side of the WL_SERVER_ID_START line.  This meant that a
client could send the server a server ID and it would happily try to use
it.  Also, there was no distinction between server-side and client-side in
wl_map_remove.  Because wl_map_remove added the entry to the free list
regardless of which side it came from, the following set of actions would
break the map:

1. Client creates a bunch of objects
2. Client deletes one or more of those objects
3. Client does something that causes the server to create an object

Because of the problem in wl_map_remove, the server would take an old
client-side id, apply the WL_SERVER_ID_START offset, and try to use it as a
server-side id regardless of whether or not it was valid.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
2013-06-05 00:33:57 -04:00
Rob Bradford
9fbcc7ae7d wayland-client: Avoid null dereference when handling deletion
If an unknown id is deleted then the lookup in the map will return NULL and
so we should avoid dereferencing that.

As this is unexpected behaviour log a message about the problem too.
2013-04-04 12:39:57 -04:00
Kristian Høgsberg
858fcbde59 docs: Document non-blocking behaviour of wl_display_flush() 2013-04-02 21:31:02 -04:00
Jason Ekstrand
ca5b1946cb Change wl_closure_invoke to take an opcode instead of an actual function pointer
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
2013-03-18 23:04:32 -04:00
Jonas Ådahl
cb73bffed5 client: Invoke new_id closure arguments as pointers instead of integers
This commit adds a flags parameter to wl_closure_invoke(). The so far
added flags are ment to specify if the invokation is client side or
server side. When on the server side, closure arguments of type 'new_id'
should be invoked as a integer id while on the client side they should
be invoked as a pointer to a proxy object.

This fixes a bug happening when the address of a client side 'new_id'
proxy object did not fit in a 32 bit integer.

krh: Squashed test suite compile fix from Jason Ekstrand.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2013-03-17 16:39:48 -04:00
Jonas Ådahl
e053a56251 client: Check reference count only for destroyed proxies
The llvm static analyzer tool reported "Use of memory after it is freed"
in dispatch_event() because the proxy is used after being freed if the
reference count reaches zero without the destroyed flag being set. This
would never happen in practice because the owner of the proxy object
always holds a reference until calling wl_proxy_destroy() which would
also set the destroyed flag.

Since this is the case, it is safe to do the reference count check only
if the destroyed flag is set, as it can never reach zero if not.

This commit doesn't change the behavior of the function, but makes the
static analyzer more happy.

Fixes https://bugs.freedesktop.org/show_bug.cgi?id=61385

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2013-03-17 16:24:02 -04:00
Jason Ekstrand
2fc248dc2c Clean up and refactor wl_closure and associated functions
The primary purpose of this patch is to clean up wl_closure and separate
closure storage, libffi, and the wire format.  To that end, a number of changes
have been made:

 - The maximum number of closure arguments has been changed from a magic number
   to a #define WL_CLOSURE_MAX_ARGS

 - A wl_argument union has been added for storing a generalized closure
   argument and wl_closure has been converted to use wl_argument instead of the
   combination of libffi, the wire format, and a dummy extra buffer.  As of
   now, the "extra" field in wl_closure should be treated as bulk storage and
   never direclty referenced outside of wl_connection_demarshal.

 - Everything having to do with libffi has been moved into wl_closure_invoke
   and the convert_arguments_to_ffi helper function.

 - Everything having to do with the wire format has been restricted to
   wl_connection_demarshal and the new static serialize_closure function.  The
   wl_closure_send and wl_closure_queue functions are now light wrappers around
   serialize_closure.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
2013-02-26 11:31:55 -05:00
Pekka Paalanen
a51ed6d50f client: add wl_proxy_get_class()
This is a useful shorthand for client application debugging macros,
since you can ask the object class from the object itself.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2013-02-26 11:28:21 -05:00
Kristian Høgsberg
5940419626 client: Add \since tag for wl_display_dispatch_queue_pending() documentation 2012-11-30 14:05:32 -05:00
Jonas Ådahl
d7a63fdbfb client: Don't cancel a roundtrip when any event is received
Since wl_display_dispatch() returns the number of processed events or -1
on error, only cancel the roundtrip if an -1 is returned.

This also fixes a potential memory corruption bug happening when
wl_display_roundtrip() does an early return and the callback later
writes to the then out of scope stack allocated `done' parameter.

Introduced by 33b7637b45.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2012-11-27 11:09:45 -05:00
Tiago Vignatti
5df752ab16 doc: Fix typos
Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
2012-11-23 22:51:51 -05:00
Ander Conselvan de Oliveira
fb20507881 client: Add an entry point for dispatching a queue without blocking
On the client side EGL, all the wl_buffer.release events need to be
processed before buffer allocation, otherwise a third buffer might
be allocated unnecessarily. However, the buffer allocation should
not block in the case no event was received. In order to do that, a
non-blocking queue dispatch function is needed.
2012-11-23 21:50:14 -05:00
Kristian Høgsberg
0f5d41e3bb debug: Allow WAYLAND_DEBUG=server/client for server/client side only debug
By default the server will dump protocol for both the server and its
clients when run with WAYLAND_DEBUG=1.  That's still the case, but it now
also understands WAYLAND_DEBUG=client or WAYLAND_DEBUG=server, which
will only enable debug dumping on either client or server side.
2012-11-21 17:14:55 -05:00
Martin Olsson
b46dab17f0 client: Fix source comment typos 2012-11-14 13:59:03 -05:00
Jonas Ådahl
e273c7cde3 client: Keep track of proxy validity and number of reference holders
When events are queued, the associated proxy objects (target proxy and
potentially closure argument proxies) are verified being valid. However,
as any event may destroy some proxy object, validity needs to be
verified again before dispatching. Before this change this was done by
again looking up the object via the display object map, but that did not
work because a delete_id event could be dispatched out-of-order if it
was queued in another queue, causing the object map to either have a new
proxy object with the same id or none at all, had it been destroyed in
an earlier event in the queue.

Instead, make wl_proxy reference counted and increase the reference
counter of every object associated with an event when it is queued. In
wl_proxy_destroy() set a flag saying the proxy has been destroyed by the
application and only free the proxy if the reference counter reaches
zero after decreasing it.

Before dispatching, verify that a proxy object still is valid by
checking that the flag set in wl_proxy_destroy() has not been set. When
dequeuing the event, all associated proxy objects are dereferenced and
free:ed if the reference counter reaches zero. As proxy reference counter
is initiated to 1, when dispatching an event it can never reach zero
without having the destroyed flag set.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2012-11-05 15:44:50 -05:00
Ander Conselvan de Oliveira
818bb399b0 doc: Clarify documentation about dispatching event queues
Clarify on what cases each of the dispatching functions may block, what
is the main thread and add some real world examples.
2012-10-19 16:50:29 -04:00
Ander Conselvan de Oliveira
a4dace7e30 doc: Update wl_display_get_error() documentation 2012-10-17 17:29:04 -04:00
Ander Conselvan de Oliveira
de3d0ecd44 doc: Add doxygen documentation to wl_display_get_error() 2012-10-16 10:50:57 -04:00
Ander Conselvan de Oliveira
244fe474dd doc: Document change of return value of dispatch functions 2012-10-16 10:50:28 -04:00
Ander Conselvan de Oliveira
1c10723dfe doc: Document the restriction of destroying queues before the display 2012-10-16 10:50:14 -04:00
Ander Conselvan de Oliveira
80e6b7d7ed doc: Put wl_display_flush() documentation in the right place
It seems a rebase error caused it to end up in the wrong place.
2012-10-16 10:50:02 -04:00
David Herrmann
33b7637b45 wayland-client: forward fatal errors to caller
If any callback or helper function fails with a fatal error, we now
set the last_error flag and prevent all further I/O on the wl_display. We
wake up all sleeping event-queues and notify the caller that they
should shutdown wl_display.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-15 19:23:40 -04:00
Kristian Høgsberg
edae4ffa37 wayland: Take ownership of fd in wl_display_connect_to_fd()
This means we're free to close it when we want, which we'll use to wake
up the main thread if we hit an error in a different thread.
2012-10-15 17:50:36 -04:00
David Herrmann
780b980670 wayland-client: link all event-queues of each display into a list
We need access to all event-queues of a single wl_display object. For
instance during connection-errors, we need to be able to wake up all event
queues. Otherwise, they will be stuck waiting for incoming events.

The API user is responsible to keep a wl_display object around until all
event-queues that were created on it are destroyed.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-15 17:27:59 -04:00
David Herrmann
66e4aa98cf wayland-client: add wl_display_get_error()
A server may asynchronously send errors via wl_display.error() events.
Instead of aborting we now the a "last_error" flag inside of wl_display
objects. The user can retrieve these via wl_display_get_error().

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-15 16:06:00 -04:00
Ander Conselvan de Oliveira
3f94d984f7 doc: Improve libwayland-client doxygen documentation
Document wl_proxy, wl_display and wl_event_queue classes and add a
description to all public entry points. Also fix some typos.
2012-10-15 13:07:42 -04:00