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.

212 lines
4.1KB

  1. /*
  2. Copyright (C) 2004-2006 Grame
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  14. */
  15. #include <stdio.h>
  16. #include <sys/time.h>
  17. #include <stdlib.h>
  18. #ifdef __APPLE__
  19. #include "JackMachSemaphore.h"
  20. #include "JackMachThread.h"
  21. #endif
  22. #include "JackPosixThread.h"
  23. #include "JackPosixSemaphore.h"
  24. #include "JackFifo.h"
  25. #define ITER 500000
  26. int verbose = 0;
  27. using namespace Jack;
  28. struct ServerThread : public JackRunnableInterface {
  29. JackThread* fThread;
  30. JackSynchro* fServerSem;
  31. JackSynchro* fClientSem;
  32. ServerThread()
  33. {
  34. fServerSem->Allocate("JackSemServer", 0);
  35. fClientSem->Allocate("JackSemClient", 0);
  36. //fThread = new JackMachThread(this);
  37. fThread->SetParams(0, 500*1000, 500*1000);
  38. fThread->Start();
  39. //fThread->AcquireRealTime();
  40. }
  41. virtual ~ServerThread()
  42. {
  43. fThread->Kill();
  44. delete fThread;
  45. }
  46. bool Execute()
  47. {
  48. printf("Execute Server\n");
  49. for (int i = 0; i < ITER; i++)
  50. {
  51. fClientSem->Signal();
  52. fServerSem->Wait();
  53. }
  54. return true;
  55. }
  56. };
  57. struct ClientThread : public JackRunnableInterface {
  58. JackThread* fThread;
  59. JackSynchro* fServerSem;
  60. JackSynchro* fClientSem;
  61. ClientThread()
  62. {
  63. fServerSem->Connect("JackSemServer");
  64. fClientSem->Connect("JackSemClient");
  65. //fThread = new JackMachThread(this);
  66. fThread->SetParams(0, 500*1000, 500*1000);
  67. fThread->Start();
  68. //fThread->AcquireRealTime();
  69. }
  70. virtual ~ClientThread()
  71. {
  72. fThread->Kill();
  73. delete fThread;
  74. }
  75. bool Execute()
  76. {
  77. struct timeval T0, T1;
  78. printf("Execute Client\n");
  79. fClientSem->Wait();
  80. gettimeofday(&T0, 0);
  81. for (int i = 0; i < ITER; i++)
  82. {
  83. fServerSem->Signal();
  84. fClientSem->Wait();
  85. }
  86. gettimeofday(&T1, 0);
  87. printf("%5.1lf usec\n", (1e6 * T1.tv_sec - 1e6 * T0.tv_sec + T1.tv_usec - T0.tv_usec) / (2.0 * ITER));
  88. return true;
  89. }
  90. };
  91. void server(JackSynchro* sem)
  92. {
  93. char c;
  94. printf("server\n");
  95. sem->Allocate("JackSem", 0);
  96. while (((c = getchar()) != 'q')) {
  97. switch(c) {
  98. case 's':
  99. printf("SynchroSignal....\n");
  100. //sem->Signal();
  101. sem->SignalAll();
  102. printf("SynchroSignal OK\n");
  103. break;
  104. case 'w':
  105. printf("SemaphoreWait....\n");
  106. sem->Wait();
  107. printf("SemaphoreWait OK\n");
  108. break;
  109. }
  110. }
  111. }
  112. void client(JackSynchro* sem)
  113. {
  114. char c;
  115. printf("client\n");
  116. sem->Connect("JackSem");
  117. while (((c = getchar()) != 'q')) {
  118. switch(c) {
  119. case 's':
  120. printf("SemaphoreSignal....\n");
  121. sem->Signal();
  122. printf("SemaphoreSignal OK\n");
  123. break;
  124. case 'w':
  125. printf("SemaphoreWait....\n");
  126. sem->Wait();
  127. printf("SemaphoreWait OK\n");
  128. break;
  129. }
  130. }
  131. }
  132. int main (int argc, char * const argv[])
  133. {
  134. char c;
  135. ServerThread* serverthread = NULL;
  136. ClientThread* clientthread = NULL;
  137. JackSynchro* sem1 = NULL;
  138. if (strcmp(argv[1],"-s") == 0) {
  139. printf("Posix semaphore\n");
  140. sem1 = new JackPosixSemaphore();
  141. }
  142. if (strcmp(argv[1],"-f") == 0) {
  143. printf("Fifo\n");
  144. sem1 = new JackFifo();
  145. }
  146. #ifdef __APPLE__
  147. if (strcmp(argv[1],"-m") == 0) {
  148. printf("Mach semaphore\n");
  149. sem1 = new JackMachSemaphore();
  150. }
  151. #endif
  152. /*
  153. if (strcmp(argv[2], "server") == 0) {
  154. serverthread = new ServerThread();
  155. } else {
  156. clientthread = new ClientThread();
  157. }
  158. */
  159. if (strcmp(argv[2], "server") == 0) {
  160. server(sem1);
  161. } else {
  162. client(sem1);
  163. }
  164. while (((c = getchar()) != 'q')) {}
  165. delete serverthread;
  166. delete clientthread;
  167. }