test_preemption_float.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Test to see if floating point state is being properly maintained
  2.    for each thread.  Different threads doing floating point operations
  3.    simultaneously should not interfere with one another.  This
  4.    includes operations that might change some FPU flags, such as
  5.    rounding modes, at least implicitly.  */
  6. #include <pthread.h>
  7. #include <math.h>
  8. #include <stdio.h>
  9. int limit = 2;
  10. int float_passed = 0;
  11. int float_failed = 1;
  12. void *log_loop (void *x) {
  13.   int i;
  14.   double d, d1, d2;
  15.   /* sleep (1); */
  16.   for (i = 0; i < limit; i++) {
  17.     d = 42.0;
  18.     d = log (exp (d));
  19.     d = (d + 39.0) / d;
  20.     if (i == 0)
  21.       d1 = d;
  22.     else {
  23. d2 = d;
  24. d = sin(d);
  25. /* if (d2 != d1) { */
  26. if (memcmp (&d2, &d1, 8)) {
  27. pthread_exit(&float_failed);
  28. }
  29. }
  30.   }
  31.   pthread_exit(&float_passed);
  32. }
  33. void *trig_loop (void *x) {
  34.   int i;
  35.   double d, d1, d2;
  36.   /* sleep (1);  */
  37.   for (i = 0; i < limit; i++) {
  38.     d = 35.0;
  39.     d *= M_PI;
  40.     d /= M_LN2;
  41.     d = sin (d);
  42.     d = cos (1 / d);
  43.     if (i == 0)
  44.       d1 = d;
  45.     else {
  46. d2 = d;
  47. d = sin(d);
  48. /* if (d2 != d1) { */
  49. if (memcmp (&d2, &d1, 8)) {
  50.    pthread_exit(&float_failed);
  51. }
  52. }
  53.   }
  54.   pthread_exit(&float_passed);
  55. }
  56. #define N 10
  57. int main () {
  58.   int i;
  59.   pthread_t thread[2];
  60.   pthread_attr_t attr;
  61.   int *x, *y;
  62.   pthread_init ();
  63.   pthread_attr_init(&attr);
  64.   pthread_attr_setfloatstate(&attr, PTHREAD_NOFLOAT);
  65.   while(limit < 100000) {
  66.     pthread_create (&thread[0], &attr, trig_loop, 0);
  67.     pthread_create (&thread[1], &attr, log_loop, 0);
  68.    pthread_join(thread[0], (void **) &x);
  69.    pthread_join(thread[1], (void **) &y);
  70.    if ((*x == float_failed) || (*y == float_failed)) {
  71. limit *= 4;
  72. break;
  73. }
  74. limit *= 4;
  75.   }
  76.   if ((*x == float_passed) && (*y == float_passed)) {
  77. printf("test_preemption_float INDETERMINATEn");
  78.     return(0);
  79.   }
  80.   pthread_create (&thread[0], NULL, trig_loop, 0);
  81.   pthread_create (&thread[1], NULL, log_loop, 0);
  82.   pthread_join(thread[0], (void **) &x);
  83.   pthread_join(thread[1], (void **) &y);
  84.   if ((*x == float_failed) || (*y == float_failed)) {
  85. printf("test_preemption_float FAILEDn");
  86. return(1);
  87.   }
  88.   printf("test_preemption_float PASSEDn");
  89.   return(0);
  90. }