X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=arch%2Fum%2Fdrivers%2Fxterm_kern.c;h=afce46fa64d3b7e58134ad658396c695c80437b5;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=a94813fce47345248bc3a13c2c62e97c07eef138;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/arch/um/drivers/xterm_kern.c b/arch/um/drivers/xterm_kern.c index a94813fce..afce46fa6 100644 --- a/arch/um/drivers/xterm_kern.c +++ b/arch/um/drivers/xterm_kern.c @@ -46,6 +46,8 @@ int xterm_fd(int socket, int *pid_out) printk(KERN_ERR "xterm_fd : failed to allocate xterm_wait\n"); return(-ENOMEM); } + + /* This is a locked semaphore... */ *data = ((struct xterm_wait) { .sem = __SEMAPHORE_INITIALIZER(data->sem, 0), .fd = socket, @@ -55,14 +57,20 @@ int xterm_fd(int socket, int *pid_out) err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt, SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, "xterm", data); - if(err){ + if (err){ printk(KERN_ERR "xterm_fd : failed to get IRQ for xterm, " "err = %d\n", err); ret = err; goto out; } + + /* ... so here we wait for an xterm interrupt. + * + * XXX Note, if the xterm doesn't work for some reason (eg. DISPLAY + * isn't set) this will hang... */ down(&data->sem); + free_irq_by_irq_and_dev(XTERM_IRQ, data); free_irq(XTERM_IRQ, data); ret = data->new_fd;