summaryrefslogtreecommitdiffstats
path: root/server/red_worker.c
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2012-03-13 16:05:23 +0000
committerDaniel P. Berrange <berrange@redhat.com>2012-04-25 09:42:15 +0100
commit93d8ca81916397a1398f136661123625b3df2727 (patch)
treef7159548010d0743302322c773cd31de63b8b29a /server/red_worker.c
parenteeb2b65a7d5d79af3588ca5cf7e00c4ffd645ea7 (diff)
downloadspice-93d8ca81916397a1398f136661123625b3df2727.tar.gz
spice-93d8ca81916397a1398f136661123625b3df2727.tar.xz
spice-93d8ca81916397a1398f136661123625b3df2727.zip
Remove 2 *MB* stack frame in red_worker_main
The red_worker_main method allocates a RedWorker struct instance on the stack. This struct is a full 2 MB in size which is not at all resonable to allocate on the stack. * server/red_worker.c: Move RedWorker struct to the heap Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Diffstat (limited to 'server/red_worker.c')
-rw-r--r--server/red_worker.c50
1 files changed, 25 insertions, 25 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index 32d390d7..fc749249 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -11134,7 +11134,7 @@ static void red_display_cc_free_glz_drawables(RedChannelClient *rcc)
SPICE_GNUC_NORETURN void *red_worker_main(void *arg)
{
- RedWorker worker;
+ RedWorker *worker = spice_malloc(sizeof(RedWorker));
spice_printerr("begin");
spice_assert(MAX_PIPE_SIZE > WIDE_CLIENT_ACK_WINDOW &&
@@ -11146,28 +11146,28 @@ SPICE_GNUC_NORETURN void *red_worker_main(void *arg)
}
#endif
- red_init(&worker, (WorkerInitData *)arg);
- red_init_quic(&worker);
- red_init_lz(&worker);
- red_init_jpeg(&worker);
- red_init_zlib(&worker);
- worker.event_timeout = INF_EVENT_WAIT;
+ red_init(worker, (WorkerInitData *)arg);
+ red_init_quic(worker);
+ red_init_lz(worker);
+ red_init_jpeg(worker);
+ red_init_zlib(worker);
+ worker->event_timeout = INF_EVENT_WAIT;
for (;;) {
int i, num_events;
- worker.event_timeout = MIN(red_get_streams_timout(&worker), worker.event_timeout);
- num_events = poll(worker.poll_fds, MAX_EVENT_SOURCES, worker.event_timeout);
- red_handle_streams_timout(&worker);
+ worker->event_timeout = MIN(red_get_streams_timout(worker), worker->event_timeout);
+ num_events = poll(worker->poll_fds, MAX_EVENT_SOURCES, worker->event_timeout);
+ red_handle_streams_timout(worker);
- if (worker.display_channel) {
+ if (worker->display_channel) {
/* during migration, in the dest, the display channel can be initialized
while the global lz data not since migrate data msg hasn't been
received yet */
- red_channel_apply_clients(&worker.display_channel->common.base,
- red_display_cc_free_glz_drawables);
+ red_channel_apply_clients(&worker->display_channel->common.base,
+ red_display_cc_free_glz_drawables);
}
- worker.event_timeout = INF_EVENT_WAIT;
+ worker->event_timeout = INF_EVENT_WAIT;
if (num_events == -1) {
if (errno != EINTR) {
spice_error("poll failed, %s", strerror(errno));
@@ -11178,33 +11178,33 @@ SPICE_GNUC_NORETURN void *red_worker_main(void *arg)
/* The watch may have been removed by the watch-func from
another fd (ie a disconnect through the dispatcher),
in this case watch_func is NULL. */
- if (worker.poll_fds[i].revents && worker.watches[i].watch_func) {
+ if (worker->poll_fds[i].revents && worker->watches[i].watch_func) {
int events = 0;
- if (worker.poll_fds[i].revents & POLLIN) {
+ if (worker->poll_fds[i].revents & POLLIN) {
events |= SPICE_WATCH_EVENT_READ;
}
- if (worker.poll_fds[i].revents & POLLOUT) {
+ if (worker->poll_fds[i].revents & POLLOUT) {
events |= SPICE_WATCH_EVENT_WRITE;
}
- worker.watches[i].watch_func(worker.poll_fds[i].fd, events,
- worker.watches[i].watch_func_opaque);
+ worker->watches[i].watch_func(worker->poll_fds[i].fd, events,
+ worker->watches[i].watch_func_opaque);
}
}
/* Clear the poll_fd for any removed watches, see the comment in
watch_remove for why we don't do this there. */
for (i = 0; i < MAX_EVENT_SOURCES; i++) {
- if (!worker.watches[i].watch_func) {
- worker.poll_fds[i].fd = -1;
+ if (!worker->watches[i].watch_func) {
+ worker->poll_fds[i].fd = -1;
}
}
- if (worker.running) {
+ if (worker->running) {
int ring_is_empty;
- red_process_cursor(&worker, MAX_PIPE_SIZE, &ring_is_empty);
- red_process_commands(&worker, MAX_PIPE_SIZE, &ring_is_empty);
+ red_process_cursor(worker, MAX_PIPE_SIZE, &ring_is_empty);
+ red_process_commands(worker, MAX_PIPE_SIZE, &ring_is_empty);
}
- red_push(&worker);
+ red_push(worker);
}
abort();
}