Patch to process 1.0.1.1
Yusaku Hashimoto
nonowarn at gmail.com
Tue May 19 07:28:08 EDT 2009
Thank you for suggestion, Neil.
I have created a ticket on trac.
http://hackage.haskell.org/trac/ghc/ticket/3243
Thanks,
Hashimoto
On 2009/05/19, at 19:49, Neil Mitchell wrote:
> Hi Yusaku,
>
> So your patch doesn't get lost, can I suggest you file a GHC bug
> report and attach your patch to that?
> http://hackage.haskell.org/trac/ghc/wiki/ReportABug
>
> Thanks for the work in putting together a patch,
>
> Neil
>
> On Tue, May 19, 2009 at 11:36 AM, Yusaku Hashimoto
> <nonowarn at gmail.com> wrote:
>> I think I had not described context or purpose of my patch in last
>> mail. I'm going to explain the details about why the error occurs and
>> how the patch works. before and from I sent the patch, I have
>> inspected about them. So the detail was complicated but
>> interesting for me, I enjoyed it.
>>
>> Well, this patch seems to be useful only on the old-fashiond Mac OS X
>> 10.4.11, because no same error is not reported from anyone, and
>> I'm an
>> only ghc user who uses Mac OS X 10.4.11. And ghc seemed to has
>> quitted
>> to support the 10.4. This implies the patch should not be applied to
>> the repository. But if there are a few users like me, my patch and
>> report may be useful for (him|her).
>>
>> In this report, we will make sure that what the error is, then trying
>> to write minimal reproducing code, in last, write appropriate patch.
>>
>> First, What error has occured? It is occured when building
>> ghc-6.10.3. Main compilation successed such as compiler and library,
>> but building documents with haddock failed. From the error messages
>> below, when haddock runs gcc, the signal with SIGVTALRM is arrived to
>> gcc's child process (of cc1).
>>
>> if ifBuildable/ifBuildable /Users/mate/work/ghc-6.10.3/packages
>> integer-gmp && [ -d integer-gmp/dist/doc/html/*/src/ ]; then cp
>> hscolour.css
>> integer-gmp/dist/doc/html/*/src/; fi
>> if ifBuildable/ifBuildable /Users/mate/work/ghc-6.10.3/packages
>> base;
>> then \
>> cd base && /Users/mate/work/ghc-6.10.3/libraries/
>> cabal-bin
>> /usr/local/ghc-6.10.1/bin/ghc
>> /Users/mate/work/ghc-6.10.3/libraries/bootstrapping.conf 1.6.0.3
>> haddock
>> --html-location='../$pkg' \
>> --hyperlink-source
>> --with-haddock=/Users/mate/work/ghc-6.10.3/utils/haddock/install-
>> inplace/bin/haddock;
>> \
>> fi
>> Preprocessing library base-4.1.0.0...
>> Running hscolour for base-4.1.0.0...
>> Preprocessing library base-4.1.0.0...
>> Running Haddock for base-4.1.0.0...
>> Warning: The documentation for the following packages are not
>> installed.
>> No
>> links will be generated to these packages: rts-1.0
>> i686-apple-darwin8-gcc-4.0.1: Internal error: Virtual timer
>> expired
>> (program cc1)
>> Please submit a full bug report.
>> See <URL:http://developer.apple.com/bugreporter> for instructions.
>> make: *** [doc.library.base] Error 1
>>
>> Of course, this can be seen only when haddock runs gcc. So, how does
>> haddock invoke gcc? It uses process library that fork() process and
>> exec() command in posix environment. And what is the SIGVTALRM?
>> SIGVTALRM is sended to a process of haskell program with certain
>> interval by the timer. It used for the scheduler in ghc's rts.
>>
>> So, I could reproduce it with c (not haskell, unfortunately). Here
>> is the
>> code.
>>
>> #include <stdio.h>
>> #include <stdlib.h>
>> #include <unistd.h>
>> #include <signal.h>
>> #include <sys/types.h>
>> #include <sys/wait.h>
>>
>> void ignore (int sig) {}
>>
>> void start_timer(void) {
>> struct itimerval t;
>> struct sigaction a;
>>
>> a.sa_handler = ignore;
>> a.sa_flags = 0;
>> sigemptyset(&a.sa_mask);
>> sigaction(SIGVTALRM, &a, NULL);
>>
>> t.it_value.tv_sec = 0;
>> t.it_value.tv_usec = 1000;
>> t.it_interval = t.it_value;
>> setitimer(ITIMER_VIRTUAL, &t, NULL);
>> }
>>
>> void loop (unsigned n) {
>> while (--n)
>> ;
>> }
>>
>> void exec_gcc(void) {
>> char * args[] = {"gcc", "-xc", "-", NULL};
>> execvp("gcc", args);
>> }
>>
>> int main(void) {
>> pid_t p;
>> int s;
>>
>> start_timer();
>>
>> switch (p = fork()) {
>> case 0:
>> exec_gcc();
>>
>> default:
>> while (!waitpid(p, &s, WNOHANG)) loop(1000000);
>> }
>>
>> return s;
>> }
>>
>> When this code execute, start the timer for make SIGVTALRM arrived
>> with certaion interval, and make the process own to ignore it. Then
>> fork and exec the gcc, so child process will try to read c code from
>> stdin and compile it, but it will be fail with signal is arrived to
>> child process. The below output assumes above code saved as
>> minimul_example.c.
>>
>> $ gcc minimul_example.c -o minimul_example
>> $ ./minimul_example
>> main(){puts("foo");}
>> # Control-D typed here
>> i686-apple-darwin8-gcc-4.0.1: Internal error: Virtual timer
>> expired
>> (program cc1)
>> Please submit a full bug report.
>> See <URL:http://developer.apple.com/bugreporter> for instructions.
>>
>> So, error messages may be slightly different that depends what the
>> gcc's compile phase on signal arriving, but it is same that
>> compilation fails with the signal.
>>
>> Now, We can see what to do. Stop the timer before fork. This is done
>> in the patch created with darcs attached to the mail last I sent, but
>> I will paste important part of this. Informations for darcs are
>> ignored.
>>
>> hunk ./cbits/runProcess.c 66
>> // shared between parent and child), and the parent
>> behaves as if
>> // the signal had been raised.
>> blockUserSignals();
>> + stopTimer();
>>
>> switch(pid = fork())
>> {
>> hunk ./cbits/runProcess.c 71
>> case -1:
>> + startTimer();
>> unblockUserSignals();
>> if (fdStdIn == -1) {
>> close(fdStdInput[0]);
>> hunk ./cbits/runProcess.c 189
>> }
>> break;
>> }
>> + startTimer();
>> unblockUserSignals();
>>
>> return pid;
>>
>> In the above, `.' is top directory of
>> [process](http://darcs.haskell.org/packages/process/). And we must
>> remember start the timer after fork in parent process. After patch
>> applied, I tested the code with testsuite, It seemed to be fine.
>>
>> That's all. I hope it can't be reproduced on 10.5.
>>
>> Thanks,
>> Hashimoto
>>
>> On 2009/05/16, at 8:37, Yusaku Hashimoto wrote:
>>
>>
>>> Hi,
>>>
>>> I have a patch to process 1.0.1.1. If this patch is considered to be
>>> useful, Please apply.
>>>
>>> This patch solves strange haddock death, in Mac OS X 10.4.11 with
>>> intel
>>> CPU. Details are described in
>>> http://www.nabble.com/6.10.3-prerelease-td23346957.html
>>>
>>> Thanks,
>>> Hashimoto
>>>
>>>
>>> <1242387095.dpatch>
>>>
>>
>> _______________________________________________
>> Libraries mailing list
>> Libraries at haskell.org
>> http://www.haskell.org/mailman/listinfo/libraries
>>
More information about the Libraries
mailing list