Commit Graph

1833 Commits

Author SHA1 Message Date
Jonathon Jongsma
451ac31a7a Remove use of global 'reds' from VDIReadBuf functions
Add a new 'state' property to VDIReadBuf so that we can refer back to
the VDIPortState struct from the readbuf functions.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-11 13:57:32 +00:00
Jonathon Jongsma
b830f193a1 char-device: use local 'reds' variable
Store a reference to the server in the SpiceCharDeviceState struct and
use that rather than the global 'reds' variable

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-11 13:57:30 +00:00
Jonathon Jongsma
82fe27d753 Add RedsState member to RedLinkInfo
This allows us to use local 'reds' variables in all of the various async
callbacks rather than using the global 'reds' variable.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-11 13:57:15 +00:00
Jonathon Jongsma
2726e04a9a Move 'core' into RedsState struct
Also add reds_get_core_interface() accessor for external use.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-11 11:55:30 +00:00
Christophe Fergeau
35d1fbff1d reds: Pass RedState instance to reds_accept()
Rather than relying on a global 'reds' variable, we can pass the needed
instance through the callback user data.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-10 17:30:03 +00:00
Christophe Fergeau
3fa733a800 reds: Make sure accept_ssl_connection() gets a reds instance
Commit 3a66b75 changed reds_accept_ssl_connection() to expect a RedState
instance when its called, but the core->watch_add() which is calling it
was not changed accordingly. This causes a crash when connecting through
SSL.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-10 17:29:48 +00:00
Marc-André Lureau
8777864311 Handle GL_DRAW_DONE
When a client is done with drawing and sends
SPICE_MSGC_DISPLAY_GL_DRAW_DONE, or when it ends, update the number of
async counts.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
[reduce critical message to a warning; do not reset gl_draw_ongoing
 - Frediano Ziglio]
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-09 14:01:30 +00:00
Marc-André Lureau
381dc93ec0 Handle GL_DRAW messages
Create an async, and marshall the GL_DRAW message. Count number of
clients, and wait until gl_draw_async_count is 0 to complete the async.
The count is going to be updated in the following patch when the client
is done with the draw.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
[removed unused sent field; move gl_draw_async_count to DisplayChannel
 - Frediano Ziglio]
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-09 14:01:25 +00:00
Marc-André Lureau
5881b40ebd Send current GL scanout to new client
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
2016-02-09 14:01:20 +00:00
Marc-André Lureau
7a06efde1c Handle GL_SCANOUT messages
Go through dispatcher and marshall scanout message. Since the marshaller
and the QXL state are manipulated from different threads, add a mutex to
protect the current scanout.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
2016-02-09 14:01:17 +00:00
Marc-André Lureau
ebf461b8e6 Add new spice-gl stubs API
- spice_qxl_gl_scanout() to take the current scanout

- spice_qxl_gl_draw_async() to draw the scanout, is like other Spice async
  functions, it takes a cookie and will return in the
  QXLInterface.async_complete()

Two new fields are also added to QXLState, in order to save the current
scanout, and the pending async.

A scanout can't be updated if there are pending draw atm. Discarding
outdated draws is left as a future improvement to allow updating the
scanout without waiting for draw async to be done.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
[make QXL function names more coherent - Frediano Ziglio]
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-09 14:01:12 +00:00
Marc-André Lureau
9766619dff red-channel: return number of created pipe items
This is useful in the following patches to count the number of replies
to wait for.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
2016-02-09 14:01:08 +00:00
Jonathon Jongsma
b0b64bea59 Add RedsState arg to reds_handle_channel_event()
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-09 11:10:00 +00:00
Jonathon Jongsma
3a66b755bd Add RedsState arg to reds_init_client_[ssl_]connection()
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-09 10:56:47 +00:00
Jonathon Jongsma
c141dcb850 Rename vdi_port_read_buf_get() to match convention
Since this is technically a RedsState method, name it as such.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-09 10:46:32 +00:00
Frediano Ziglio
1cf96a58ec record: save real time during recording
Instead of using CPU time use a timer depending on real times.
Currently that time in the record log is not used.
However if we want to reproduce problems with stream would be useful
to have real times instead.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-02-05 15:48:35 +00:00
Frediano Ziglio
8fc8b69bff channel: fix typo in comment
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Victor Toso <victortoso@redhat.com>
2016-02-05 15:47:22 +00:00
Jonathon Jongsma
1884b3ac99 Move ssl_parameters to RedsState struct
Removing more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-04 09:19:25 +00:00
Jonathon Jongsma
4b228d5c1f Move agent_mouse to RedsState struct
Required adding a RedsState arg to reds_get_agent_mouse()

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-04 08:55:43 +00:00
Jonathon Jongsma
e7e42f4126 Move streaming_video to RedsState struct
Also requires adding reds_get_streaming_video() accessor so that other
files can check this value.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-04 08:55:43 +00:00
Marc-Andre Lureau
df7ba60503 tests: link test-qxl-parsing with libserver
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-03 17:33:15 +00:00
Frediano Ziglio
56182be522 worker: don't do too much polling
Now that processing is correctly restored there is no need to keep
polling to avoid main loop hangs. Reduce the polling count to 1
(just try once).
This reduce cpu usage if guests are mainly idle.
If you consider 100 guests waiting to login with cursor blinking
and considering the polling was done 200 times every 10ms (maximum)
just the cursor blinking was causing 10100 loop iterations per second
while now only 200 are needed (considering cursor blinking every
second).

Signed-by: Frediano Ziglio <figlio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-02-03 16:03:54 +00:00
Frediano Ziglio
916e48e331 worker: avoid blocking loop
Make sure we process commands after we can send data to client.
If during processing we detected that there was too much data in the
clients queues the processing of commands just stop till the next
iteration.
However if all data are pushed in a single iteration of the loop
and commands were already processed there was the (remote) possibility
that the loop hangs till a separate event (like a screen resize on
client window) arrive.
I manage to reproduce and after half an hour no events arrived.
This patch detect that processing was stuck and now we can process new
commands and force a new iteration.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-02-03 16:03:54 +00:00
Frediano Ziglio
77adbb7574 replay: remove a message that could be caused by a race condition
The req_cmd_notification callback is called by spice-server when it
has processed all commands and wants to be notified (by a wakeup) that
new commands have been appended to the command queue.
Replay utility tries to fill the commands when it detects that
spice-server is trying to read commands but there are no more commands.
However, new commands are appended in a separate thread so if the main
red worker loop on spice-server is really tight this request can
happen.
Avoid printing any message on this condition, message will be appended
and loop woken up when replay code can do it.

