after the suggestion of resample(1) some days ago
I've tried run it as a filter from another program.
this other program is non-threaded; for testing all
it does is call initdraw and read an image file
after which the resample routine is called.

in my resample routine it seems I need a call to sleep
to avoid the resample program to hang (in Pread).
(replacing the sleep by a fprint(2, "something\n") works too).

I'm just trying to understand what goes on -
is this the way to do this? if not, what am I missing?
I'm sorry if it is something obvious; I'm just trying to learn.

Axel.

Image*
resample(Image *from)
{
        int p[2];
        Image *img;

        if(pipe(p) < 0){
                fprint(2, "pipe fails: %r\n");
                exits("Epipe");
        }
        switch(fork()){
        case -1:
                fprint(2, "fork fails: %r\n");
                exits("Efork");
        default:
                if (writeimage(p[0], from, 0) < 0)
                        fprint(2, "error writeimage\n");
                close(p[0]);
                /* seems we need sleep to give up cpu so resample can run */
                sleep(1);
                img = readimage(display, p[1], 0);
                close(p[1]);
                waitpid();
                return img;
        case 0:
                dup(p[1], 0);
                dup(p[0], 1);
                execl("/bin/resample", "resample", "-x50%", nil);
                fprint(2, "execl fails: %r\n");
                exits("Eexec");
        }
        return nil;
}

Reply via email to