Pekka Paalanen [Fri, 29 Nov 2013 15:47:08 +0000 (17:47 +0200)]
os: use posix_fallocate in creating sharable buffers
If posix_fallocate is available, use it instead of ftruncate. Unlike
ftruncate, when posix_fallocate succeeds, it guarantees that you cannot
run out of disk space, when later writing to the mmap()'ed file.
With posix_fallocate, if os_create_anonymous_file() succeeds, the
program cannot get a SIGBUS later from accessing this file via mmap. If
there is insufficient disk space, the function fails and errno is set to
ENOSPC.
This is useful on systems, that limit the available buffer space by
having XDG_RUNTIME_DIR on a small tmpfs.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Kristian Høgsberg [Sat, 23 Nov 2013 20:24:26 +0000 (12:24 -0800)]
Add -pthread to AM_CFLAGS to do the right thing when using threads
https://bugs.freedesktop.org/show_bug.cgi?id=71633
Lubomir Rintel [Sat, 16 Nov 2013 13:31:03 +0000 (14:31 +0100)]
connection: Error out if file descriptor was not received
Otherwise the tail of fds_in buffer would just shift beyond the beginning.
That confuses the actual request handler and results in a crash further on
due to corrupted tail.
Signed-off-by: Lubomir Rintel <lkundrak@v3.sk>
Jasper St. Pierre [Wed, 13 Nov 2013 02:44:37 +0000 (21:44 -0500)]
wayland-server: Improve error messages for bad globals
A bug in Weston's toytoolkit gave me an hour of debugging headaches.
Improve the error messages that we send if a client requests an invalid
global, either by name or by version.
Jasper St. Pierre [Wed, 13 Nov 2013 02:44:36 +0000 (21:44 -0500)]
Update .gitignore for protocol/
Kristian Høgsberg [Fri, 15 Nov 2013 05:29:06 +0000 (21:29 -0800)]
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>
Pekka Paalanen [Fri, 15 Nov 2013 14:09:45 +0000 (16:09 +0200)]
protocol: add sub-surfaces to the core
The sub-surface protocol was originally committed into Weston on May
10th, 2013, in commit
2396aec6842c709a714f3825dbad9fd88478f2e6. The
design for the protocol had started in the beginning of December 2012. I
think it is high time to move this into the core now.
This patch copies the sub-surface protocol as it was in Weston on Nov
15th, 2013, into Wayland. Weston gets a patch to remove the protocol from
there.
Sub-surface is a wl_surface role. You create a wl_surface as usual, and
assign it the sub-surface role and a parent wl_surface. Sub-surfaces are
an integral part of the parent surface, and stay glued to the parent.
For window management, a window is the union of the top-level
wl_surface and all its sub-surfaces. Sub-surfaces are not clipped to the
parent, and the union of the surface tree can be larger than the
(top-level) wl_surface at its root.
The representative use case for sub-surfaces is a video player window.
When the video content is given its own wl_surface, there is no need to
modify the video frame contents after decoding or copy them into a whole
window sized buffer before submitting it to the compositor. This allows
efficient, zero-copy video presentation paths, where video decoding
hardware produces a (YUV) buffer, which eventually ends up in a
(YUV-capable) hardware overlay and is scanned out directly.
This can also be used for zero-copy presentation of windowed OpenGL
content, where the OpenGL rendering engine does not need to draw or
avoid window decorations.
Sub-surfaces allow mixing different buffer types into the same window,
e.g. software-rendered decorations in wl_shm buffers, and live content
in EGL-based buffers.
However, the sub-surface extension does not offer clipping or scaling
facilities, or accurate presentation timing. Those are topics for
additional extensions.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Lubomir Rintel [Fri, 15 Nov 2013 13:17:56 +0000 (14:17 +0100)]
shm: Avoid file descriptor leak upon unsuccessful mmap
It would be possible to make the compositor leak file descriptors by
passing descriptors of open unmmapable files to it, such as /dev/null.
Signed-off-by: Lubomir Rintel <lkundrak@v3.sk>
Neil Roberts [Thu, 14 Nov 2013 12:28:51 +0000 (12:28 +0000)]
Add documentation for wl_shm_buffer_begin/end_access
It's not obvious that these functions are needed so it would be good
to have some documentation for them.
Kristian Høgsberg [Fri, 15 Nov 2013 22:37:55 +0000 (14:37 -0800)]
scanner: Add location to elements so we can give better errors/warnings
Kristian Høgsberg [Fri, 15 Nov 2013 22:29:40 +0000 (14:29 -0800)]
scanner: Make fail() function use va_list and elaborate a few errors
Kristian Høgsberg [Fri, 15 Nov 2013 22:21:11 +0000 (14:21 -0800)]
scanner: Introduce struct location for tracking source locations
Kristian Høgsberg [Fri, 15 Nov 2013 21:26:03 +0000 (13:26 -0800)]
scanner: Warn about requests with more than one new-id and don't generate stubs
The generated code only support one new-id per request, since the stubs
return the new proxy. It's still possible to send requests with multiple
new-id arguments, but it must be done with
wl_proxy_marshal_array_constructor().
Kristian Høgsberg [Thu, 14 Nov 2013 05:11:17 +0000 (21:11 -0800)]
server: Start documenting the server side API
This is now public, stable API, so it seems prudent to actually document it.
Neil Roberts [Wed, 13 Nov 2013 15:32:05 +0000 (15:32 +0000)]
server: Add API to protect access to an SHM buffer
Linux will let you mmap a region of a file that is larger than the
size of the file. If you then try to read from that region the process
will get a SIGBUS signal. Currently the clients can use this to crash
a compositor because it can create a pool and lie about the size of
the file which will cause the compositor to try and read past the end
of it. The compositor can't simply check the size of the file to
verify that it is big enough because then there is a race condition
where the client may truncate the file after the check is performed.
This patch adds the following two public functions in the server API
which can be used wrap access to an SHM buffer:
void wl_shm_buffer_begin_access(struct wl_shm_buffer *buffer);
void wl_shm_buffer_end_access(struct wl_shm_buffer *buffer);
The first time wl_shm_buffer_begin_access is called a signal handler
for SIGBUS will be installed. If the signal is caught then the buffer
for the current pool is remapped to an anonymous private buffer at the
same address which allows the compositor to continue without crashing.
The end_access function will then post an error to the buffer
resource.
The current pool is stored as part of some thread-local storage so
that multiple threads can safely independently access separate
buffers.
Eventually we may want to add some more API so that compositors can
hook into the signal handler or replace it entirely if they also want
to do some SIGBUS handling.
Peter Hutterer [Wed, 23 Oct 2013 04:56:04 +0000 (14:56 +1000)]
protocol: validate the protocol against a dtd
The scanner is not very forgiving if the protocol doesn't match it's
expectations and crashes without much of a notice. Thus, validate the protocol
against a DTD.
Move the protocol subdir forward so we validate first before trying anything
else, and install the DTD so we can validate weston's protocols as well.
Kristian Høgsberg [Wed, 23 Oct 2013 16:25:08 +0000 (09:25 -0700)]
configure.ac: Bump version to 1.3.90 for the master branch
Kristian Høgsberg [Mon, 21 Oct 2013 21:39:06 +0000 (14:39 -0700)]
wayland: Be consistent about #include-guard names
We had a mix of inconsistent names, some of which were non-conformant.
Standardize on all-uppercase-and-underscore naming convention.
https://bugs.freedesktop.org/show_bug.cgi?id=70679
José Bollo [Fri, 11 Oct 2013 07:14:25 +0000 (09:14 +0200)]
protocol: Fix typo in documentation
Kristian Høgsberg [Wed, 9 Oct 2013 23:20:54 +0000 (16:20 -0700)]
configure.ac: Bump version to 1.3
Kristian Høgsberg [Tue, 8 Oct 2013 04:36:31 +0000 (21:36 -0700)]
scanner: Handle unrecognized invocation mode
Print usage if we don't recognize the invocation mode. Also fixes
uninitialized variable warning.
Kristian Høgsberg [Thu, 3 Oct 2013 05:14:57 +0000 (22:14 -0700)]
configure.ac: Bump version to 1.2.92
Neil Roberts [Wed, 25 Sep 2013 09:39:12 +0000 (10:39 +0100)]
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.
Kristian Høgsberg [Sun, 22 Sep 2013 21:12:26 +0000 (14:12 -0700)]
configure.ac: Bump version to 1.2.91
Jason Ekstrand [Fri, 20 Sep 2013 13:27:06 +0000 (08:27 -0500)]
Export the Wayland protocol XML file
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Marek Ch [Wed, 18 Sep 2013 15:29:50 +0000 (17:29 +0200)]
tests: add wl_resource tests
Marek Ch [Wed, 18 Sep 2013 15:29:49 +0000 (17:29 +0200)]
tests: add unit tests for wl_signal
Test wl_signal initialization, adding and getting listeners and emitting
Marek Ch [Wed, 18 Sep 2013 15:29:48 +0000 (17:29 +0200)]
tests: extended message when leak in test is detected
When memory or fd leak is detected, print how many blocks of memory were
allocated and not freed, respectively how many files were opened/unclosed.
Chang Liu [Wed, 18 Sep 2013 10:45:06 +0000 (10:45 +0000)]
client: fix an inconsistency in documentation
The errno is set to EAGAIN when there are undispatched events, according
to L1066 of wayland-client.c.
Aaron Faanes [Tue, 17 Sep 2013 21:44:24 +0000 (16:44 -0500)]
doc: Slight tweaks to wl_listener
Prefer \comment over // in code blocks for consistency's sake and keep
variable definitions separated by a line from the rest of the body.
Aaron Faanes [Tue, 17 Sep 2013 21:42:43 +0000 (16:42 -0500)]
utils: Document wl_container_of
Aaron Faanes [Tue, 17 Sep 2013 21:40:49 +0000 (16:40 -0500)]
doc: Create \comment alias for C-style comments
Since /* */ do not nest, documentation is forced to either use C++ style
// comments or some other foreign notation. This commit provides an alias
that allows C-style comments to be introduced in code blocks that support
aliases.
It should be noted that this macro will not work within \code blocks, as
Doxygen commands are ignored there. Instead, Doxygen's fenced code
blocks (created via ~~~) must be used for proper output. To demonstrate:
~~~
struct example_node {
int id;
\comment{Other members ...}
};
~~~
will roughly yield the following HTML (excluding syntax highlighting):
<pre>
struct example_node {
int id;
/* Other members ... */
};
</pre>
Aaron Faanes [Sun, 15 Sep 2013 18:37:09 +0000 (13:37 -0500)]
doc: Include wayland-util.* for doxygen output
This commit creates a shared file list that is included by both the
client and the server for the XML Makefile targets, as classes within
util are used by both the client and the server.
Aaron Faanes [Sun, 15 Sep 2013 18:37:08 +0000 (13:37 -0500)]
wayland-server: Improve wording for wl_signal_get's doc
The old description was a bit vague; this commit hopefully improves
describing what is returned.
Aaron Faanes [Sun, 15 Sep 2013 18:37:07 +0000 (13:37 -0500)]
utils: Add doxygen for wayland-util.h
This is needed for doxygen to generate output for macro definitions, such
as wl_container_of, that are contained by this file. Classes like
wl_list would be documented regardless.
Aaron Faanes [Sun, 15 Sep 2013 18:37:06 +0000 (13:37 -0500)]
utils: Reference some useful methods in wl_signal's doxygen
This commit adds a bit more detail on the lifecycle of a signal.
Aaron Faanes [Sun, 15 Sep 2013 18:09:18 +0000 (13:09 -0500)]
wayland-server: Document wl_listener
This patch takes Kristian's comments into account, adding a demonstration and
giving a more thorough idea of how wl_listener is used.
Chang Liu [Sun, 8 Sep 2013 11:12:33 +0000 (11:12 +0000)]
gitignore: add ./compile
./compile is a GNU autotools helper script and should be ignored by git
Rob Bradford [Fri, 6 Sep 2013 16:56:27 +0000 (17:56 +0100)]
wayland-server: Add a wl_resource_for_each_safe macro
A version of wl_resource_for_each that is safe for iteration when items
in the list are removed.
Aaron Faanes [Wed, 28 Aug 2013 23:02:02 +0000 (18:02 -0500)]
utils: tweak wl_list for better doxygen output
Aaron Faanes [Wed, 28 Aug 2013 23:02:01 +0000 (18:02 -0500)]
wayland-server: Document wl_signal
Aaron Faanes [Wed, 28 Aug 2013 22:43:34 +0000 (17:43 -0500)]
wayland-server: Fix a uninitialized warning from clang
This warning is unnecessary, since the pointer in question is only used
for pointer arithmetic, but setting it explicitly to NULL doesn't hurt.
Kristian Høgsberg [Fri, 30 Aug 2013 21:54:40 +0000 (14:54 -0700)]
configure.ac: Bump version to 1.2.90 for master branch
Kristian Høgsberg [Tue, 13 Aug 2013 19:06:30 +0000 (20:06 +0100)]
scanner: Emit wl_*_destroy stub even if interface has a destructor
If an interface has a destructor but no 'destroy' method we used to
not emit a destroy method. Now with the fix for missing destroy
requests for wl_pointer etc we need to emit the local wl_*_destroy
always.
Kristian Høgsberg [Tue, 13 Aug 2013 19:06:29 +0000 (20:06 +0100)]
protocol: Add release requests for wl_pointer, wl_keyboard, and wl_touch
We missed destroy requests in the 1.0 protocol and since the scanner
generates local-only *_destroy requests in that case we can't add
destroy requests without breaking protocol. A client needs to verify
that the server provides a version 3 seat to use the protocol destructor
so the name needs to be something else than wl_*_destroy.
v2 (Rob Bradford): Rebased, bumped the protocol versions and added since
attributes to the requests.
Jason Ekstrand [Thu, 18 Jul 2013 02:58:47 +0000 (21:58 -0500)]
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>
Jason Ekstrand [Thu, 18 Jul 2013 02:58:46 +0000 (21:58 -0500)]
Add support for server-side language bindings
This commit adds support for server-side languages bindings. This is done
in two ways:
1. Adding a wl_resource_set_dispatcher function that corresponds to
wl_resource_set_interface. The only difference between the two functions
is that the new version takes a dispatcher along with the implementation,
data, and destructor. This allows for runtime calling of native language
functions for callbacks instead of having to generate function pointers.
2. Adding versions of wl_resource_post_event and wl_resource_queue_event
that take an array of wl_argument instead of a variable argument list.
This allows for easier run-time argument conversion and removes the need
for libffi-based calling of variadic functions.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Jason Ekstrand [Sun, 18 Aug 2013 21:53:54 +0000 (16:53 -0500)]
doc: Add a section on interface and protocol object versioning
There have been a lot of questions asked lately about versioning of
interfaces and protocol objects. This addition to the documentation should
clear up some of those questions.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Jason Ekstrand [Sun, 18 Aug 2013 21:52:36 +0000 (16:52 -0500)]
doc: Update the ID alocation section
The method described of alocation IDs has been wrong at least since version
1.0. This commit updates it to correspond to the way IDs are chosen in
versions >= 1.0.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Peter Hutterer [Thu, 15 Aug 2013 10:58:10 +0000 (20:58 +1000)]
publican: only split chapters and top-level sections onto separate pages
When generating HTML, don't split once we're into subjections. This
generates a single page for each protocol interface instead of the previous
separate pages for requests, events and enums.
No effect on the rest of the HTML configuration.
Bryce W. Harrington [Fri, 9 Aug 2013 17:44:59 +0000 (17:44 +0000)]
protocol: Improve a bit of grammar for wl_surface::attach description
Signed-off-by: Bryce Harrington <b.harrington@samsung.com>
Rob Bradford [Mon, 22 Jul 2013 16:30:52 +0000 (17:30 +0100)]
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.
Rob Bradford [Mon, 22 Jul 2013 16:30:51 +0000 (17:30 +0100)]
wayland-server: Add a wl_resource_for_each macro
This macro allows you to correctly iterate through a list of resources
handling the opaque nature of this type.
Bryce W. Harrington [Fri, 9 Aug 2013 01:47:07 +0000 (01:47 +0000)]
protocol: Fix pluralization of user in popup_done description
Signed-off-by: Bryce Harrington <b.harrington@samsung.com>
Bryce W. Harrington [Fri, 9 Aug 2013 01:47:07 +0000 (01:47 +0000)]
protocol: Improve grammar for set class description
Signed-off-by: Bryce Harrington <b.harrington@samsung.com>
Bryce W. Harrington [Fri, 9 Aug 2013 01:47:07 +0000 (01:47 +0000)]
protocol: Add missing d to 'x an y'
Signed-off-by: Bryce Harrington <b.harrington@samsung.com>
Bryce W. Harrington [Fri, 9 Aug 2013 01:47:07 +0000 (01:47 +0000)]
protocol: Fix typo by removing a redundant 'a'
Signed-off-by: Bryce Harrington <b.harrington@samsung.com>
Bryce W. Harrington [Fri, 9 Aug 2013 01:47:06 +0000 (01:47 +0000)]
client: Improve spelling and grammar in comments
Signed-off-by: Bryce Harrington <b.harrington@samsung.com>
Bryce W. Harrington [Fri, 9 Aug 2013 01:47:05 +0000 (01:47 +0000)]
publican: Fix grammar several places in Protocol docs
Signed-off-by: Bryce Harrington <b.harrington@samsung.com>
Bryce W. Harrington [Fri, 9 Aug 2013 01:47:05 +0000 (01:47 +0000)]
publican: Drop unneeded 'of'
Signed-off-by: Bryce Harrington <b.harrington@samsung.com>
Bryce W. Harrington [Fri, 9 Aug 2013 01:47:04 +0000 (01:47 +0000)]
publican: Cleanup Preface's grammar.
Signed-off-by: Bryce Harrington <b.harrington@samsung.com>
Tomeu Vizoso [Thu, 8 Aug 2013 08:31:56 +0000 (10:31 +0200)]
server: Release additional_shm_formats array at display destruction
Peter Hutterer [Wed, 7 Aug 2013 01:05:59 +0000 (11:05 +1000)]
scanner: check for wayland-scanner.pc before using variables
If wayland-scanner.pc can't be found the variables end up being set
irrespectively, leaving the user with odd compiler errors about missing
headers, etc.
Peter Hutterer [Wed, 7 Aug 2013 01:05:58 +0000 (11:05 +1000)]
scanner: expand help string
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer [Wed, 7 Aug 2013 01:05:57 +0000 (11:05 +1000)]
scanner: support help and --help
wayland-scanner without arguments prints out usage. With help or --help it
waits for stdin to supply something which isn't quite as informative as
printing out the help.
This patch also moves the strcmp for args up to have all of them in one
location.
Kristian Høgsberg [Wed, 7 Aug 2013 16:17:02 +0000 (09:17 -0700)]
Don't include wayland-server.h in wayland-private.h
We just declare struct wl_display manually instead.
Tomeu Vizoso [Tue, 6 Aug 2013 18:05:53 +0000 (20:05 +0200)]
shm: Add API for renderers to register additional pixel formats
Kristian Høgsberg [Tue, 6 Aug 2013 17:15:35 +0000 (10:15 -0700)]
server: Set client->error when we fail to send a closure
We we're using wl_event_loop_add_idle() here, but if we're failing
because of OOM, that will typically also fail. Instead, use the
existing client->error flag, which will break out of the event
handling loop and shut down the client.
Kristian Høgsberg [Tue, 6 Aug 2013 16:50:14 +0000 (09:50 -0700)]
server: Handle OOM properly when we fail to allocate a send closure
If we can't allocate a closure, don't just silently continue. Set
client->error so we shut down the client when we're done processing events.
Jiergir Ogoerg [Mon, 29 Jul 2013 23:50:44 +0000 (16:50 -0700)]
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.
Tomeu Vizoso [Thu, 11 Jul 2013 14:08:20 +0000 (16:08 +0200)]
protocol: Copy missing pixel formats from wl_drm to wl_shm
Kristian Høgsberg [Sat, 13 Jul 2013 05:30:45 +0000 (01:30 -0400)]
Bump version to 1.2.0
Kristian Høgsberg [Sat, 13 Jul 2013 04:42:14 +0000 (00:42 -0400)]
wayland-client: Handle potential NULL-deref
Instead, return -1 on out-of-memory. errno will be set to ENOMEM by
the failing malloc.
Kristian Høgsberg [Sat, 13 Jul 2013 04:35:21 +0000 (00:35 -0400)]
scanner: Fail more gracefully on out-of-memory
Failing with an error message and error code is little nicer. I doubt we'll
hit this case much, but it makes the static analysis happy.
Mariusz Ceier [Wed, 10 Jul 2013 21:40:56 +0000 (23:40 +0200)]
connection: Handle empty signature and signature with just a version.
Functions like wl_argument_from_va_list expect from get_next_argument,
to initialize details->type but when the signature is empty or contains
only version (like in desktop-shell-protocol.c in weston) it is left
uninitialized.
This patch fixes it, by initializing details->type with '\0' value,
signaling end of arguments.
Signed-off-by: Mariusz Ceier <mceier+wayland@gmail.com>
Kristian Høgsberg [Tue, 9 Jul 2013 23:27:08 +0000 (19:27 -0400)]
Bump version to 1.1.91
Kristian Høgsberg [Tue, 9 Jul 2013 23:18:10 +0000 (19:18 -0400)]
Replace two remaining wl_display_add_gloavl() occurences
Kristian Høgsberg [Tue, 9 Jul 2013 22:59:11 +0000 (18:59 -0400)]
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.
Kristian Høgsberg [Tue, 9 Jul 2013 21:55:45 +0000 (17:55 -0400)]
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.
Neil Roberts [Tue, 9 Jul 2013 13:10:45 +0000 (14:10 +0100)]
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
Kristian Høgsberg [Mon, 8 Jul 2013 22:45:41 +0000 (18:45 -0400)]
wayland-server: Add wl_global_create/destroy()
This patch introduces wl_global_create() and wl_global_destroy() as
replacements for wl_display_add_global() and wl_display_remove_global().
The add/remove_global API did not allow a compositor to indicate
the implemented version of a global, it just took the version from
the interface meta data. The problem is that the meta data
(which lives in libwayland-server.so) can get out of sync with a
compositor implementation. The compositor will then advertise a
higher version of a global than what it actually implements.
The new API lets a compositor pass in a version when it registers
a global, which solves the problem. The add/remove API is deprecated
with this patch and will be removed.
Daiki Ueno [Tue, 2 Jul 2013 09:38:15 +0000 (18:38 +0900)]
build: Add wayland-scanner.pc.
To allow user program to include wayland-scanner.m4 in tarball, move
the path variables from it into wayland-scanner.pc.
Daiki Ueno [Tue, 2 Jul 2013 09:38:14 +0000 (18:38 +0900)]
build: Install wayland-scanner.mk under $(pkgdatadir).
Kristian Høgsberg [Tue, 2 Jul 2013 20:59:44 +0000 (16:59 -0400)]
wayland-server: Free non-legacy wl_resource structs during wl_client_destroy
We need to free the non-legacy resources during client shutdown as well.
Kristian Høgsberg [Tue, 2 Jul 2013 20:57:45 +0000 (16:57 -0400)]
wayland-server: Remove left-over double free in unbind_resource() helper
Kristian Høgsberg [Tue, 2 Jul 2013 19:39:03 +0000 (15:39 -0400)]
wayland-server: Remove error event posting from wl_resource_create
The wl_client_add/new_object() functions sends out an NO_MEMORY error if
the allocation fails. This was convenient in a couple of places where
that was all the error handling that was needed. Unfortunately that
looks like out-of-memory isn't handled at the call site and set a bad
precedent for not cleaning up properly or not handling at all.
As we're introducing wl_resource_create() as a replacement for those two
functions, let's remove the automatic error event posting and require
the caller to do that if necessary.
This commit also introduces a new helper, wl_client_post_no_memory() to
make it possible to send NO_MEMORY events from bind where we don't have
a wl_resource.
Kristian Høgsberg [Tue, 2 Jul 2013 18:34:42 +0000 (14:34 -0400)]
wayland-server: Mark wl_client_add/new_object as deprecated
Kristian Høgsberg [Tue, 2 Jul 2013 18:09:16 +0000 (14:09 -0400)]
wayland-server: Dont free resource in user data destroy callback
Jason Ekstrand [Tue, 2 Jul 2013 18:57:10 +0000 (14:57 -0400)]
wayland-server: Verify request versions before invoking handler
This commit provides a layer of protection for the compositor in the form
of message version checking. We track version information in the
wl_resource and now use this version information to verify that a request
exists in that protocol version before invoking it. This way libwayland
won't accidentally invoke a request that does not exist and thereby cause
the compositor to crash.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Jason Ekstrand [Fri, 28 Jun 2013 01:09:20 +0000 (20:09 -0500)]
Add wl_resource_create() and a version field to wl_resource
A new function, wl_resource_create(), lets the compositor create a
wl_resource for a given version of the interface. Passing 0 for the
object ID will allocate a new ID. The implementation, user data and
destructor can be set with wl_resource_set_implementation().
These two functions deprecates wl_client_add/new_object and the
main difference and motivation is the ability to provide a version number
for the resource. This lets the compositor track which version of the
interface a client has created and we'll use that to verify incoming requests.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Jason Ekstrand [Fri, 28 Jun 2013 01:09:19 +0000 (20:09 -0500)]
Add version information to wl_message signatures.
This commit adds version information to wl_message signatures and a
wl_message_get_since function to retrieve. The since version comes in the
form of a (possible) integer at the begining of the message. If the
message starts with an integer, then it specifies the "since" version of
that message. Messages present in version one do not get this "since"
information. In this way we can run-time detect the version information
for a structure on a per-message basis.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Kristian Høgsberg [Fri, 28 Jun 2013 01:09:18 +0000 (20:09 -0500)]
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>
Rob Bradford [Mon, 24 Jun 2013 15:50:41 +0000 (16:50 +0100)]
protocol: add no_keymap format to keymap formats
This format is used to specify that the key button events received are not in
relation to any key map and that the codes should be interpreted directly.
v2: Use zero for the no keymap enum value and enhance the documentation
for the enum entry.
Jason Ekstrand [Fri, 21 Jun 2013 01:36:49 +0000 (20:36 -0500)]
Change wl_shm_buffer to use a resource pointer
This commit also has the effect of making wl_shm_buffer no longer a
wl_buffer derivative.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Jason Ekstrand [Fri, 21 Jun 2013 01:36:48 +0000 (20:36 -0500)]
Change SHM wl_buffer functions to use the wl_shm_buffer structure
This commit does not break ABI. It merely changes the types of some things
and adds a wl_shm_buffer_get function.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Jason Ekstrand [Fri, 21 Jun 2013 01:36:47 +0000 (20:36 -0500)]
Add a wl_resource_instance_of function
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Jason Ekstrand [Tue, 18 Jun 2013 17:42:40 +0000 (12:42 -0500)]
Free non-legacy resources inside wl_resource_destroy
This commit makes wl_resource_destroy automatically free all non-legacy
resource structures. Since wl_resource is now an opaque structure it
doesn't make sense for the clients to be freeing it. This checks to make
sure that it was added through wl_client_add_object or wl_client_new_object
and not wl_client_add_resource before it frees it. This way if it is a
legacy resources embedded in a structure somewhere we don't have an invalid
free.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Ander Conselvan de Oliveira [Tue, 11 Jun 2013 15:21:32 +0000 (18:21 +0300)]
doc: Add a small contributing guide
Document what we expect in terms of commit messages and coding style.
New contributors are usually unaware of this, so it is good to have a
document to point them too.
Kristian Høgsberg [Sun, 17 Mar 2013 18:21:48 +0000 (14:21 -0400)]
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.
Jason Ekstrand [Fri, 14 Jun 2013 15:07:52 +0000 (10:07 -0500)]
server: Add aditional wl_resource accessors
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>