Signed-by: Frediano Ziglio <figlio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-02-03 16:03:17 +00:00
Frediano Ziglio
5c460de1a3 worker: push data when clients can receive them
During every iteration of the main worker loop, outgoing data was pushed to
the client. However, there was no guarantee that the loop would be woken up
in every situation. So there were some conditions where the loop would stop
iterating until a new event was sent.

Currently, the events that can wake up the main worker loop include:
 - data from dispatcher (including wakeups from the guest)
 - data from clients
 - timeouts on a stream
 - other timeouts
 - polling

This patch adds a new wakeup event: when we have items that are queued to
be sent to a client, we set up a watch event for writing data to the
client. If no items are waiting to be sent, this watch will be disabled.
This allows us to remove the explicit push from the main worker loop.

This has some advantages:
 - it could lower latency as we don't have to wait for a polling timeout.
   From my experiments using a tight loop (so not really the ideal
   condition to see the improvements) the total time was reduced by 2-3%)
 - helps reduce the possibility of hanging loops
 - avoids having to scan all clients to detect which one can accept data.

Signed-by: Frediano Ziglio <figlio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-02-03 16:02:37 +00:00
Jonathon Jongsma
5a8ccd1ac7 Move zlib_glz_state to RedsState struct
Also required adding reds_get_zlib_glz_state() for external access.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-03 15:14:46 +00:00
Jonathon Jongsma
ffd2cda51e Move exit_on_disconnect to RedsState struct
Removing more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-02-03 15:05:48 +00:00
Jonathon Jongsma
9c512617cb Move agent_file_xfer to RedsState struct
Removing more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-03 15:03:21 +00:00
Jonathon Jongsma
fe4db36783 Move agent_copypaste to RedsState struct
Removing more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-03 15:01:39 +00:00
Frediano Ziglio
7a11b96095 compatibility patch for event loop
This patch use old code to implement timer events.
The new version use some function from GLib 2.34 however some systems
(like RHEL 6) have former GLib version (RHEL 6 has GLib 2.28 installed)

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-02-03 13:27:16 +00:00
Jonathon Jongsma
b85c8295d6 Remove use of global 'reds' var from spice_server_remove_interface()
Since this is public API, we can't easily change the signature of the
function to take a RedsState argument, so instead we apply a hack and
store the reds argument inside the device state struct when the
interface is added, and retrieve it for use later when it is removed.

Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-02-03 08:41:37 +00:00
Jonathon Jongsma
41adaa15ba Move ticketing_enabled to RedsState struct
Removing more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-03 08:33:42 +00:00
Jonathon Jongsma
da6618681c Move jpeg_state to RedsState struct
Also required adding reds_get_jpeg_state() for external access.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-02 15:58:47 +00:00
Jonathon Jongsma
f23c03e37b Move image_compression to RedsState struct
Removing more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-02 15:45:10 +00:00
Jonathon Jongsma
70a5cc9b09 Make default_security and channels_security non-global
Move them into the RedsState struct, adjust functions that use these
variables to take a RedsState arg.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-02 15:18:30 +00:00
Frediano Ziglio
8b14dc113c red-channel: send marshaller message fd
Send the fd associated to the last message sent.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-02 12:52:10 +00:00
Marc-Andre Lureau
15c908ef25 tests: make sure that the default rule builds all tests
The default rule being "all", it builds noinst_PROGRAMS but not
check_PROGRAMS. Let's build all the tests by default.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-02 11:36:10 +00:00
Victor Toso
0f4dd2730b reds: remove unused structs
RedsMigSpiceMessage and RedsMigCertPubKeyInfo

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-01 15:42:34 +00:00
Frediano Ziglio
3cc00f1207 reds: constify renderers_info array
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
Acked-by: Victor Toso <victortoso@redhat.com>
2016-02-01 15:24:32 +00:00
Frediano Ziglio
e940ba1fe7 reds: remove default_renderer as field
Was used to just assure there was at least one renderer in the list.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-02-01 15:24:13 +00:00
Jonathon Jongsma
c5ec8760f8 Move spice_uuid, spice_uuid_is_set to RedsState struct
Removing more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-01 15:20:54 +00:00
Jonathon Jongsma
a826bcad4e Move spice_name to RedsState struct
Remove more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-01 15:20:54 +00:00
Jonathon Jongsma
fdcd8980ce Move sasl_enabled, sasl_appname to RedsState struct
Removing more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-01 15:09:39 +00:00
Jonathon Jongsma
47c42d4f75 Move taTicket to RedsState struct
Removing more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-01 15:09:39 +00:00
Jonathon Jongsma
1333e0ee8c Move spice_family to RedsState struct
Removing more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-01 15:09:39 +00:00
Jonathon Jongsma
5aad27b25c Move spice_addr to RedsState struct
Removing more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-01 14:46:24 +00:00
Jonathon Jongsma
905bfc8dbb Move migration_interface to RedsState struct
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-01 14:46:24 +00:00
Jonathon Jongsma
deb6afc325 Move vdagent to RedsState struct
Also change API of reds_has_vdagent() to take RedsState arg.  Removes
another global variable.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-01 14:05:36 +00:00
Jonathon Jongsma
6806bb6d46 Move spice_listen_socket_fd to RedsState struct
Removing more global variables

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-02-01 13:57:56 +00:00
Jonathon Jongsma
d4d6747937 Move spice_secure_port to RedsState struct
removing more global variables

Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-29 10:38:51 +00:00
Jonathon Jongsma
40f1e9429b Move spice_port to RedsState struct
Remove another global variable

Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-29 10:36:52 +00:00
Jonathon Jongsma
8c8888e009 Change init_vd_agent_resources() to take RedsState arg
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-29 10:33:39 +00:00
Frediano Ziglio
3894b066c4 worker: unify flush_cursor_commands and flush_display_commands
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-01-29 00:20:10 +00:00
Frediano Ziglio
1020736efd worker: use glib main loop
Use the glib mainloop instead of writing our own. The glib loop is both
cleaner to use and is more extensible. It is also very mature and
reduces the maintenance burden on the spice server.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-01-28 16:16:50 +00:00
Jonathon Jongsma
b8066339bf Move default_renderer into RedsState
Not global.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-28 15:59:11 +00:00
Jonathon Jongsma
43a857f2ef main_channel_init() -> main_channel_new()
Rename to make function name more consistent

