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.

210 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. fClientSem->Signal();
  51. fServerSem->Wait();
  52. }
  53. return true;
  54. }
  55. };
  56. struct ClientThread : public JackRunnableInterface {
  57. JackThread* fThread;
  58. JackSynchro* fServerSem;
  59. JackSynchro* fClientSem;
  60. ClientThread()
  61. {
  62. fServerSem->Connect("JackSemServer");
  63. fClientSem->Connect("JackSemClient");
  64. //fThread = new JackMachThread(this);
  65. fThread->SetParams(0, 500*1000, 500*1000);
  66. fThread->Start();
  67. //fThread->AcquireRealTime();
  68. }
  69. virtual ~ClientThread()
  70. {
  71. fThread->Kill();
  72. delete fThread;
  73. }
  74. bool Execute()
  75. {
  76. struct timeval T0, T1;
  77. printf("Execute Client\n");
  78. fClientSem->Wait();
  79. gettimeofday(&T0, 0);
  80. for (int i = 0; i < ITER; i++) {
  81. fServerSem->Signal();
  82. fClientSem->Wait();
  83. }
  84. gettimeofday(&T1, 0);
  85. printf("%5.1lf usec\n", (1e6 * T1.tv_sec - 1e6 * T0.tv_sec + T1.tv_usec - T0.tv_usec) / (2.0 * ITER));
  86. return true;
  87. }
  88. };
  89. void server(JackSynchro* sem)
  90. {
  91. char c;
  92. printf("server\n");
  93. sem->Allocate("JackSem", 0);
  94. while (((c = getchar()) != 'q')) {
  95. switch(c) {
  96. case 's':
  97. printf("SynchroSignal....\n");
  98. //sem->Signal();
  99. sem->SignalAll();
  100. printf("SynchroSignal OK\n");
  101. break;
  102. case 'w':
  103. printf("SemaphoreWait....\n");
  104. sem->Wait();
  105. printf("SemaphoreWait OK\n");
  106. break;
  107. }
  108. }
  109. }
  110. void client(JackSynchro* sem)
  111. {
  112. char c;
  113. printf("client\n");
  114. sem->Connect("JackSem");
  115. while (((c = getchar()) != 'q')) {
  116. switch(c) {
  117. case 's':
  118. printf("SemaphoreSignal....\n");
  119. sem->Signal();
  120. printf("SemaphoreSignal OK\n");
  121. break;
  122. case 'w':
  123. printf("SemaphoreWait....\n");
  124. sem->Wait();
  125. printf("SemaphoreWait OK\n");
  126. break;
  127. }
  128. }
  129. }
  130. int main (int argc, char * const argv[])
  131. {
  132. char c;
  133. ServerThread* serverthread = NULL;
  134. ClientThread* clientthread = NULL;
  135. JackSynchro* sem1 = NULL;
  136. if (strcmp(argv[1],"-s") == 0) {
  137. printf("Posix semaphore\n");
  138. sem1 = new JackPosixSemaphore();
  139. }
  140. if (strcmp(argv[1],"-f") == 0) {
  141. printf("Fifo\n");
  142. sem1 = new JackFifo();
  143. }
  144. #ifdef __APPLE__
  145. if (strcmp(argv[1],"-m") == 0) {
  146. printf("Mach semaphore\n");
  147. sem1 = new JackMachSemaphore();
  148. }
  149. #endif
  150. /*
  151. if (strcmp(argv[2], "server") == 0) {
  152. serverthread = new ServerThread();
  153. } else {
  154. clientthread = new ClientThread();
  155. }
  156. */
  157. if (strcmp(argv[2], "server") == 0) {
  158. server(sem1);
  159. } else {
  160. client(sem1);
  161. }
  162. while (((c = getchar()) != 'q')) {}
  163. delete serverthread;
  164. delete clientthread;
  165. }