MPE libc sleep() function fix

  1. The Problem
  2. The program sleep01.c
  3. HPUX output
  4. The program sleep02.c
  5. MPE output
  6. sleep() - disassembled
  7. New sleep.c
  8. New MPE output

The Problem:


The program sleep01.c

01 /*----------------------------------------------------------------*/
02 /* sleep01.c   sleep test  Keven Miller   04/25/2011              */
03 /*----------------------------------------------------------------*/
04 #include <stdio.h>
05 #include <unistd.h>
06 #include <signal.h>
07 #include <time.h>
08 
09 #define  proc
10 
11 proc void sleepcy (int sig)
12 {
13    printf ("!! Control-C SIGINT %d !!\n", sig);
14    signal ( sig, &sleepcy );
15 }
16 
17 proc int main ( int ac, char *av[] )
18 {
19    int   uns, secs;
20    time_t t1, t2;
21 
22    signal ( SIGINT, &sleepcy );
23 
24    secs = 10;
25    printf ("Sleep 10\n");
26 
27    t1 = time (0);
28    uns = sleep (secs);
29    t2 = time (0);
30 
31    printf ("Sleep unslept secs %d (Actual secs %d)\n", uns, t2 - t1);
32 }
33/*----------------------------------------------------------------*/

HPUX output

CommentHPUX Session


Run with no interruption




Run again

After 4 seconds, type Control-C
hpux-1:kevenm /home/kevenm/src#
hpux-1:kevenm /home/kevenm/src#
hpux-1:kevenm /home/kevenm/src#sleep01
Sleep 10
Sleep unslept secs 0 (Actual secs 10)
hpux-1:kevenm /home/kevenm/src#
hpux-1:kevenm /home/kevenm/src#
hpux-1:kevenm /home/kevenm/src#sleep01
Sleep 10
!! Control-C SIGINT 2 !!
Sleep unslept secs 6 (Actual secs 4)
hpux-1:kevenm /home/kevenm/src#
hpux-1:kevenm /home/kevenm/src#

The program sleep02.c

01 /*----------------------------------------------------------------*/
02 /* sleep02.c   sleep test  Keven Miller   04/25/2011              */
03 /*----------------------------------------------------------------*/
04 #pragma list off                       /*MPE*/
05 #include <stdio.h>
06 #include <unistd.h>
07 #include <signal.h>
08 #include <time.h>
09 
10 #pragma intrinsic XCONTRAP             /*MPEcy*/
11 #pragma intrinsic RESETCONTROL         /*MPEcy*/
12 
13 #define  proc
14 
15 /*----------------------------------------------------------------*/
16 proc void cytrap (void)                /*MPEcy*/
17 {                                      /*MPEcy*/
18    raise (SIGINT);                     /*MPEcy*/
19    RESETCONTROL ();                    /*MPEcy*/
20 }                                      /*MPEcy*/
21 /*----------------------------------------------------------------*/
22 
23 proc void sleepcy (int sig)
24 {
25    printf ("!! Control-Y SIGINT %d !!\n", sig);  /*MPEcy*/
26    signal ( sig, &sleepcy );
27 }
28 
29 proc int main ( int ac, char *av[] )
30 {
31    int   uns, secs, old;
32    time_t t1, t2;
33 
34    XCONTRAP ( (int) &cytrap, &old );   /*MPEcy*/
35 
36    signal ( SIGINT, &sleepcy );
37 
38    secs = 10;
39    printf ("Sleep 10\n");
40
41    t1 = time (0);
42    uns = sleep (secs);
43    t2 = time (0);
44 
45    printf ("Sleep unslept secs %d (Actual secs %d)\n", uns, t2 - t1);
46 }
47 /*----------------------------------------------------------------*/

MPE output

CommentMPE Session



Build sleep02 without the
  /*MPEcy*/ tagged lines












Run test; wait 2-3 seconds
Then type Control-Y
No interrupt response.




Build with the 
  /*MPEcy*/ tagged lines
  
  
  
  
  
  
  
  
  
  
  
  
  