Acked-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-28 15:34:53 +00:00
Jonathon Jongsma
3881abc081 inputs_init() -> inputs_channel_new()
Rename function to be more consistent

Acked-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-28 15:34:53 +00:00
Jonathon Jongsma
ab55619492 Remove global inputs channel
Make the RedsState object own an InputsChannel object rather than
having a global inputs channel. This means changing a lot of
inputs-related API to take an InputsChannel* argument and moving the
keyboard, mouse, and tablet objects into the InputsChannel object.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-28 15:34:52 +00:00
Frediano Ziglio
a61ab509b2 worker: remove useless check
display_channel is never NULL.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
2016-01-28 08:15:50 +00:00
Frediano Ziglio
17684522e1 worker: remove useless test
red_channel_max_pipe_size returns 0 if no client (channel disconnected)
no need to check if cursor_channel/display_channel are NULL or
connected.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
2016-01-28 08:15:38 +00:00
Frediano Ziglio
871dbe5417 worker: do not leak cursor after disconnecting clients
Calling cursor_channel_disconnect does not free cursor_display
so this causes a leak.
Is the only code where this pointer is reset preventing any
further cursor channel connection. If a client is lazy reading
cursor data during the flush connection is closed and further clients
won't be able to use the cursor.
This also prevents future use of a NULL pointer.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
2016-01-28 08:15:04 +00:00
Frediano Ziglio
8191265f78 qxl: inline documentation for get_command and req_cmd_notification
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-01-27 11:06:56 -06:00
Frediano Ziglio
28e33ccdf0 worker: improved implementation of SpiceTimer
Use a custom GSource.
This to avoid having to allocate a timer all the time we add one.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-26 13:13:57 +00:00
Frediano Ziglio
1ad571f576 replay: do not wake up loop too much
Send wakeups only when a command is available.
This emulate better what a guest driver should do (append the command
to the ring and then signal).

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-26 12:46:32 +00:00
Frediano Ziglio
a68d9a3100 worker: use core interface to create watch
This increase code reuse and make Glib integration more straight forward.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-26 12:46:04 +00:00
Frediano Ziglio
2a6adfcd1e worker: remove empty statement at line end
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-26 10:43:18 +00:00
Frediano Ziglio
4084b2b246 worker: use variable already set at beginning of loops
This is mainly question of style.
Instead of repeating same conversion use the variable we set at the
beginning of the function.
Note also that I used same name to make the two functions more
similar.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-26 10:31:18 +00:00
Frediano Ziglio
b2f5ef0f3c worker: remove max_pipe_size constant parameter
All checks for full channel pipes have to be consistents
so there is no point in passing as a parameter.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-26 10:21:01 +00:00
Marc-Andre Lureau
3d9ea0bb6b channel: do not call pipe_add with null items
If the creator was not able to produce the item, no need to call
pipe_add().

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat>
2016-01-22 13:22:33 +00:00
Marc-Andre Lureau
e5fa7f4740 channel: document pipes_create_batch() function
Rename callback to pipe_add, and document the arguments.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat>
2016-01-22 13:22:33 +00:00
Jonathon Jongsma
77ae19c0c6 Replay: report error if we don't read the correct file header
The replay file should start with a header such as
  SPICE_REPLAY 1

Instead of soldiering on if we don't encounter this header, print a
warning and return NULL.  Also exit with a failure if spice_replay_new()
returns a NULL object in main.

Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-22 11:03:30 +00:00
Jonathon Jongsma
e5d3b2bf73 Change some functions to take RedsState arg
In preparation for getting rid of the global 'reds' variable, we need to
pass the RedsState variable to all functions where it is needed. For now
the callers just pass in the global reds variable.

Functions changed:
- reds_mig_fill_wait_disconnect;
- reds_mig_cleanup_wait_disconnect;
- reds_mig_remove_wait_disconnect_client;
- reds_migrate_channels_seamless;
- reds_mig_finished;
- reds_mig_switch;
- reds_enable_mm_time;
- reds_disable_mm_time;
- attach_to_red_agent;
- reds_char_device_add_state;
- reds_char_device_remove_state;
- reds_on_char_device_state_destroy;
- spice_server_char_device_remove_interface;
- migrate_timeout.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-21 14:42:58 +00:00
Christophe Fergeau
6e407a81df event-loop: Remove template
Since SpiceCoreInterfaceInternal is a private data structure, we can
extend it as we see fit without breaking ABI. In particular, adding a
GMainContext member to it allows us to remove the need for
the event loop template which is currently included in the
basic_event_loop.c test file.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-21 14:19:24 +00:00
Christophe Fergeau
4b923347b7 test-loop: Improve basic_event_loop base_{timer, watch}_add
They call the functions provided by event_loop_core, but with a NULL
SpiceCoreInterfaceInternal parameter. It makes more sense to pass
event_loop_core rather than NULL.
This will allow to pass the GMainContext to be used through
SpiceCoreInterfaceInternal rather than through a template parameter.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-21 14:19:12 +00:00
Pavel Grunt
0bfad8a37f dcc: make dcc_compress_image_*() private
Reviewed-by: Victor Toso <victortoso@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-20 16:05:02 +00:00
Pavel Grunt
a310ac8860 dcc-send: Use dcc_compress_image to compress image
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-20 16:04:59 +00:00
Pavel Grunt
faa907e3c6 dcc_compress_image: Handle NULL drawable
It will be used in the following commit.
The GLZ compression cannot be used when the drawable is NULL.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-20 16:04:55 +00:00
Jonathon Jongsma
2a39131d5b Change some functions to take RedsState arg
In preparation for getting rid of the global 'reds' variable, we need to
pass the RedsState variable to all functions where it is needed. For now
the callers just pass in the global reds variable.

