| OLD | NEW |
| 1 // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
| 4 | 4 |
| 5 #include <pthread.h> | 5 #include <pthread.h> |
| 6 #include <sys/time.h> | 6 #include <sys/time.h> |
| 7 | 7 |
| 8 #include <cstdio> | 8 #include <cstdio> |
| 9 | 9 |
| 10 #include "include/service_api.h" | 10 #include "include/service_api.h" |
| 11 #include "include/fletch_api.h" | 11 #include "include/dartino_api.h" |
| 12 | 12 |
| 13 #include "src/shared/assert.h" | 13 #include "src/shared/assert.h" |
| 14 #include "src/shared/platform.h" | 14 #include "src/shared/platform.h" |
| 15 | 15 |
| 16 #include "src/vm/thread_pool.h" | 16 #include "src/vm/thread_pool.h" |
| 17 | 17 |
| 18 #include "cc/performance_service.h" | 18 #include "cc/performance_service.h" |
| 19 | 19 |
| 20 static pthread_mutex_t mutex; | 20 static pthread_mutex_t mutex; |
| 21 static pthread_cond_t cond; | 21 static pthread_cond_t cond; |
| 22 static int status = 0; | 22 static int status = 0; |
| 23 | 23 |
| 24 static const int kDone = 1; | 24 static const int kDone = 1; |
| 25 static const int kCallCount = 10000; | 25 static const int kCallCount = 10000; |
| 26 | 26 |
| 27 static fletch::Monitor* echo_monitor = fletch::Platform::CreateMonitor(); | 27 static dartino::Monitor* echo_monitor = dartino::Platform::CreateMonitor(); |
| 28 static bool echo_async_done = false; | 28 static bool echo_async_done = false; |
| 29 | 29 |
| 30 static uint64_t GetMicroseconds() { | 30 static uint64_t GetMicroseconds() { |
| 31 struct timeval tv; | 31 struct timeval tv; |
| 32 if (gettimeofday(&tv, NULL) < 0) return -1; | 32 if (gettimeofday(&tv, NULL) < 0) return -1; |
| 33 uint64_t result = tv.tv_sec * 1000000LL; | 33 uint64_t result = tv.tv_sec * 1000000LL; |
| 34 result += tv.tv_usec; | 34 result += tv.tv_usec; |
| 35 return result; | 35 return result; |
| 36 } | 36 } |
| 37 | 37 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 void EchoInThread(void* data) { | 118 void EchoInThread(void* data) { |
| 119 intptr_t value = reinterpret_cast<intptr_t>(data); | 119 intptr_t value = reinterpret_cast<intptr_t>(data); |
| 120 for (int i = 0; i < 64; i++) { | 120 for (int i = 0; i < 64; i++) { |
| 121 int result = PerformanceService::echo(value + i); | 121 int result = PerformanceService::echo(value + i); |
| 122 ASSERT(result == value + i); | 122 ASSERT(result == value + i); |
| 123 } | 123 } |
| 124 } | 124 } |
| 125 | 125 |
| 126 static void RunThreadTests() { | 126 static void RunThreadTests() { |
| 127 const int kThreadCount = 32; | 127 const int kThreadCount = 32; |
| 128 fletch::ThreadPool thread_pool(kThreadCount); | 128 dartino::ThreadPool thread_pool(kThreadCount); |
| 129 thread_pool.Start(); | 129 thread_pool.Start(); |
| 130 for (int i = 0; i < kThreadCount; i++) { | 130 for (int i = 0; i < kThreadCount; i++) { |
| 131 while (!thread_pool.TryStartThread(EchoInThread, | 131 while (!thread_pool.TryStartThread(EchoInThread, |
| 132 reinterpret_cast<void*>(i))) { | 132 reinterpret_cast<void*>(i))) { |
| 133 } | 133 } |
| 134 } | 134 } |
| 135 thread_pool.JoinAll(); | 135 thread_pool.JoinAll(); |
| 136 } | 136 } |
| 137 | 137 |
| 138 static void ChangeStatusAndNotify(int new_status) { | 138 static void ChangeStatusAndNotify(int new_status) { |
| 139 pthread_mutex_lock(&mutex); | 139 pthread_mutex_lock(&mutex); |
| 140 status = new_status; | 140 status = new_status; |
| 141 pthread_cond_signal(&cond); | 141 pthread_cond_signal(&cond); |
| 142 pthread_mutex_unlock(&mutex); | 142 pthread_mutex_unlock(&mutex); |
| 143 } | 143 } |
| 144 | 144 |
| 145 static void WaitForStatus(int expected) { | 145 static void WaitForStatus(int expected) { |
| 146 pthread_mutex_lock(&mutex); | 146 pthread_mutex_lock(&mutex); |
| 147 while (expected != status) pthread_cond_wait(&cond, &mutex); | 147 while (expected != status) pthread_cond_wait(&cond, &mutex); |
| 148 pthread_mutex_unlock(&mutex); | 148 pthread_mutex_unlock(&mutex); |
| 149 } | 149 } |
| 150 | 150 |
| 151 static void* DartThreadEntry(void* arg) { | 151 static void* DartThreadEntry(void* arg) { |
| 152 const char* path = static_cast<char*>(arg); | 152 const char* path = static_cast<char*>(arg); |
| 153 FletchSetup(); | 153 DartinoSetup(); |
| 154 FletchRunSnapshotFromFile(path); | 154 DartinoRunSnapshotFromFile(path); |
| 155 FletchTearDown(); | 155 DartinoTearDown(); |
| 156 ChangeStatusAndNotify(kDone); | 156 ChangeStatusAndNotify(kDone); |
| 157 return NULL; | 157 return NULL; |
| 158 } | 158 } |
| 159 | 159 |
| 160 static void RunSnapshotInNewThread(char* path) { | 160 static void RunSnapshotInNewThread(char* path) { |
| 161 pthread_t thread; | 161 pthread_t thread; |
| 162 int result = pthread_create(&thread, NULL, DartThreadEntry, path); | 162 int result = pthread_create(&thread, NULL, DartThreadEntry, path); |
| 163 if (result != 0) { | 163 if (result != 0) { |
| 164 perror("Failed to start thread"); | 164 perror("Failed to start thread"); |
| 165 exit(1); | 165 exit(1); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 185 printf("Usage: %s <snapshot>\n", argv[0]); | 185 printf("Usage: %s <snapshot>\n", argv[0]); |
| 186 return 1; | 186 return 1; |
| 187 } | 187 } |
| 188 SetupPerformanceTest(argc, argv); | 188 SetupPerformanceTest(argc, argv); |
| 189 RunEchoTests(); | 189 RunEchoTests(); |
| 190 RunTreeTests(); | 190 RunTreeTests(); |
| 191 RunThreadTests(); | 191 RunThreadTests(); |
| 192 TearDownPerformanceTest(); | 192 TearDownPerformanceTest(); |
| 193 return 0; | 193 return 0; |
| 194 } | 194 } |
| OLD | NEW |