aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/standalone/libs/jni/c_timing.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cz/crcs/ectester/standalone/libs/jni/c_timing.c')
-rw-r--r--src/cz/crcs/ectester/standalone/libs/jni/c_timing.c254
1 files changed, 0 insertions, 254 deletions
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/c_timing.c b/src/cz/crcs/ectester/standalone/libs/jni/c_timing.c
deleted file mode 100644
index 018ceda..0000000
--- a/src/cz/crcs/ectester/standalone/libs/jni/c_timing.c
+++ /dev/null
@@ -1,254 +0,0 @@
-#include "c_timing.h"
-
-#if __linux || __posix
-
-#include <unistd.h>
-#include <time.h>
-#include <string.h>
-
-static unsigned long long tsc_start = 0;
-static unsigned long long tsc_end = 0;
-static unsigned long long tsc_partial = 0;
-static const char *rdtsc_unit = "instr";
-
-static inline unsigned long long rdtsc(void) {
- unsigned long long int x;
- __asm__ volatile ("rdtsc" : "=A" (x));
- return x;
-}
-
-static jlong rdtsc_timing_resolution() {
- return 1;
-}
-
-static void rdtsc_timing_start() {
- tsc_partial = 0;
- tsc_start = rdtsc();
-}
-
-static void rdtsc_timing_pause() {
- tsc_end = rdtsc();
- tsc_partial += tsc_end - tsc_start;
-}
-
-static void rdtsc_timing_restart() {
- tsc_start = rdtsc();
-}
-
-static void rdtsc_timing_stop() {
- tsc_end = rdtsc();
-}
-
-static jlong rdtsc_timing_last() {
- jlong res = (jlong) ((tsc_end - tsc_start) + tsc_partial);
- if (res < 0) {
- return 0;
- } else {
- return res;
- }
-}
-
-static struct timespec start = {0};
-static struct timespec end = {0};
-static jlong partial = 0;
-static clockid_t clk_id = CLOCK_MONOTONIC_RAW;
-static const char *clock_unit = "nano";
-
-static jlong clock_timing_resolution() {
- struct timespec timeval;
- clock_getres(clk_id, &timeval);
- return timeval.tv_nsec;
-}
-
-static void clock_timing_start() {
- partial = 0;
- clock_gettime(clk_id, &start);
-}
-
-static void clock_timing_pause() {
- clock_gettime(clk_id, &end);
- partial += (end.tv_sec - start.tv_sec) * 1000000000 + (end.tv_nsec - start.tv_nsec);
-}
-
-static void clock_timing_restart() {
- clock_gettime(clk_id, (struct timespec *)&start);
-}
-
-static void clock_timing_stop() {
- clock_gettime(clk_id, (struct timespec *)&end);
-}
-
-static jlong clock_timing_last() {
- jlong res = (end.tv_sec - start.tv_sec) * 1000000000 + (end.tv_nsec - start.tv_nsec) + partial;
- if (res < 0) {
- return 0;
- } else {
- return res;
- }
-}
-
-static jlong (*func_timing_resolution)() = &clock_timing_resolution;
-static void (*func_timing_start)() = &clock_timing_start;
-static void (*func_timing_pause)() = &clock_timing_pause;
-static void (*func_timing_restart)() = &clock_timing_restart;
-static void (*func_timing_stop)() = &clock_timing_stop;
-static jlong (*func_timing_last)() = &clock_timing_last;
-static const char *unit = "nano";
-
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_getNativeTimingSupport(JNIEnv *env, jobject self) {
- jclass set_class = (*env)->FindClass(env, "java/util/TreeSet");
-
- jmethodID set_ctr = (*env)->GetMethodID(env, set_class, "<init>", "()V");
- jmethodID set_add = (*env)->GetMethodID(env, set_class, "add", "(Ljava/lang/Object;)Z");
-
- jobject result = (*env)->NewObject(env, set_class, set_ctr);
- (*env)->CallBooleanMethod(env, result, set_add, (*env)->NewStringUTF(env, "rdtsc"));
- (*env)->CallBooleanMethod(env, result, set_add, (*env)->NewStringUTF(env, "monotonic"));
- (*env)->CallBooleanMethod(env, result, set_add, (*env)->NewStringUTF(env, "monotonic-raw"));
- (*env)->CallBooleanMethod(env, result, set_add, (*env)->NewStringUTF(env, "cputime-processor"));
- (*env)->CallBooleanMethod(env, result, set_add, (*env)->NewStringUTF(env, "cputime-thread"));
- return result;
-}
-
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_setNativeTimingType(JNIEnv *env, jobject self, jstring type) {
- const char *type_data = (*env)->GetStringUTFChars(env, type, NULL);
-
- if (strcmp(type_data, "rdtsc") == 0) {
- func_timing_resolution = &rdtsc_timing_resolution;
- func_timing_start = &rdtsc_timing_start;
- func_timing_pause = &rdtsc_timing_pause;
- func_timing_restart = &rdtsc_timing_restart;
- func_timing_stop = &rdtsc_timing_stop;
- func_timing_last = &rdtsc_timing_last;
- unit = rdtsc_unit;
- return JNI_TRUE;
- } else {
- if (strcmp(type_data, "monotonic") == 0) {
- clk_id = CLOCK_MONOTONIC;
- } else if (strcmp(type_data, "monotonic-raw") == 0) {
- clk_id = CLOCK_MONOTONIC_RAW;
- } else if (strcmp(type_data, "cputime-processor") == 0) {
- clk_id = CLOCK_PROCESS_CPUTIME_ID;
- } else if (strcmp(type_data, "cputime-thread") == 0) {
- clk_id = CLOCK_THREAD_CPUTIME_ID;
- } else {
- return JNI_FALSE;
- }
-
- func_timing_resolution = &clock_timing_resolution;
- func_timing_start = &clock_timing_start;
- func_timing_pause = &clock_timing_pause;
- func_timing_restart = &clock_timing_restart;
- func_timing_stop = &clock_timing_stop;
- func_timing_last = &clock_timing_last;
- unit = clock_unit;
- return JNI_TRUE;
- }
-}
-
-JNIEXPORT jlong JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_getNativeTimingResolution(JNIEnv *env, jobject self) {
- return native_timing_resolution();
-}
-
-JNIEXPORT jstring JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_getNativeTimingUnit(JNIEnv *env, jobject self) {
- return (*env)->NewStringUTF(env, unit);
-}
-
-JNIEXPORT jlong JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_getLastNativeTiming(JNIEnv *env, jobject self) {
- return native_timing_last();
-}
-
-jlong native_timing_resolution() {
- return func_timing_resolution();
-}
-
-void native_timing_start() {
- func_timing_start();
-}
-
-void native_timing_pause() {
- func_timing_pause();
-}
-
-void native_timing_restart() {
- func_timing_restart();
-}
-
-void native_timing_stop() {
- func_timing_stop();
-}
-
-jlong native_timing_last() {
- return func_timing_last();
-}
-
-#elif defined(__WIN32__) || defined(_MSC_VER)
-
-#include <Windows.h>
-#error TODO
-
-static LARGE_INTEGER start = {0};
-static LARGE_INTEGER end = {0};
-static jlong partial = 0;
-
-jboolean native_timing_supported() {
- return JNI_TRUE;
-}
-
-jlong native_timing_resolution() {
- LARGE_INTEGER freq;
- QueryPerformanceFrequency(&freq);
- return 1000000000 / freq.QuadPart;
-}
-
-void native_timing_start() {
- partial = 0;
- QueryPerformanceCounter(&start);
-}
-
-void native_timing_pause() {
- QueryPerformanceCounter(&end);
- partial = (end.QuadPart - start.QuadPart) * native_timing_resolution();
-}
-
-void native_timing_restart() {
- QueryPerformanceCounter(&start);
-}
-
-void native_timing_stop() {
- QueryPerformanceCounter(&end);
-}
-
-jlong native_timing_last() {
- jlong res = (end.QuadPart - start.QuadPart) * native_timing_resolution() + partial;
- if (res < 0) {
- return 0;
- } else {
- return res;
- }
-}
-
-#else
-
-#error TODO
-jboolean native_timing_supported() {
- return JNI_FALSE;
-}
-
-jlong native_timing_resolution() {
- return 0;
-}
-
-void native_timing_start() {}
-
-void native_timing_pause() {}
-
-void native_timing_restart() {}
-
-void native_timing_stop() {}
-
-jlong native_timing_last() {
- return 0;
-}
-
-#endif