Run test; wait 2-3 seconds
Then type Control-Y
Interrupt occurrs !!
But sleep not interrupted
It actually increased !!
Fox 11:
Fox 11:
Fox 11:setvar ccopts "-Aa +e +w1"
Fox 11:ccxllk sleep02c,sleep02
MON APR 25 2011 10:50 AM  Copyright Hewlett-Packard Co. 1984. PAGE  1
HP C/iX HP31506 A.05.19                                    "SLEEP02C"

    1  0   # 1 "SLEEP02C.LIBC.KEVENM"
    1  0   #pragma list off
Clean compile
HP Link Editor/iX (HP30315A.06.17) Copyright Hewlett-Packard Co 1986

LinkEd> link from=$oldpass;rl=libc.lib.sys,libcansi.lib.sys;&
>>>>>>> TO=sleep02;SHARE
 
Clean Link
Fox 11:
Fox 11:sleep02
Sleep 10
Sleep unslept secs 0 (Actual secs 10)
Fox 11:
...
Fox 11:
Fox 11:
Fox 11:ccxllk sleep02c,sleep02
CCOPTS=-Aa +e +w1   
MON APR 25 2011 10:53 AM  Copyright Hewlett-Packard Co. 1984. PAGE  1
HP C/iX HP31506 A.05.19                                    "SLEEP02C"

    1  0   # 1 "SLEEP02C.LIBC.KEVENM"
    1  0   #pragma list off
Clean compile
HP Link Editor/iX (HP30315A.06.17) Copyright Hewlett-Packard Co 1986

LinkEd> link from=$oldpass;rl=libc.lib.sys,libcansi.lib.sys;&
>>>>>>> TO=sleep02;SHARE;CAP=
 
Clean Link
Fox 11:
Fox 11:sleep02
Sleep 10
!! Control-Y SIGINT 2 !!
Sleep unslept secs 0 (Actual secs 13)
Fox 11:
Fox 11:

sleep() - disassembled

CommentMPE Session






Disassemble sleep()



Save seconds into reg3


Save reg 3 into 64 bit field
Load 64 bit fixed into fpreg4
Convert fixed to float fpreg5

Call PAUSE 
Cnvt float to fixed reg26
Call CCODE

Comp CCE(2) to reg28;skip if =
Save secs to reg28;skip
Zero return reg28
 
return 
Fox 11:
Fox 11:run sleep02;debug

DEBUG/iX C.16.01 

DEBUG Intrinsic at: 519.0000a294 ?$START$
$1 ($50) nmdebug > dc sleep,14
USER $1d0.a4c74   
000a4c74  sleep         6bc23fd9  STW      2,-20(0,30)
000a4c78  sleep+$4      6fc30080  STWM     3,64(0,30)
000a4c7c  sleep+$8      081a0243  OR       26,0,3
000a4c80  sleep+$c      0800025f  OR       0,0,31
000a4c84  sleep+$10     0fdf1281  STWS     31,-16(0,30)
000a4c88  sleep+$14     0fc31289  STWS     3,-12(0,30)
000a4c8c  sleep+$18     2fc11004  FLDDS    -16(0,30),4
000a4c90  sleep+$1c     30808a05  FCNVXF,DBL,SGL4,5
000a4c94  sleep+$20     37da3f99  LDO      -52(30),26
000a4c98  sleep+$24     e85f1f6d  BL       ?sleep+$1c,2
000a4c9c  sleep+$28     27401205  FSTWS    5,0(0,26)
000a4ca0  sleep+$2c     e85c11f5  BL       ?access+$9c,2
000a4ca4  sleep+$30     08000240  OR       0,0,0
000a4ca8  sleep+$34     93802004  COMICLR,=2,28,0
000a4cac  sleep+$38     0803125c  OR,TR    3,0,28
000a4cb0  sleep+$3c     0800025c  OR       0,0,28
000a4cb4  sleep+$40     4bc23f59  LDW      -84(0,30),2
000a4cb8  sleep+$44     e840c000  BV       0(2)
000a4cbc  sleep+$48     4fc33f81  LDWM     -64(0,30),3
000a4cc0  ?_system         e84000a0  BL       system,2
$2 ($50) nmdebug >

New sleep.c

