jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

269 lines
6.1KB

  1. #ifdef WIN32
  2. #else
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <sys/mman.h>
  8. #include <sys/stat.h>
  9. #include <fcntl.h>
  10. #include <semaphore.h>
  11. #include <sys/time.h>
  12. #include <time.h>
  13. #endif
  14. #ifdef __APPLE__
  15. #include "JackMachSemaphore.h"
  16. #include "JackMachThread.h"
  17. #endif
  18. #ifdef WIN32
  19. #include "JackWinThread.h"
  20. #include "JackWinEvent.h"
  21. #endif
  22. #ifdef linux
  23. #include "JackPosixThread.h"
  24. #include "JackPosixSemaphore.h"
  25. #include "JackPthreadCond.h"
  26. #include "JackFifo.h"
  27. #endif
  28. #define ITER 100000
  29. #define SERVER "serveur1"
  30. #define CLIENT "client1"
  31. int verbose = 0;
  32. using namespace Jack;
  33. #ifdef WIN32
  34. LARGE_INTEGER gFreq;
  35. long gQueryOverhead;
  36. static long elapsed (LARGE_INTEGER * t1, LARGE_INTEGER *t2)
  37. {
  38. long high = t1->HighPart - t2->HighPart;
  39. double low = t1->LowPart - t2->LowPart;
  40. // ignore values when high part changes
  41. return high ? 0 : (long)((low * 1000000) / gFreq.LowPart);
  42. }
  43. static BOOL overhead (long * overhead)
  44. {
  45. LARGE_INTEGER t1, t2;
  46. BOOL r1, r2;
  47. int i = 50;
  48. r1 = QueryPerformanceCounter (&t1);
  49. while (i--)
  50. QueryPerformanceCounter (&t2);
  51. r2 = QueryPerformanceCounter (&t2);
  52. if (!r1 || !r2)
  53. return FALSE;
  54. *overhead = elapsed(&t2, &t1) / 50;
  55. return TRUE;
  56. }
  57. #endif
  58. class Test1 : public JackRunnableInterface
  59. {
  60. private:
  61. JackSynchro* fSynchro1;
  62. JackSynchro* fSynchro2;
  63. public:
  64. Test1(JackSynchro* synchro1, JackSynchro* synchro2)
  65. : fSynchro1(synchro1), fSynchro2(synchro2)
  66. {}
  67. bool Execute()
  68. {
  69. #ifdef WIN32
  70. LARGE_INTEGER t1, t2;
  71. BOOL r1, r2;
  72. r1 = QueryPerformanceCounter (&t1);
  73. #else
  74. struct timeval T0, T1;
  75. clock_t time1, time2;
  76. // Get total time for 2 * ITER process swaps
  77. time1 = clock();
  78. gettimeofday(&T0, 0);
  79. #endif
  80. printf("Execute loop Test1\n");
  81. for (int i = 0; i < ITER; i++) {
  82. fSynchro2->Signal();
  83. fSynchro1->Wait();
  84. }
  85. #ifdef WIN32
  86. r2 = QueryPerformanceCounter (&t2);
  87. elapsed(&t2, &t1);
  88. printf ("%5.1lf usec for inter process swap\n", elapsed(&t2, &t1) / (2.0 * ITER));
  89. #else
  90. time2 = clock();
  91. gettimeofday(&T1, 0);
  92. printf ("%5.1lf usec for inter process swap\n", (1e6 * T1.tv_sec - 1e6 * T0.tv_sec + T1.tv_usec - T0.tv_usec) / (2.0 * ITER));
  93. printf ("%f usec for inter process swap \n", (1e6 * ((time2 - time1) / (double(CLOCKS_PER_SEC)))) / (2.0 * ITER));
  94. #endif
  95. return true;
  96. }
  97. };
  98. class Test2 : public JackRunnableInterface
  99. {
  100. private:
  101. JackSynchro* fSynchro1;
  102. JackSynchro* fSynchro2;
  103. public:
  104. Test2(JackSynchro* synchro1, JackSynchro* synchro2)
  105. : fSynchro1(synchro1), fSynchro2(synchro2)
  106. {}
  107. bool Execute()
  108. {
  109. printf("Execute loop Test2\n");
  110. for (int i = 0; i < ITER; i++) {
  111. fSynchro2->Wait();
  112. fSynchro1->Signal();
  113. }
  114. return true;
  115. }
  116. };
  117. int main(int ac, char *av [])
  118. {
  119. Test1* obj1;
  120. Test2* obj2;
  121. JackSynchro* sem1 = NULL;
  122. JackSynchro* sem2 = NULL;
  123. JackSynchro* sem3 = NULL;
  124. JackSynchro* sem4 = NULL;
  125. JackThread* thread1;
  126. JackThread* thread2;
  127. #ifdef WIN32
  128. if (!QueryPerformanceFrequency (&gFreq) ||
  129. !overhead (&gQueryOverhead)) {
  130. printf ("cannot query performance counter\n");
  131. }
  132. #endif
  133. printf("Test of synchronization primitives : inside a process\n");
  134. printf("type -s to test Posix semaphore\n");
  135. printf("type -f to test Fifo\n");
  136. printf("type -m to test Mach semaphore\n");
  137. printf("type -e to test Windows event\n");
  138. #ifdef __APPLE__
  139. if (strcmp(av[1], "-m") == 0) {
  140. printf("Mach semaphore\n");
  141. sem1 = new JackMachSemaphore();
  142. sem2 = new JackMachSemaphore();
  143. sem3 = new JackMachSemaphore();
  144. sem4 = new JackMachSemaphore();
  145. }
  146. #endif
  147. #ifdef WIN32
  148. if (strcmp(av[1], "-e") == 0) {
  149. printf("Win event\n");
  150. sem1 = new JackWinEvent();
  151. sem2 = new JackWinEvent();
  152. sem3 = new JackWinEvent();
  153. sem4 = new JackWinEvent();
  154. }
  155. #endif
  156. #ifdef linux
  157. if (strcmp(av[1], "-s") == 0) {
  158. printf("Posix semaphore\n");
  159. sem1 = new JackPosixSemaphore();
  160. sem2 = new JackPosixSemaphore();
  161. sem3 = new JackPosixSemaphore();
  162. sem4 = new JackPosixSemaphore();
  163. }
  164. if (strcmp(av[1], "-f") == 0) {
  165. printf("Fifo\n");
  166. sem1 = new JackFifo();
  167. sem2 = new JackFifo();
  168. sem3 = new JackFifo();
  169. sem4 = new JackFifo();
  170. }
  171. if (strcmp(av[1], "-p") == 0) {
  172. printf("Fifo\n");
  173. sem1 = new JackPthreadCondServer();
  174. sem2 = new JackPthreadCondServer();
  175. sem3 = new JackPthreadCondClient(0);
  176. sem4 = new JackPthreadCondClient(0);
  177. }
  178. #endif
  179. sem1->Allocate(SERVER, 0);
  180. sem2->Allocate(CLIENT, 0);
  181. sem3->ConnectOutput(SERVER);
  182. sem4->ConnectInput(CLIENT);
  183. // run test in RT thread
  184. obj1 = new Test1(sem1, sem2);
  185. obj2 = new Test2(sem3, sem4);
  186. #ifdef __APPLE__
  187. thread1 = new JackMachThread(obj1, 10000 * 1000, 500 * 1000, 10000 * 1000);
  188. thread2 = new JackMachThread(obj2, 10000 * 1000, 500 * 1000, 10000 * 1000);
  189. #endif
  190. #ifdef WIN32
  191. thread1 = new JackWinThread(obj1);
  192. thread2 = new JackWinThread(obj2);
  193. #endif
  194. #ifdef linux
  195. thread1 = new JackPosixThread(obj1, false, 50, PTHREAD_CANCEL_DEFERRED);
  196. thread2 = new JackPosixThread(obj2, false, 50, PTHREAD_CANCEL_DEFERRED);
  197. #endif
  198. thread1->Start();
  199. thread2->Start();
  200. //thread1->AcquireRealTime();
  201. //thread2->AcquireRealTime();
  202. #ifdef WIN32
  203. Sleep(30 * 1000);
  204. #else
  205. sleep (30);
  206. #endif
  207. thread1->Stop();
  208. thread2->Stop();
  209. sem3->Disconnect();
  210. sem4->Disconnect();
  211. sem1->Destroy();
  212. sem2->Destroy();
  213. delete obj1;
  214. delete obj2;
  215. delete thread1;
  216. delete thread2;
  217. delete sem1;
  218. delete sem2;
  219. delete sem3;
  220. delete sem4;
  221. return 0;
  222. }