Functions changed:
- reds_link_mig_target_channels;
- reds_on_migrate_dst_set_seamless;
- reds_on_client_seamless_migrate_complete;
- reds_on_client_semi_seamless_migrate_complete;
- reds_handle_other_links;
- reds_handle_link;
- reds_send_mm_time;
- reds_set_client_mm_time_latency;
- reds_init_net;
- do_spice_init;
- reds_init_ssl;
- on_activating_ticketing;
- reds_mig_release to take RedsState arg
- reds_mig_started.

Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-20 15:26:25 +00:00
Jonathon Jongsma
b8be8a7886 Change some functions to take RedsState arg
In preparation for getting rid of the global 'reds' variable, we need to
pass the RedsState variable to all functions where it is needed. For now
the callers just pass in the global reds variable.

Functions changed:
- reds_on_main_migrate_connected;
- reds_on_main_mouse_mode_request;
- reds_on_main_channel_migrate;
- reds_marshall_migrate_data;
- reds_agent_state_restore;
- reds_handle_migrate_data;
- reds_send_link_ack;
- reds_mig_target_client_add;
- reds_mig_target_client_find;
- reds_mig_target_client_free;
- reds_mig_target_client_disconnect_all;
- reds_find_client;
- reds_get_client;
- reds_handle_main_link;
- reds_set_client_mouse_allowed.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-20 13:11:49 +00:00
Frediano Ziglio
ddaa46d70f channel: do not free rcc->stream in red_channel_client_disconnect
This fixes a crash if red_channel_client disconnect is called
handling a message.
This can happen for instance while handling SPICE_MSGC_ACK which calls
red_channel_client_push which tries to detect write errors while writing
to a socket (for instance socket disconnection).
Messages are read in a loop and red_channel_client_disconnect would
cause rcc->stream to be NULL which will result in a use-after-free
problem (stream in red_peer_handle_incoming will use cached stream value).

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-01-20 00:27:55 +00:00
Frediano Ziglio
a5a0d4a290 tests: test removed triggered timers are not called
This could happen for instance if a given timer remove all clients
which have associated timers.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-01-19 23:57:01 +00:00
Frediano Ziglio
323dc46794 tests: add a test for event loop
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-01-19 23:56:59 +00:00
Frediano Ziglio
f3a7befafe tests: extract code for event loop
This code will be reused for main loop

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-01-19 23:56:33 +00:00
Frediano Ziglio
3686132923 tests: do not use default loop context
Make sure we don't handle event reserved to other loop contexts.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-01-19 23:56:28 +00:00
Christophe Fergeau
4b8607c40c Remove use of spice_warn_if()
spice_warn_if_fail() is doing the same thing except for the inverted
condition. spice_warn_if() is being removed from spice-common to avoid
having potentially confusing redundancy.
2016-01-19 17:15:49 +01:00
Jonathon Jongsma
30f873d033 reds_num_of_clients() -> reds_get_n_clients()
More consistent with glib naming conventions. Also make the function
static since it's not used outside of this source file.

Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-19 14:14:23 +00:00
Jonathon Jongsma
dc7ef0eaa2 reds_num_of_channels() -> reds_get_n_channels()
More consistent with glib naming conventions.

Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-19 14:14:23 +00:00
Jonathon Jongsma
3ead546abb Change some functions to take RedsState arg
In preparation for getting rid of the global 'reds' variable, we need to
pass the RedsState variable to all functions where it is needed. For now
the callers just pass in the global reds variable.

Functions changed:
- vdi_port_read_buf_process;
- vdi_port_read_buf_get;
- vdi_port_read_buf_unref;
- reds_handle_agent_mouse_event;
- reds_num_of_channels;
- reds_num_of_clients;
- reds_fill_channels;
- reds_on_main_agent_start;
- reds_get_agent_data_buffer;
- reds_release_agent_data_buffer;
- reds_client_monitors_config_cleanup;
- red_on_main_agent_data.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-19 14:11:54 +00:00
Frediano Ziglio
28c3585730 tests: remove leaks in test-qxl-parsing
This make happy address sanitizer during make check.
Otherwise memory leak detector can keep in and make tests fails.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-19 14:03:43 +00:00
Jonathon Jongsma
bb6901e7f7 Pass 'reds' as opaque data in vdi port char device
This allows us to access the RedsState variable non-globally without
changing the signature of the callback functions.

Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-19 09:54:12 +00:00
Jonathon Jongsma
07297dd3d0 Change some functions to take RedsState arg
In preparation for getting rid of the global 'reds' variable, we need to
pass the RedsState variable to all functions where it is needed. For now
the callers just pass in the global reds variable.

Functions changed:
- reds_register_channel;
- reds_unregister_channel;
- reds_get_mouse_mode;
- reds_set_mouse_mode;
- reds_update_mouse_mode;
- reds_agent_remove;
- reds_find_channel;
- reds_mig_cleanup;
- reds_reset_vdp;
- reds_main_channel_connected;
- reds_client_disconnect;
- reds_disconnect;
- reds_mig_disconnect.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-18 16:01:12 +00:00
Frediano Ziglio
e433a6634c replay: better documentation for -C and -S options
Document all possible values

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-15 15:42:19 +00:00
Frediano Ziglio
d80189b5ed replay: add streaming setting option
Add -S to allow to set a video streaming rule.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2016-01-15 15:04:52 +00:00
Frediano Ziglio
f103f667bf utils: handle errors writing to bitmap file
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-15 12:30:03 +00:00
Frediano Ziglio
42ce16b7f4 utils: fix endianess issues writing bitmap file
Do not print directly binary data but serialize in a portable way
and then use write functions.

Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-15 12:30:00 +00:00
Frediano Ziglio
cb5184af58 utils: use always fwrite to write bitmap
Make easier to check error on next patch

Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-15 11:52:19 +00:00
Jonathon Jongsma
8bb265726c Make global 'reds' extern
This allows it to be accessed from other files. This is a temporary step
toward getting rid of the global-ness of this variable, and it allows us
to update the function signature bit-by-bit.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-15 11:51:13 +00:00
Marc-Andre Lureau
47df90a8ce stream-test: add batch test
Check that two consecutive msgfd are read back from two different reads.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-15 11:04:30 +00:00
Frediano Ziglio
eb64b7d739 replay: use spice_malloc(0) instead of raw malloc
These function report memory allocation errors.
spice_malloc0 also reset memory after allocation.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Victor Toso <victortoso@redhat.com>
2016-01-15 10:33:24 +00:00
Marc-Andre Lureau
0db1137dac build-sys: build a noinst libtest.a to link to
Group the test utility in a library, to avoid repeating the same
sources. In this case, automake already figues out what the source of
the programs to build is.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-15 09:58:54 +00:00
Frediano Ziglio
58c5713aa9 replay: remove command line memory leaks
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2016-01-15 08:58:12 +00:00
Christophe Fergeau
5a603f2b63 Remove GSlice use
It's being slowly deprecated in glib
https://bugzilla.gnome.org/show_bug.cgi?id=754687

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-14 16:39:36 +00:00
Christophe Fergeau
400a5d13cf Remove compress_buf_new
This commit reworks a bit the management of RedCompressBuf so that
compress_buf_new/compress_buf_free become unneeded.
Since d25d6ca0 and the introduction of encoder_data_reset,
compress_buf_free is already unused outside of dcc-encoders.c and could
be static. This in turn makes compress_buf_new a bit odd as the matching
destructor is never used in dcc.c.
This commit introduces an encoder_data_init() method which is hiding
the initialization of the EncoderData structure from the dcc.c code,
allowing to get rid of compress_buf_new() calls from dcc.c code.

