summaryrefslogtreecommitdiffstats
path: root/server
Commit message (Collapse)AuthorAgeFilesLines
...
* server/main_channel: move connection_id from redsAlon Levy2011-08-233-20/+40
| | | | | | | | | | Expose additional api to find a client given a connection_id. The connection_id is first set when the first channel connects, which is the main channel. It could also be kept in the RedClient instead, not sure. TODO: multiple todo's added for multiclient handling. I don't remember why I wrote them exactly, and besides if I did any migration tests. So: TODO.
* server/main_channel: move ping here from reds.Alon Levy2011-08-233-51/+56
| | | | | | | | | | | | | cleanup only. Note that the ping function is half used since the opt parameter stopped being called with anything but NULL, should be returned at some point, specifically when we drop the 250kbyte ping on start and do a continuous check for latency and bandwidth. See: 81945d897 - server: add new vd interface QTerm2Interface, Yaniv Kamay introducing the usage of ping with a non NULL opt 3f7ea8e7a - zap qterm interfaces, Gerd Hoffman removing it
* server/main_channel: move latency and bitrate to channel clientAlon Levy2011-08-237-40/+96
| | | | | | | | | | | | They were globals before. This introduces api for other channels to query the low bandwidth status. The queries themselves are still done from the wrong context (channel and not channel client) but that's because the decoupling of channel and channel client will be done in the following patches. Note that snd_worker.c got two copied function declarations that belong to main_channel.h but can't be easily dragged into snd_worker.c since it still uses it's own RedChannel struct.
* server/reds: add concept of secondary channelsAlon Levy2011-08-231-4/+26
| | | | | | | | | | | | | | | | | | Secondary channels are those that don't support multiple clients. The support added in this patch just doesn't let the second or more connected client receive the unsupported channels in the channels list sent by the server to the client. This doesn't handle the situation where: client A connects (gets all channels) client B connects (gets supported multiple client channels) client A disconnects (Suboptimal 1: B doesn't get new channels at this point) client C connects (Suboptimal 2: C doesn't get the full list of channels, but the partial one) Specifically the channels that only support a single client are: sound (both playback and record channels) smartcard tunnel
* server: Add RedClientAlon Levy2011-08-2315-116/+373
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | That means RedClient tracks a ring of channels. Right now there will be only a single client because of the disconnection mechanism - whenever a new client comes we disconnect all existing clients. But this patch adds already a ring of clients to reds.c (stored in RedServer). There is a known problem handling many connections and disconnections at the same time, trigerrable easily by the following script: export NEW_DISPLAY=:3.0 Xephyr $NEW_DISPLAY -noreset & for ((i = 0 ; i < 5; ++i)); do for ((j = 0 ; j < 10; ++j)); do DISPLAY=$NEW_DISPLAY c_win7x86_qxl_tests & done sleep 2; done I fixed a few of the problems resulting from this in the same patch. This required already introducing a few other changes: * make sure all removal of channels happens in the main thread, for that two additional dispatcher calls are added to remove a specific channel client (RED_WORKER_MESSAGE_CURSOR_DISCONNECT_CLIENT and RED_WORKER_MESSAGE_DISPLAY_DISCONNECT_CLIENT). * change some asserts in input channel. * make main channel disconnect not recursive * introduce disconnect call back to red_channel_create_parser The remaining abort is from a double free in the main channel, still can't find it (doesn't happen when running under valgrind - probably due to the slowness resulting from that), but is easy to see when running under gdb.
* server/main_channel+reds: make main_channel_init return MainChannelClientAlon Levy2011-08-233-22/+22
| | | | This makes it easier to introduce RedClient in the next patch.
* server/red_worker: release PIPE_ITEM_TYPE_VERB in display channelAlon Levy2011-08-231-0/+3
| | | | We send a SPICE_MSG_DISPLAY_MARK verb.
* server/red_client: clear pipe on disconnectAlon Levy2011-08-231-1/+1
|
* server/red_channel: workaround for fast client disconnect bug (TODO - real fix)Alon Levy2011-08-231-0/+5
|
* server/main_channel: use MainChannel in sigAlon Levy2011-08-235-99/+93
| | | | | | | use MainChannel* instead of Channel* for a many functions in main_channel.h (affects main_channel.c and reds.c). some one liner fixes are hidden in here too.
* server: move pipe from RedChannel to RedChannelClientAlon Levy2011-08-2310-241/+314
| | | | | | | | | | | | | | | | | | | | | | | Another cleanup patch, no change to behavior (still one client, and it disconnects previous client if any). The implementation for multiple client is straightforward: the pipe remains per (channel,client) pair, so it needs to move from the RedChannel that to RedChannelClient. Implementation using a single pipe with multiple consumers (to reflect different latencies) doesn't fit well with pipe rewriting that is used by the display channel. Additionally this approach is much simpler to verify. Lastly it doesn't add considerable overhead (but see the display channel changes in a later patch for a real place to rethink). This patch is just technical, changing signatures to reflect the first argument (oop style) so red_channel becomes red_channel_client. Some places may seem odd but they should be fixed with later comits where the channels grow to support multiple clients. Sound (playback/record) channels are the only ones not touched - this is consistent with previous patches, since they have been left out of the RedChannel refactoring. That is left as future work. (note that they don't use a pipe, which was the reason for not refactoring).
* server/red_worker: introduce {display,cursor}_is_connectedAlon Levy2011-08-231-18/+32
| | | | Instead of checking for worker->{display,cursor}_channel directly.
* server/red_channel (all): introduce RedChannelClientAlon Levy2011-08-239-861/+1140
| | | | | | | | | | | | | | | | | | | | | This commit adds a RedChannelClient that now owns the stream connection, but still doesn't own the pipe. There is only a single RCC per RC right now (and RC still means RedChannel, RedClient will be introduced later). All internal api changes are in server/red_channel.h, hence the need to update all channels. red_worker.c is affected the most because it makes use of direct access to some of RedChannel still. API changes: 1. red_channel_client_create added. rec_channel_create -> (red_channel_create, red_channel_client_create) 2. two way connection: rcc->channel, channel->rcc (later channel will hold a list, and there will be a RedClient to hold the list of channels per client) 3. seperation of channel disconnect and channel_client_disconnect TODO: usbredir added untested.
* server/red_worker: drop red_pipe_add_tail, use red_channel_pipe_add_tailAlon Levy2011-08-232-9/+2
| | | | | | The only difference between them being that the later also does a push. I don't believe that to be a problem, but if it does I can always introduce a push'less version.
* server/red_channel: renames to use _proc postfix consistentlyAlon Levy2011-08-233-21/+21
| | | | | | | | | rename types - we use _proc suffix mostly to indicate function pointer types, use it for some function pointers that were missing it. s/channel_handle_migrate_flush_mark/channel_handle_migrate_flush_mark_proc/ s/channel_handle_migrate_data_get_serial/channel_handle_migrate_data_get_serial_proc/ s/channel_handle_migrate_data/channel_handle_migrate_data_proc/
* server/red_worker: explicitly include unistd and errnoAlon Levy2011-08-231-0/+2
|
* server/tests/test_playback: correctly use spice_server_playback_get_bufferAlon Levy2011-08-231-14/+27
| | | | | | | and spice_server_playback_put_samples. The former retrieves a buffer from a free list with spice_server_playback_get_buffer, and should be used once via spice_server_playback_put_samples. The tester previously reused the same buffer a number of times.
* server/tests/basic_event_loop: multiple fixesAlon Levy2011-08-233-128/+37
| | | | | | reuse common/ring.h ignore SIGPIPE fix handling of removed watches
* server/red_worker.c: fix - locking the wrong mutex when releasing glz dictYonit Halperin2011-08-231-3/+3
|
* server/tests/test_display_base: fix compileAlon Levy2011-08-231-2/+4
|
* server/reds.h: explicitly include config.hAlon Levy2011-08-231-0/+2
|
* server: Add a usbredir channelHans de Goede2011-08-104-1/+287
|
* mjpeg: add missing SPICE_BITMAP_FMT_RGBAChristophe Fergeau2011-08-021-0/+1
| | | | | I forgot to handle SPICE_BITMAP_FMT_RGBA when mapping from spice image formats to libjpeg-turbo colorspaces.
* mjpeg: fix libjpeg assertionChristophe Fergeau2011-08-011-8/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | After the changes to add libjpeg-turbo support to spice-server mjpeg compression code, it's relatively easy to hit an assertion from libjpeg in spice-server about "too few scanlines transferred" when the mjpeg streaming code triggers. This assertion brings down qemu, which is bad :) This is because when we first initialize the mjpeg encoder, we do: stream_width = SPICE_ALIGN(src_rect->right - src_rect->left, 2); stream_height = SPICE_ALIGN(src_rect->bottom - src_rect->top, 2); stream->mjpeg_encoder = mjpeg_encoder_new(stream_width, stream_height); and then when we iterate over the image scanlines to feed them to libjpeg, we do: const int image_height = src->bottom - src->top; const int image_width = src->right - src->left; for (i = 0; i < image_height; i++) { mjpeg_encoder_encode_scanline(...); } mjpeg_encoder_end_frame(...); When stream_height is odd, the mjpeg_encoder will be created with an height that is 1 more than the number of lines we encode. Then libjpeg asserts when we tell it we're done with the compression while it's still waiting for one more scanline. Looking through git history, this rounding seems to be an artifact from when we were using ffmpeg for the mjpeg encoding. Since spicec and spicy (the latter needs a few fixes) can handle streams with odd height/width, the best way to solve this issue is to stop rounding up the height and width of the streams we create. This even saves some bandwidth :)
* server/red_dispatcher: fix wrong resolution set for tabletAlon Levy2011-07-311-4/+4
| | | | | | | | | | | when changing resolutions due to the new async code paths the surface creation command was kept by reference, and later, when the red_worker signaled completion by calling async_complete the mouse mode was updated using the reference. This caused the wrong values to be read resulting in wrong resolutions set and a non working mouse pointer. Fix this by keeping a copy of the surface creation command instead of a reference. No bz. Found in testing.
* Bump version in server/spice,h to 0.9.1Hans de Goede2011-07-261-1/+1
| | | | | | | | It is a bit early to bump, since a 0.9.1 release is not happening yet, but this allows me to test if the vdagent SpiceCharInterface state callback fixes are present or not in qemu code, and thus disabling the ugly vdagent specific workaround from spice-qemu-char.c when compiling against a new enough spice-server.
* server: Don't call vdagent chardev state callback on client (dis)connectHans de Goede2011-07-251-45/+20
| | | | | See this long mail for the rationale for this: http://lists.freedesktop.org/archives/spice-devel/2011-July/004837.html
* server/smartcard: fix smartcard_channel_send_errorAlon Levy2011-07-221-25/+8
| | | | | | | | It was sending the wrong data, the memory right after the VCSMsgHeader which was actually not where the data was. Fixed by having the header and data (VSCError, 4 bytes of the error code) embedded in the ErrorItem pipe item.
* mjpeg: rename jpeg_mem_destChristophe Fergeau2011-07-221-3/+3
| | | | | jpeg_mem_dest is a public symbol in libjpeg8 so using it with no prefix will cause symbol clashes. Rename it to spice_jpeg_mem_dest.
* mjpeg_encoder: allocate "row" on demandChristophe Fergeau2011-07-221-8/+9
| | | | | | It's not used when we use jpeg-turbo colorspaces, so it's better to allocate it when we know we'll need it rather than always allocating it even if it won't be used.
* mjpeg_encoder: remove unused functionsChristophe Fergeau2011-07-222-50/+0
| | | | | | After the refactoring to optionally use libjpeg-turbo, some of the functions that mjpeg-encoder used to provide are now no longer used. This commit removes them.
* mjpeg_encoder: use libjpeg-turbo extra colorspacesChristophe Fergeau2011-07-221-5/+16
| | | | | | When libjpeg-turbo is available, we can use the BGR and BGRX colorspaces that it provides to avoid extra conversions of the data we want to compress to mjpeg
* red_worker: use new mjpeg_encoder_encode_scanline APIChristophe Fergeau2011-07-221-72/+13
| | | | | | The main point is to move the pixel conversion code into the MjpegEncoder class to be able to make use libjpeg-turbo additional pixel formats without the reds_worker code noticing.
* mjpeg_encoder: add mjpeg_encoder_get_bytes_per_pixelChristophe Fergeau2011-07-222-0/+6
| | | | | Returns the number of bytes per pixel corresponding to the input data format.
* mjpeg_encoder: add mjpeg_encoder_encode_scanlineChristophe Fergeau2011-07-222-0/+107
| | | | | | This API is meant to allow us to move the pixel format conversion into MjpegEncoder. This will allow us to be able to use the additional pixel formats from libjpeg-turbo when available.
* red_worker: simplify red_rgb_to_24bpp prototypeChristophe Fergeau2011-07-221-10/+6
| | | | | | It takes a lot of arguments, "id" is unused, "frame" and "frame_size" can be obtained from the "stream" argument, so can get rid of 3 arguments to make things more readable.
* mjpeg_encoder: rework output buffer allocationChristophe Fergeau2011-07-223-26/+112
| | | | | | | | | | When encoding a frame, red_worker passes an allocated buffer to libjpeg where it should encode the frame. When it fails, a new bigger buffer is allocated and the encoding is restarted from scratch. However, it's possible to use libjpeg to realloc this buffer if it gets too small during the encoding process. Make use of this feature, especially since it will make it easier to encore one line at a time instead of a full frame in subsequent commits.
* red_worker: factor pixel conversion codeChristophe Fergeau2011-07-221-121/+50
| | | | | | When encoding to mjpeg, the on screen data have to be converted to 24bpp RGB since that's the format that libjpeg expects. Factor as much code as possible for the 3 formats we handle.
* fix make distcheckChristophe Fergeau2011-07-221-4/+5
|
* server: make sure we clear vdagent and update mouse mode on agent disconnectHans de Goede2011-07-211-1/+1
| | | | | | | | | | | | The check this patch removes causes us to not set vdagent to NULL, nor update the mouse mode when the guest agent disconnects when no client is attached. Which leads to a non working mouse, and on agent reconnect a "spice_server_char_device_add_interface: vdagent already attached" message instead of a successful re-add of the agent interface . hansg: Note this is commit 443994ba from the 0.8 branch, which I did not forward port back then because it seemed unnecessary on master, but it turns out that the (wrong) check was just hidden in another place on master.
* server/red_worker: send surface images to client on-demand after S3/4 wakeupYonit Halperin2011-07-201-9/+22
| | | | | When surfaces are being reloaded to the worker, we will send them to the client only if and when it needs them.
* server/spice.h: bump QXL_MINOR because of QXLWorker and QXLInterface changesAlon Levy2011-07-201-1/+1
|
* server: add QXLWorker.flush_surfaces_async for S3/S4 supportAlon Levy2011-07-205-4/+46
| | | | | | | | | | | This does the following, all to remove any referenced memory on the pci bars: flush_all_qxl_commands(worker); flush_all_surfaces(worker); red_wait_outgoing_item((RedChannel *)worker->display_channel); red_wait_outgoing_item((RedChannel *)worker->cursor_channel); The added api is specifically async, i.e. it calls async_complete when done.
* server: add QXLInterface::update_area_complete callbackAlon Levy2011-07-202-16/+47
| | | | | when update_area_async is called update_area_complete will be called with the surfaces dirty rectangle list.
* server/red_worker: handle_dev_input: reuse write_ready introduced for asyncAlon Levy2011-07-201-8/+4
|
* server: add async io supportAlon Levy2011-07-208-91/+358
| | | | | | | | | | | | | | | | | | | | | | | | | | | The new _ASYNC io's in qxl_dev listed at the end get six new api functions, and an additional callback function "async_complete". When the async version of a specific io is used, completion is notified by calling async_complete, and no READY message is written or expected by the dispatcher. update_area has been changed to push QXLRects to the worker thread, where the conversion to SpiceRect takes place. A cookie has been added to each async call to QXLWorker, and is passed back via async_complete. Added api: QXLWorker: update_area_async add_memslot_async destroy_surfaces_async destroy_primary_surface_async create_primary_surface_async destroy_surface_wait_async QXLInterface: async_complete
* server: api: add spice_qxl_* calls based on QXLWorker contentsAlon Levy2011-07-203-32/+226
| | | | | | | | | For each callback in QXLWorker, for example QXLWorker::update_area, add a direct call named spice_qxl_update_area. This will (a) remove the pointless indirection and (b) make shared library versioning alot easier as we'll get new linker symbols which we can tag with the version they appeared in the shared library.
* server: spice-server.syms: move sasl symbols to 0.8.2Alon Levy2011-07-201-3/+7
|
* server/red_worker: remove print on handle_dev_destroy_surfacesAlon Levy2011-07-201-1/+1
|
* server/red_worker: *_release_item: less frequent debug messagesAlon Levy2011-07-201-2/+2
|