Переглянути джерело

fluid let uses derfer now and can be returned from

banana-cakes
Felix Brendel 7 роки тому
джерело
коміт
2b00885ba2
4 змінених файлів з 78 додано та 29 видалено
  1. +0
    -0
     
  2. +54
    -14
      macros.hpp
  3. +21
    -12
      profiler.hpp
  4. +3
    -3
      test.cpp

+ 54
- 14
macros.hpp Переглянути файл

@@ -1,5 +1,5 @@
#pragma once #pragma once
#include <functional>
// #include <functional>


#define proc auto #define proc auto


@@ -55,23 +55,63 @@ struct {
#define defer auto TOKENPASTE2(__deferred_lambda_call, __COUNTER__) = deferrer << [&] #define defer auto TOKENPASTE2(__deferred_lambda_call, __COUNTER__) = deferrer << [&]




/**
/*
defer {
call();
};

expands to:

auto __deferred_lambda_call0 = deferrer << [&] {
call();
};
*/

/*****************
* fluid-let * * fluid-let *
*/
*****************/


#define fluid_let(var, val) \ #define fluid_let(var, val) \
if (0) \ if (0) \
TOKENPASTE2(finished,__LINE__): ; \ TOKENPASTE2(finished,__LINE__): ; \
else \ else \
for (auto TOKENPASTE2(fluid_let_, __LINE__) = var;;) \ for (auto TOKENPASTE2(fluid_let_, __LINE__) = var;;) \
for(var = val;;) \
if (1) { \
goto TOKENPASTE2(body,__LINE__); \
} \
else \
while (1) \
if (1) { \
var = TOKENPASTE2(fluid_let_, __LINE__); \
goto TOKENPASTE2(finished, __LINE__); \
} \
else TOKENPASTE2(body,__LINE__):
for (defer{var = TOKENPASTE2(fluid_let_, __LINE__);};;) \
for(var = val;;) \
if (1) { \
goto TOKENPASTE2(body,__LINE__); \
} \
else \
while (1) \
if (1) { \
goto TOKENPASTE2(finished, __LINE__); \
} \
else TOKENPASTE2(body,__LINE__):


/**
fluid_let(var, val) {
call1(var);
call2(var);
}

expands to

if (0)
finished98:;
else
for (auto fluid_let_98 = var;;)
for (auto __deferred_lambda_call0 = deferrer << [&] { var = fluid_let_98; };;)
for (var = val;;)
if (1) {
goto body98;
} else
while (1)
if (1) {
goto finished98;
} else
body98 : {
call1(var);
call2(var);
}
*/

+ 21
- 12
profiler.hpp Переглянути файл

@@ -4,39 +4,48 @@
# include <stdio.h> # include <stdio.h>
# include <string.h> # include <string.h>
# include <time.h> # include <time.h>
// for syscall:
# include <unistd.h>
# include <sys/syscall.h>

//# include <bits/stdc++.h>
# include <iostream>
# include <sys/stat.h>
# include <sys/types.h>


struct Profiler { struct Profiler {
// same for all threads // same for all threads
inline static char file_template[40] = "\0"; inline static char file_template[40] = "\0";


// thread local // thread local
inline thread_local static bool is_initialized = false;
inline thread_local static int thread_id = -1;
inline thread_local static int call_depth = 0;
inline thread_local static FILE* out_file = nullptr;
inline thread_local static bool is_initialized = false;
inline thread_local static size_t thread_id = -1;
inline thread_local static int call_depth = 0;
inline thread_local static FILE* out_file = nullptr;
Profiler(const char* file, const char* func, const int line) { Profiler(const char* file, const char* func, const int line) {
call_depth += 1; call_depth += 1;


// if we never used this thread before // if we never used this thread before
if (!is_initialized) { if (!is_initialized) {
thread_id = syscall(__NR_gettid);
printf("Hello I am %d\n", thread_id);
thread_id = (size_t)&thread_id;
time_t t = time(NULL); time_t t = time(NULL);
tm* tm_i = localtime(&t); tm* tm_i = localtime(&t);


// create folder
#ifdef _MSC_VER
_mkdir("./profiler_reports/");
#else
mkdir("./profiler_reports/", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
#endif

// if we never even created the shared file name template // if we never even created the shared file name template
if (!file_template[0]) { if (!file_template[0]) {
sprintf(file_template, "%02d.%02d.%04d-%02d.%02d.%02d-%%02d-profiler.report",
// make sure folder exists
sprintf(file_template, "./profiler_reports/%02d.%02d.%04d-%02d.%02d.%02d-%%zd-profiler.report",
tm_i->tm_mday, tm_i->tm_mon+1, tm_i->tm_year+1900, tm_i->tm_mday, tm_i->tm_mon+1, tm_i->tm_year+1900,
tm_i->tm_hour, tm_i->tm_min, tm_i->tm_sec); tm_i->tm_hour, tm_i->tm_min, tm_i->tm_sec);
} }



char file_name[38];
char file_name[100];
sprintf(file_name, file_template, thread_id); sprintf(file_name, file_template, thread_id);
printf("Hello I am %zd\n", thread_id);
out_file = fopen(file_name, "w"); out_file = fopen(file_name, "w");
if (!out_file) { if (!out_file) {
printf("could not open %s\n", file_name); printf("could not open %s\n", file_name);


+ 3
- 3
test.cpp Переглянути файл

@@ -1,8 +1,8 @@
#define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


#include "profiler.hpp" #include "profiler.hpp"
#include "macros.h"

#include "macros.hpp"


int var = 100; int var = 100;


@@ -14,13 +14,13 @@ void test() {
printf("var is %d\n", var); printf("var is %d\n", var);
} }


printf("var is %d\n", var);
} }


int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
profile_this; profile_this;


test(); test();
printf("var is %d\n", var);


return 0; return 0;
} }

Завантаження…
Відмінити
Зберегти