01 /*----------------------------------------------------------------*/          
02 /* csleep.c    Keven Miller   24 Apr 2011    kevenm@3kranger.com  */
03 /* CCOPTS "-Aa +e +w1 +O2"                                        */
04 /*----------------------------------------------------------------*/
05 #pragma list off
06 #pragma LOCALITY "3kRanger"
07 #include "cstd.h"
08 
09 #pragma intrinsic CCODE
10 #pragma intrinsic PAUSE
11 #pragma intrinsic RESETCONTROL
12 #pragma intrinsic XCONTRAP
13 
14 extern void PAUSEX ( f32* );
15 
16 #ifndef  ORG
17 
18 static f32 sleep_time;
19 static f32 unsleep_time;
20 static s32 prev_cytrap;
21 /*----------------------------------------------------------------*/
22 
23 proc static void sleep_cytrap (void)
24 {
25    unsleep_time = sleep_time;
26    sleep_time = 0.0;
27    if ( prev_cytrap )
28       (*(vfp)prev_cytrap)();
29    RESETCONTROL ();
30 }
31 
32 #endif
33 /*----------------------------------------------------------------*/
34 
35 proc u32 sleep ( u32 isecs )
36 {
37 #ifdef   ORG
38 
39    f32   f;
40 
41    f = isecs;
42    PAUSE ( &f );
43    if ( MPE_CCE != CCODE () )
44       return   isecs;
45    else
46       return   0;
47 
48 #else /* NEW */
49 
50    XCONTRAP ( (int) &sleep_cytrap, &prev_cytrap );
51 
52    sleep_time = isecs;
53    unsleep_time = sleep_time;
54 
55    PAUSEX ( &sleep_time );
56 
57    isecs = ( unsleep_time + 0.499999 );
58 
59    XCONTRAP ( prev_cytrap, &prev_cytrap );
60 
61    return   isecs;
62 
63 #endif
64 }
65 /*----------------------------------------------------------------*/

New MPE output

CommentMPE Session
   
   
   
Create NMOBJ of our sleep















Build sleep02 linking in 
 our sleep
 
 
 
 










Run test

Hit Control-Y
 We see the user trap output
 
Remove the Control-Y trap 
 from sleep02
Hit Control-Y
No user trap, or SIGINT
 but sleep now stops!
Fox 11:
Fox 11:
Fox 11:setvar ccopts "-Aa +e +w1 +O2"
Fox 11:ccxl csleep,csleepo
CCOPTS=-Aa +e +w1 +O2   
MON APR 25 2011  2:02 PM  Copyright Hewlett-Packard Co. 1984. PAGE  1
HP C/iX HP31506 A.05.19                                      "CSLEEP"

    1  0   # 1 "CSLEEP.LIBC.KEVENM"
    1  0   
    2  0   
    3  0   
    4  0   
    5  0   #pragma list off
Clean compile
Fox 11:
Fox 11:
Fox 11:setvar ccopts "-Aa +e +w1"
Fox 11:setvar linkobj "csleepo"
Fox 11:ccxllk sleep02c,sleep02
CCOPTS=-Aa +e +w1   
MON APR 25 2011  2:02 PM  Copyright Hewlett-Packard Co. 1984. PAGE  1
HP C/iX HP31506 A.05.19                                    "SLEEP02C"

    1  0   # 1 "SLEEP02C.LIBC.KEVENM"
    1  0   #pragma list off
Clean compile
HP Link Editor/iX (HP30315A.06.17) Copyright Hewlett-Packard Co 1986

LinkEd> link from=$oldpass,csleepo;rl=libc.lib.sys,libcansi.lib.sys;&
>>>>>>> TO=sleep02;SHARE;CAP=
 
Clean Link
Fox 11:
Fox 11:
Fox 11:sleep02
Sleep 10
!! Control-Y SIGINT 2 !!
Sleep unslept secs 7 (Actual secs 3)
Fox 11:
...
Fox 11:sleep02
Sleep 10
Sleep unslept secs 5 (Actual secs 5)
Fox 11:
Fox 11:

Updated [3khat16.ico]HP3000 [3khat16.ico]3kMail