00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifdef HAVE_CONFIG_H
00021 # include <config.h>
00022 #endif
00023
00024
00025
00026
00027
00028 #include "../visir/visir_queue.c"
00029 #include <cpl.h>
00030 #include <stdint.h>
00031
00032
00036
00037
00038 #define CONCAT(a,b) a ## _ ## b
00039 #define CONCAT2X(a,b) CONCAT(a,b)
00040
00041
00045
00046
00047 int main(void)
00048 {
00049
00050 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
00051 FILE * stream;
00052
00053 stream = cpl_msg_get_level() > CPL_MSG_INFO
00054 ? fopen("/dev/null", "a") : stdout;
00055
00056 #if defined _OPENMP && _OPENMP >= 200805
00057 {
00058 visir_queue * q = visir_queue_init(-1);
00059 cpl_test_eq(q->max_size, INT_MAX);
00060 cpl_test_eq(q->size, 0);
00061 visir_queue_delete(q);
00062 }
00063
00064 {
00065 const int N = 1000;
00066 visir_queue * q = visir_queue_init(-1);
00067 for (int i = 0; i < N; i++)
00068 visir_queue_put(q, (void*)(intptr_t)i);
00069 cpl_test_eq(q->size, N);
00070 for (int i = 0; i < N; i++)
00071 cpl_test_eq((intptr_t)visir_queue_pop(q), (intptr_t)i);
00072 cpl_test_eq(q->size, 0);
00073 visir_queue_delete(q);
00074 }
00075 {
00076 const int N = 100000;
00077 visir_queue * q = visir_queue_init(-1);
00078 omp_set_num_threads(10);
00079 #pragma omp parallel for
00080 for (int i = 0; i < N; i++)
00081 visir_queue_put(q, (void*)(intptr_t)i);
00082 cpl_test_eq(q->size, N);
00083 #pragma omp parallel for
00084 for (int i = 0; i < N; i++)
00085 visir_queue_pop(q);
00086 cpl_test_eq(q->size, 0);
00087 visir_queue_delete(q);
00088 }
00089 {
00090 const int N = 1000;
00091 visir_queue * q = visir_queue_init(5);
00092 omp_set_num_threads(10);
00093 #pragma omp parallel
00094 #pragma omp sections
00095 {
00096 #pragma omp section
00097 {
00098 for (int i = 0; i < N; i++) {
00099 visir_queue_put(q, (void*)55);
00100 cpl_test_leq(q->size, 5);
00101 }
00102
00103 }
00104 #pragma omp section
00105 {
00106 for (int i = 0; i < N; i++) {
00107 cpl_test_eq((intptr_t)visir_queue_pop(q), 55);
00108 cpl_test_leq(0, q->size);
00109 }
00110 }
00111 }
00112
00113 cpl_test_eq(q->size, 0);
00114 visir_queue_delete(q);
00115 }
00116
00117
00118 {
00119 const int N = 1000;
00120 visir_queue * q = visir_queue_init(5);
00121 omp_set_num_threads(10);
00122 #pragma omp parallel
00123 #pragma omp sections
00124 {
00125 #pragma omp section
00126 {
00127 for (int i = 0; i < N; i++) {
00128 visir_queue_put(q, (void*)55);
00129 cpl_test_leq(q->size, 5);
00130 }
00131
00132 }
00133 #pragma omp section
00134 {
00135 for (int i = 0; i < N / 10; i++) {
00136 cpl_test_eq((intptr_t)visir_queue_pop(q), 55);
00137 cpl_test_leq(0, q->size);
00138 }
00139 visir_queue_set_error(q, CPL_ERROR_ILLEGAL_INPUT);
00140 }
00141 }
00142
00143 visir_queue_delete(q);
00144 }
00145 #endif
00146
00147 if (stream != stdout) cpl_test_zero( fclose(stream) );
00148 return cpl_test_end(0);
00149 }