On 4/16/2014 3:39 AM, Jevgeni Astanovski wrote:
I tried what you said (_WAIT_MPL_SET)
Results are pretty similar:
Delay = 10 ms, waittime: 18.480 ms 
Delay = 20 ms, waittime: 38.960 ms 
Delay = 30 ms, waittime: 59.432 ms 
Delay = 40 ms, waittime: 52.360 ms 
Delay = 50 ms, waittime: 69.720 ms 
Delay = 60 ms, waittime: 89.440 ms 
Delay = 70 ms, waittime: 69.824 ms 
Delay = 80 ms, waittime: 91.824 ms 
Delay = 90 ms, waittime: 119.128 ms
Actually I do not expect that waittime is somewhat precise in milliseconds range - at least I see it isn't.
If you tell her to wait for a minute, you probably do not care about +/- 20ms!
But is there something that works reasonably in a milliseconds range?
I normally think of usleep() but that is not precise on IBM i either.
Here are some runs I did:
Delay = 10 ms, waittime: 20.024 ms
Delay = 20 ms, waittime: 40.016 ms
Delay = 30 ms, waittime: 60.024 ms
Delay = 40 ms, waittime: 70.024 ms
Delay = 50 ms, waittime: 71.920 ms
Delay = 60 ms, waittime: 74.640 ms
Delay = 70 ms, waittime: 100.024 ms
Delay = 80 ms, waittime: 110.024 ms
Delay = 90 ms, waittime: 120.024 ms
Delay = 10 ms, waittime: 10.072 ms
Delay = 20 ms, waittime: 40.024 ms
Delay = 30 ms, waittime: 38.376 ms
Delay = 40 ms, waittime: 41.104 ms
Delay = 50 ms, waittime: 80.024 ms
Delay = 60 ms, waittime: 66.120 ms
Delay = 70 ms, waittime: 72.312 ms
Delay = 80 ms, waittime: 110.024 ms
Delay = 90 ms, waittime: 120.032 ms
Delay = 10 ms, waittime: 12.648 ms
Delay = 20 ms, waittime: 40.024 ms
Delay = 30 ms, waittime: 31.712 ms
Delay = 40 ms, waittime: 70.024 ms
Delay = 50 ms, waittime: 57.080 ms
Delay = 60 ms, waittime: 77.936 ms
Delay = 70 ms, waittime: 74.416 ms
Delay = 80 ms, waittime: 109.944 ms
Delay = 90 ms, waittime: 120.016 ms
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <decimal.h>
int main (int argc, char *argv[])
{
  struct timeval tp1, tp2 ;
  struct timezone tpz ;
  decimal (9,3) Duration ;
  decimal (19,6) StartTime, EndTime ;
  int i ;
  useconds_t useconds ;
  for (i = 1; i < 10; i++)
  {
    gettimeofday(&tp1, &tpz) ;
    StartTime = tp1.tv_usec ;
    StartTime = tp1.tv_sec + (StartTime / 1000000D) ;
    useconds = i * 10000 ;  /* 10ms = 10 000us */
    usleep(useconds) ;
    gettimeofday(&tp2, &tpz) ;
    EndTime = tp2.tv_usec ;
    EndTime = tp2.tv_sec + (EndTime / 1000000D) ;
    Duration = (decimal (9,3)) ((EndTime - StartTime) * 1000D) ;
    printf("Delay = %d ms, waittime: %D(9,3) ms\n", i * 10, Duration) ;
  }
  return(0);
}
I tried it on Cygwin running on Windows 7.  Cygwin doesn't have decimal
so I had to make some changes:
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
int main (int argc, char *argv[])
{
  struct timeval tp1, tp2 ;
  struct timezone tpz ;
  int Duration ;
  int StartTime, EndTime ;
  int i ;
  useconds_t useconds ;
  for (i = 1; i < 10; i++)
  {
    gettimeofday(&tp1, &tpz) ;
    StartTime = tp1.tv_usec ;
    useconds = i * 10000 ;  /* 10ms = 10 000us */
    usleep(useconds) ;
    gettimeofday(&tp2, &tpz) ;
    EndTime = tp2.tv_usec ;
    Duration = EndTime - StartTime ;
    printf("Delay = %d ms, waittime: %d us\n", i * 10, Duration) ;
  }
  return(0);
}
$ ./usleep
Delay = 10 ms, waittime: 11001 us
Delay = 20 ms, waittime: 20001 us
Delay = 30 ms, waittime: 30002 us
Delay = 40 ms, waittime: 40002 us
Delay = 50 ms, waittime: 50003 us
Delay = 60 ms, waittime: 60003 us
Delay = 70 ms, waittime: 70004 us
Delay = 80 ms, waittime: 80005 us
Delay = 90 ms, waittime: 96006 us
$ ./usleep
Delay = 10 ms, waittime: 15001 us
Delay = 20 ms, waittime: 22001 us
Delay = 30 ms, waittime: 30002 us
Delay = 40 ms, waittime: 40002 us
Delay = 50 ms, waittime: 50003 us
Delay = 60 ms, waittime: 60004 us
Delay = 70 ms, waittime: 70004 us
Delay = 80 ms, waittime: 80004 us
Delay = 90 ms, waittime: 90005 us
I guess that we can't expect an operating system that is optimised for
database operations to honour precise timings in the same way that an
embedded processor or even Windows will.  :-(
  --buck
As an Amazon Associate we earn from qualifying purchases.