diff --git a/src/core/ffi/all_cases.cc b/src/core/ffi/all_cases.cc index 065a136..70e9b93 100644 --- a/src/core/ffi/all_cases.cc +++ b/src/core/ffi/all_cases.cc @@ -25,3 +25,57 @@ int is_all_cases_prebuild_available() { return KLOTSKI_FALSE; } } + +void all_cases_build() { + AllCases::Instance().Build(); +} + +void all_cases_build_async(executor_t executor, notifier_t callback) { + executor([](void *cb) { + all_cases_build(); + ((notifier_t)cb)(); + }, (void*)callback); +} + +void all_cases_parallel_build(executor_t executor) { + typedef std::function Runner; + AllCases::Instance().BuildParallel([executor](Runner &&runner) { + executor([](void *fn) { + (*(Runner*)fn)(); + delete (Runner*)fn; + }, (void*)new Runner{std::move(runner)}); + }); +} + +void all_cases_parallel_build_async(executor_t executor, notifier_t callback) { + + typedef std::pair pp_t; + + auto pp = new pp_t; + pp->first = executor; + pp->second = callback; + + + auto lambda = [](void *arg) { + + std::cout << "enter lambda" << std::endl; + + auto *pp = (pp_t*)arg; + + all_cases_parallel_build(pp->first); + + ((notifier_t)pp->second)(); + + }; + + executor(lambda, (void*)pp); + +} + +int is_all_cases_available() { + if (AllCases::Instance().IsAvailable()) { + return KLOTSKI_TRUE; + } else { + return KLOTSKI_FALSE; + } +} diff --git a/src/core/ffi/klotski.h b/src/core/ffi/klotski.h index db2e9af..aa3b28a 100644 --- a/src/core/ffi/klotski.h +++ b/src/core/ffi/klotski.h @@ -32,8 +32,15 @@ EXTERN void all_cases_prebuild_async(executor_t executor, notifier_t callback); /// not completed, non-0 otherwise. EXTERN int is_all_cases_prebuild_available(); -//EXTERN void all_cases_build(); -//EXTERN int is_all_cases_available(); +EXTERN void all_cases_build(); + +EXTERN void all_cases_build_async(executor_t executor, notifier_t callback); + +EXTERN void all_cases_parallel_build(executor_t executor); + +EXTERN void all_cases_parallel_build_async(executor_t executor, notifier_t callback); + +EXTERN int is_all_cases_available(); //extern const uint32_t ALL_CASES_SIZE; //EXTERN_FUNC void export_all_cases(uint64_t *buffer); diff --git a/src/main.c b/src/main.c index 8b9dfbb..42d64c1 100644 --- a/src/main.c +++ b/src/main.c @@ -4,56 +4,76 @@ #include #include "core/ffi/klotski.h" -struct pthread_wrapper_t { +typedef struct { void (*fn)(void*); void *arg; -}; +} pthread_wrapper_t; void* pthread_wrapper(void *arg) { - - printf("enter wrapper\n"); - - struct pthread_wrapper_t *kk = (struct pthread_wrapper_t*)arg; - + printf("wrapper at %ld\n", pthread_self()); + pthread_wrapper_t *kk = (pthread_wrapper_t*)arg; kk->fn(kk->arg); - return NULL; } void callback() { - printf("enter callback\n"); + printf("callback is triggered\n"); } void executor(void(*fn)(void*), void *arg) { printf("executor receive task\n"); // fn(arg); - struct pthread_wrapper_t *kk = (struct pthread_wrapper_t*)malloc(sizeof(struct pthread_wrapper_t)); - + pthread_wrapper_t *kk = (pthread_wrapper_t*)malloc(sizeof(pthread_wrapper_t)); kk->fn = fn; kk->arg = arg; pthread_t pp; pthread_create(&pp, NULL, pthread_wrapper, (void*)kk); - } int main() { - printf("prebuild available -> %d\n", is_all_cases_prebuild_available()); - +// printf("prebuild available -> %d\n", is_all_cases_prebuild_available()); +// // printf("prebuild begin\n"); // all_cases_prebuild(); // printf("prebuild complete\n"); - - printf("prebuild begin\n"); - all_cases_prebuild_async(executor, callback); - printf("prebuild func exited\n"); - printf("prebuild available -> %d\n", is_all_cases_prebuild_available()); - +// +// printf("prebuild begin\n"); +// all_cases_prebuild_async(executor, callback); +// printf("prebuild func exited\n"); +// printf("prebuild available -> %d\n", is_all_cases_prebuild_available()); +// printf("start sleep 3s\n"); +// sleep(3); +// +// printf("prebuild available -> %d\n", is_all_cases_prebuild_available()); + + + printf("build available -> %d\n", is_all_cases_available()); + +// printf("build begin\n"); +// all_cases_build(); +// printf("build complete\n"); + +// printf("build begin\n"); +// all_cases_build_async(executor, callback); +// printf("build func exited\n"); +// printf("build available -> %d\n", is_all_cases_available()); +// printf("start sleep 3s\n"); +// sleep(3); + +// printf("build begin\n"); +// all_cases_parallel_build(executor); +// printf("build complete\n"); + + printf("build begin\n"); + all_cases_parallel_build_async(executor, callback); + printf("build func exited\n"); + printf("build available -> %d\n", is_all_cases_available()); printf("start sleep 3s\n"); sleep(3); - printf("prebuild available -> %d\n", is_all_cases_prebuild_available()); + printf("build available -> %d\n", is_all_cases_available()); return 0; }