It also uses this as an opportunity to stop using GSlice for
RedCompressBuf.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-14 16:39:30 +00:00
Frediano Ziglio
eff5e83936 channel: simplify red_channel_client_send_item
Acked-by: Pavel Grunt <pgrunt@redhat.com>
Acked-by: Victor Toso <victortoso@redhat.com>
2016-01-14 14:16:53 +00:00
Marc-Andre Lureau
f438bd6ae9 tests: add fdpass stream test
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-14 11:04:49 +00:00
Marc-André Lureau
5c1073266e reds-stream: add send_msgfd()
A new function to send fd with unix socket anciliary data.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-14 10:55:36 +00:00
Marc-Andre Lureau
2628197b99 build-sys: build a utility libserver.la
This allow tests programs to link with statically built library to access all symbols

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-14 10:53:25 +00:00
Christophe Fergeau
9ea5348efc spicevmc: Drop unsent data on client disconnection
When redirecting a USB webcam over a slow link, it's currently possible
to hit an assertion in spice-server by running cheese (application using
the webcam), killing the client with ctrl+c and then restarting the
client:
qemu-kvm: spicevmc.c:324: spicevmc_red_channel_alloc_msg_rcv_buf:
Assertion `!state->recv_from_client_buf' failed.

This happens when red_peer_handle_incoming tries to allocate memory for
a message using spicevmc:
handler->msg = handler->cb->alloc_msg_buf(handler->opaque, msg_type,
msg_size);

red_peer_handle_incoming() is called when there is client data to be
read, and does
- call alloc_msg_buf() to allocate memory for the message
- read the message
- if the read was partial, return early, the main loop will call again
  red_peer_handle_incoming() when there is more data available for that
  channel
- parse the message
- call release_msg_buf() to free the message

For channels based on spicevmc (usbredir and port), alloc_msg_buf()
stores message data in SpiceVmcState::recv_from_client_buf and before
allocating new memory, it asserts that it's NULL.

This is what causes this crash in the following scenario:
- SpiceVmc::alloc_msg_buf() is called and allocates memory for a new
  message in SpiceVmcState::recv_from_client_buf
- red_peer_handle_incoming() returns early as all the spicevmc message
  data hasn't been received yet
- the client gets killed
- the main channel notices the disconnect and calls
  main_dispatcher_client_disconnect() which will disconnect all the
  channels
- SpiceVmc::on_disconnect is called
- after the new client connects, SpiceVmc::alloc_msg_buf() is called,
  notices that SpiceVmcState::recv_from_client_buf is already set, and
  asserts()

This commit makes sure the partial SpiceVmcState::recv_from_client_buf
data is cleared on disconnect so that the assert does not trigger.

This fixes https://bugzilla.redhat.com/show_bug.cgi?id=1264113
2016-01-13 11:45:56 +01:00
Sunny Shin
b9b0590bc0 channel: add option tcp keepalive timeout to channels 2016-01-12 15:10:47 +01:00
Christophe Fergeau
02c8a0f386 stat: Make stat_compress_init/stat_init the same
When COMPRESS_STAT is not set, and RED_WORKER_STAT is set,
stat_time() will be a no-op, but stat_start_time_init() will try to use
stat_info_t::clock. This causes a compile warning on 32 bit arches (not
sure why not on 64 bit builds), as well as an error from valgrind.

Since stat_time() and stat_compress_time() are both doing the same work,
this commit makes them the same function, which ensures
stat_info_t::clock will be set and stat_start_time_init() can be used
regardless of the _init() method which is called.
2016-01-12 11:46:32 +01:00
Francois Gouget
a57f227235 server: Fix conversions between QXLPHYSICAL and pointers
This avoids compilation errors with -Werror on 32 bit systems as the
pointer size differs from that of a QXLPHYSICAL.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
2016-01-12 10:57:21 +01:00
Francois Gouget
0de8f7f94e server: Simplify the next chunk initialization in red_replay_data_chunks()
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
2016-01-12 10:57:20 +01:00
Francois Gouget
e617a59969 server: Fix a pointer to uint64_t cast in spice_replay_next_cmd()
This avoids a compilation error with -Werror on 32 bit systems as the
pointer size differs from that of an uint64_t.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
2016-01-12 10:57:20 +01:00
Frediano Ziglio
77830036e2 channel: use iface parameter to distinguish interface context
Now we can use the iface parameter to distinguish the context instead
of doing strange assumption on opaque and its state.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-11 16:40:17 +00:00
Frediano Ziglio
ba175f9be1 channel: add interface parameters to SpiceCoreInterfaceInternal
This patch and previous ones want to solve the problem of not having a
context in SpiceCoreInterface. SpiceCoreInterface defines a set of
callbacks to handle events in spice-server. These callbacks allow to
handle timers, watch for file descriptors and send channel events.
All these callbacks do not accept a context (usually in C passed as a
void* parameter) so it is hard for them to differentiate the interface
specified.
Unfortunately this structure is used even internally from different
contexts for instance every RedWorker thread has a different context. To
solve this issue some workarounds are used. Currently for timers a variable
depending on the current thread is used while for watches the opaque
parameter to pass to the event callback is used as it currently points just
to RedChannelClient structure.  This however imposes some implicit
maintainance problem in the future. What happens for instance if for some
reason a timer is registered during worker initialization, run in another
thread? What if we decide to register a file descriptor callback for
something not a RedChannelClient?  Could be that the program will run
without any issue till some bytes change and weird things could happen.

The implementation of this solution is done implementing an internal "core"
interface that has context specific and use it to differentiate the
context instead of relying on some other, hard to maintain, detail. Then an
adapter structure (name inpired to the adapter pattern) will provide the
internal core interface using the external, public, definition (in the
future this technique can be used to extend the external interface without
breaking the ABI).

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-11 16:40:17 +00:00
Frediano Ziglio
9745ef5f9a channel: build adapter for public core interface
Add wrapper functions for SpiceCoreInterface in order to present
a SpiceCoreInterfaceInternal. These functions just expect
SpiceCoreInterfaceInternal API and forward request to
SpiceCoreInterface.
This allows to change ABI details of internal one.

See comments in "channel: add interface parameters to
SpiceCoreInterfaceInternal" patch.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-11 16:40:12 +00:00
Frediano Ziglio
adc0751950 channel: add a new internal SpiceCoreInterface
Define an internal structure that matches 100% the ABI of the public one.
The structure will be changed by following patches.
See comments in "channel: add interface parameters to
SpiceCoreInterfaceInternal" patch.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-11 16:29:53 +00:00
Frediano Ziglio
26c7e33de3 stats: use CLOCK_THREAD_CPUTIME_ID for cpu statistics
Use CLOCK_THREAD_CPUTIME_ID instead of getting the clock
with pthread_getcpuclockid.
This avoids to call red_worker_get_clockid. This function returns
uninitialized value at the time DisplayChannel is built resulting in setting
statistics to CLOCK_REALTIME (which is 0) instead to cpu time as expected.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-11 16:29:08 +00:00
Frediano Ziglio
1b6af4779a dcc: avoid to report errors triggered by client
Client can always send report even if a stream is not available.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-11 14:45:02 +00:00
Frediano Ziglio
d3b5d2c97e add some tests for cursors parsing
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-08 18:16:47 +00:00
Frediano Ziglio
6ea345b820 add test for QXL parsing functions
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-08 18:16:47 +00:00
Frediano Ziglio
f84239a035 check properly if red_get_data_chunks fails or not
Instead of returning 0 which could be a valid value returns an invalid
one and check on the caller.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-08 18:16:42 +00:00
Frediano Ziglio
2571cec5eb prevent integer overflow in red_get_clip_rects
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-08 16:33:27 +00:00
Frediano Ziglio
d25d6ca0f2 dcc: write and use a new encoder_data_reset function to clean buffers
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-08 16:25:37 +00:00
Frediano Ziglio
bd8c74d7a4 dcc: free glz buffer after zlib compression
For zlib+glz compression image if first compressed with glz then the
resulting buffer is compressed again with zlib then the buffer from
zlib is returned to the caller.
However the temporary glz buffer was not freed resulting in a memory
leak.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-08 16:25:25 +00:00
Eduardo Lima (Etrunko)
8c6dcc5eaf server: Fix tests Makefile
As reported in https://bugs.freedesktop.org/show_bug.cgi?id=93520, the
build from git is failing in Archlinux systems with undefined
references to glib symbols.

This patch fixes the problem by simply reordering the order libraries
will be linked. Also, removes duplicate $(GLIB_LIBS) variable.

Signed-off-by: Eduardo Lima (Etrunko) <etrunko@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-01-08 12:23:54 +00:00
Pavel Grunt
952aaca3d7 syntax-check: Remove empty line at EOF
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2016-01-08 11:24:14 +00:00
Frediano Ziglio
cc5fa8fa9b replay: better help for -s option
-s accepts an option to delay command queueing.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Marc-André Lureau <mlureau@redhat.com>
2015-12-22 16:45:48 +00:00
Marc-André Lureau
9a0efecd93 reds-stream: add reds_stream_is_plain_unix()
Utility function used in follow-up code.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-21 13:20:53 +00:00
Marc-Andre Lureau
3364af70a3 tests: remove test_util.h
Replace ASSERT() with spice_assert().

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-21 11:44:34 +00:00
Frediano Ziglio
f5f103b8d7 tests: remove unused macro
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-21 10:39:56 +00:00
Lukas Venhoda
6c4f11191c dcc: Don't disconnect channel, when compression is not supported
Don't disconnect the display channel, when unsupported compression is
requested from the client. Not changing the compression is enough.

https://bugs.freedesktop.org/show_bug.cgi?id=92821
Acked-by: Victor Toso <victortoso@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-17 12:29:52 +01:00
Marc-Andre Lureau
e64135179f stream: consitify reds_stream_get_family() argument
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-16 10:16:43 +00:00
Francois Gouget
3c4e735e9e server: Use '%zu' to print size_t variables
The size_t definition is different between 32 and 64 bit systems so that
neither '%u' nor '%lu' work for both. '%zu' should be used instead.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-15 17:50:05 +00:00
Francois Gouget
badee40030 server: Remove an unneeded mjpeg-encoder.h include
The corresponding code has been moved elsewhere during the refactoring.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-15 17:48:58 +00:00
Francois Gouget
110c31439b server: Use PRI macros in printf for 32/64 bit compatibility
Some integer type definitions are different between 32 and 64 bit
systems which causes problems in printf. The PRI macros automatically
provide the printf format appropriate for the system.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-15 17:47:50 +00:00
Frediano Ziglio
b953a4e35f tests: reuse Makefile macro
For coherency use COMMON_BASE macro instead of including single
files.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Victor Toso <victortoso@redhat.com>
2015-12-15 17:39:49 +00:00
Frediano Ziglio
276d9f08cd tests: allocate memory in a coherent fashion
Do not free memory allocated with C functions (like calloc) using g_free;
although this is possible with default Glib allocator this is not safe.
Also use consistent allocation functions. All other spice-server code
does not use Glib allocations so for coherence do not use them for
watches.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Victor Toso <victortoso@redhat.com>
2015-12-15 17:39:38 +00:00
Marc-André Lureau
13b2c97e79 red-channel: constify some callback structs
Because we can.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-14 13:59:39 +00:00
Christophe Fergeau
10377fa065 build: Don't list some installed headers twice
Since commit febaed3, spice.h and spice-experimental.h are listed both
in libspice_server_la_HEADERS and libspice_server_la_SOURCES. Since we
want these headers to be installed, we can remove them from _SOURCES.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-14 12:27:09 +00:00
Francois Gouget
8bddb1444e server: Add time constants to go with spice_get_monotonic_time_ms()
They clarify the time unit being used and simplify calculations.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2015-12-14 11:24:47 +00:00
Francois Gouget
5c9fb9a0f3 server: Add time constants to go with spice_get_monotonic_time_ns()
They clarify the time unit being used, reduce the need for casts and
simplify calculations.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2015-12-14 11:24:34 +00:00
Francois Gouget
cbc4e07682 server: Rename DISPLAY_CLIENT_TIMEOUT and de-duplicate it
Given that it is used for both cursor and display, COMMON_CLIENT_TIMEOUT
seems more appropriate. Also define it only in red-worker.h.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-14 10:53:40 +00:00
Pavel Grunt
67f619d551 worker: Rename function name in the comment as well
It was renamed in 47b023866f

Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2015-12-11 16:04:16 +00:00
Frediano Ziglio
9c56c884ad dcc: do not cause problem with multiple threads.
With multiple cards configured you can have multiple workers running in
different thread.
With such configuration static variables not syncronized could lead
to undefined behavior.

Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-11 14:57:05 +00:00
Frediano Ziglio
765b5209ef reds: do not use g_malloc0 in server code
The rest of code is using spice_malloc* functions, use them for
consistency.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-11 14:55:32 +00:00
Francois Gouget
c9282b3bc7 server: Use spice_get_monotonic_time_ms() in spice_timer_queue.c
This reduces code duplication.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-11 12:43:26 +00:00
Francois Gouget
f7613250c5 server: Add spice_get_monotonic_time_ms()
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-11 12:43:26 +00:00
Francois Gouget
65b60250d0 server: Rename red_get_monotonic_time() to spice_get_monotonic_time_ns()
This is a generic function not tied to the red_xxx functionality and the
new name clarifies that it returns the time in nanoseconds (unlike
g_get_monotonic_time()).

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-11 12:43:26 +00:00
Francois Gouget
0ad7f71e24 server: Provide a framerate estimate based on the initial frames
This way the video encoder can actually count on a real estimate when
it is initializing.
Note that the server only creates a video stream if at least 20 bitmap
'blits' of the same size and type arrive, each within a maximum time
interval from the previous one. So it was only keeping track of the
frame to frame interval. Thus to get an average frame rate over all the
20 frames it's necessary to also keep track of the first_frame_time.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
2015-12-11 12:43:44 +01:00
Marc-André Lureau
e9bf0a69af snd: remove duplicated snd_attach_*() code
red_channel_set_data() already sets channel->data.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-11 11:26:09 +00:00
Marc-Andre Lureau
17029eff1d red-dispatcher: group cases
A small cleanup.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-10 19:12:10 +00:00
Marc-André Lureau
00357bb2f3 snd: simplify reds_register_channel() call
Give channel argument directly

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-10 19:12:10 +00:00
Frediano Ziglio
e7c79b71a4 channel: make sure we retain RedChannelClient while processing it
During display_channel_handle_migrate_data the pointer is passed
to different functions which could release it making the pointer
invalid. Make sure pointer is not freed while processing.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-10 17:36:25 +00:00
Frediano Ziglio
b12187b332 channel: rename red_channel_(client_)waits_* functions
Make clear that these funcion are just checking a condition.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-10 17:22:59 +00:00
Francois Gouget
c8010f0201 server: Remove an unneeded time.h include directive
main-channel.c now uses g_get_monotonic_time() instead of
clock_gettime().

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
2015-12-10 16:07:08 +01:00
Frediano Ziglio
febaed3529 server: misc header cleanups
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-09 22:17:51 +00:00
Frediano Ziglio
24da6bcd37 server: merge spice-bitmap-utils and spice_bitmap_utils
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-09 22:16:10 +00:00
Frediano Ziglio
c4c716ab18 stat: add test for statistic functions
Make sure code compile with and without statistics enabled (beside
printing functions).

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-09 17:02:54 +00:00
Frediano Ziglio
253d2cef40 stat: use a better design for statistic functions
make sure code compile with statistics enabled or disabled.
Dummy (empty) structures and functions are used instead of preprocessor.
Also fix a problem as stat_compress_init did not initialize clock
field.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-09 17:02:48 +00:00
Frediano Ziglio
4173663ea1 stat: fix portability problem in stat_time_t declaration
Assure stat_time_t is 64 bit on all architectures.
long is not 64 bit on 32 bit systems so use uint64_t intead.
Also avoid 32 bit overflows for such architectures.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-09 17:02:41 +00:00
Marc-André Lureau
c0f4de5c86 display: replace some dubious asserts
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
Acked-by: Uri Lublin <uril@redhat.com>
2015-12-09 11:42:00 +00:00
Francois Gouget
9956270358 server: Use g_get_monotonic_time() to get the time in microseconds
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-08 15:08:44 -06:00
Francois Gouget
c8d5120ff0 server: Define the MJPEG encoder warmup time in nanoseconds
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-08 15:08:44 -06:00
Francois Gouget
4ce4c4a525 server: Simplify the MJPEG encoder's maximum framerate estimation
Note that if frame_size == bytes_per_sec == 0 this now returns
MJPEG_MAX_FPS but this should not happen anyway.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
2015-12-08 16:22:41 +01:00
Francois Gouget
9b42aafe31 server: Rename SUPPORT_AUTOMATED_TESTS to HAVE_AUTOMATED_TESTS
This improves consistency with spice-deps.m4 which names its
AM_CONDITIONAL() variables HAVE_XXX.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
2015-12-08 15:39:11 +01:00
Alon Levy
6e6126e024 server: multiple clients works ok if we limit the pipe to the slowest client
Signed-off-by: Alon Levy <alon@pobox.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-04 15:43:56 +00:00
Frediano Ziglio
ed1ef89ca8 pass proper type to SPICE_CONTAINEROF
In some case the member specified to SPICE_CONTAINEROF was not
exactly the same type of the pointer passed.
This can cause issues if structure changes so use proper member.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-04 13:33:54 +00:00
Frediano Ziglio
89fda203bc worker: improve validation for update command
If surface_id is not valid we should still release resource allocated
by red_get_update_cmd and from the guest.
This to reduce leaks in case of a race or another error in the guest
driver.
Also not issue a warning on invalid surface number to avoid filling
log space unconditionally.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2015-12-04 12:02:36 +00:00
Jonathon Jongsma
0410c6f165 remove glz_encoder_config.h
Move all code from glz_encoder_config.h into other files.

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-04 11:57:18 +00:00
Alon Levy
aef334e6e8 tests: test_display_base: use a faster wakeup time to easily test multiple client blocking
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-04 11:46:27 +00:00
Frediano Ziglio
525cd67be7 server: rename files
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-03 23:54:32 +00:00
Frediano Ziglio
1ea55284d9 memslot: change some spice_assert to spice_return_if_fail
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-03 23:51:18 +00:00
Frediano Ziglio
1873c7d497 display: misc style and rename changes
- remove some red_ prefix;
- move red_drawable->self_bitmap check outside handle_self_bitmap;
- move update check outside red_get_area (renamed surface_read_bits);
- rename depend_on_surface_id argument to surface_id;
- rename success variable to add_to_pipe.

Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-03 23:51:18 +00:00
Frediano Ziglio
1940972ca9 worker: move red_process_draw to display-channel.c
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-03 23:51:18 +00:00
Frediano Ziglio
dfaf83235f display: make get_drawable symmetric to display_channel_drawable_unref
Make possible to safely call display_channel_drawable_unref straight
after calling get_drawable.

Problem was function definitions and dependency.

display_channel_drawable_try_new is supposed to return an uninitialized
pointer (or NULL on failure) to a Drawable structure.

(display_channel_)get_drawable is supposed to return an initialized
pointer (or NULL) to a Drawable structure.

(display_channel_)add_drawable is supposed to add the Drawable to the
list/tree of drawing to draw.

Now, with these definitions after get_drawable the Drawable state (if
pointer is not NULL) should be consistent and we should be able to call
display_channel_drawable_unref.

In the current code this was not true as for instance surface_id was
copied to Drawable but the reference counter of the surface was not
incremented leading possible unref call to decrement the counter and
free the surface. This can happen if any call between get_drawable and
unref does not increment the reference in a consistent way. This
basically means that every present or future code in the path between
get_drawable and unref have to know this unconsistency and handle it.
This is a maintaining problem as people need to know these details when
editing existing code (actually this is display_channel_add_drawable
code).
This basically create a dependency between get_drawable and
add_drawable.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-03 23:51:18 +00:00
Francois Gouget
43d6c5b9ee server: Reuse red_get_monotonic_time() in the MJPEG video encoder
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-03 15:35:06 +00:00
Frediano Ziglio
89707f3b4d stat: fix stat_info_t initialization
For compression statistics clock field was not initialized but used
computing statistics.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-03 10:56:03 +00:00
Marc-André Lureau
ef8c431d9b worker: rename process_commands process_display
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-03 10:48:42 +00:00
Frediano Ziglio
bf1e139875 dcc: reduce statement wrapping
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-03 10:41:46 +00:00
Frediano Ziglio
f31536802a worker: change red_worker_new_channel result to CommonChannel*
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-03 10:41:46 +00:00
Frediano Ziglio
7280460b78 memslot: prefix memslot functions with memslot_
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-03 10:41:46 +00:00
Frediano Ziglio
768dfa2139 worker: do not use dynamic memory for RedSurfaceCmd
Allocation on stack is sufficient and code is more similar to
QXL_CMD_MESSAGE and QXL_CMD_UPDATE cases.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-03 10:41:46 +00:00
Frediano Ziglio
c1ecbaf7b1 display: move more logic in display_channel_get_drawable()
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-03 10:41:46 +00:00
Frediano Ziglio
c26e6de0ee worker: move get_drawable to display-channel.c
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-03 10:41:46 +00:00
Marc-André Lureau
13a3560b88 smartcard: include libcacard.h if possible
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
2015-12-02 17:48:49 +01:00
Yonit Halperin
1ea34e6d43 red_worker: make dcc_clear_surface_drawables_from_pipe declaration consistent with definition
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-02 12:52:10 +00:00
Marc-André Lureau
1c9aea02c6 worker: merge handle_new_display_channel
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-02 12:47:25 +00:00
Marc-André Lureau
5161132ec7 display: rename detach_streams_behind
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-12-02 12:44:46 +00:00
Marc-André Lureau
4980850dd2 display: add update_compression() method
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2015-12-02 12:34:47 +00:00
Marc-André Lureau
47b023866f worker: move red_process_surface
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2015-12-02 12:29:34 +00:00
Marc-André Lureau
d793473e5e server: cleanups
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-11-27 11:49:56 +00:00
Marc-André Lureau
5c93b2b4d2 worker: remove some unnecessary inline
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2015-11-27 11:47:10 +00:00
Marc-André Lureau
203b3cdebf worker: move dcc_send & marshallers to dcc-send.c
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-11-27 11:41:51 +00:00
Marc-André Lureau
7258e5a688 worker: move red_pipes_remove_drawable
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-11-26 15:37:47 +00:00
Marc-André Lureau
4ca383b261 worker: move current_remove*
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-11-26 15:27:24 +00:00
Marc-André Lureau
d9b17bbebb worker: move more stream functions
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-11-26 15:19:03 +00:00
Marc-André Lureau
c26a825451 display: remove some public declarations
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-11-26 15:12:22 +00:00
Marc-André Lureau
721c03394b server: move LZ_IMAGE_TYPE_* enum to dcc
Signed-off-by: Fabiano Fidêncio <fidencio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2015-11-26 14:59:51 +00:00
Marc-André Lureau
f6e5cbdf32 display: Simplify display_channel_create_surface
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
2015-11-26 13:50:30 +00:00