From b3a86984b5ab2ca5d74c3222f1bad316429132ea Mon Sep 17 00:00:00 2001 From: Teodoro Freund Date: Mon, 16 Dec 2024 09:45:01 +0000 Subject: [PATCH 1/3] Fix bug in tcp_demo benchmark --- .../Positive/Coroutine/BenchMark/tcp_demo/queue.hbs | 2 +- .../Coroutine/BenchMark/tcp_demo/scheduler.cbs | 11 +++++++++++ .../Coroutine/BenchMark/tcp_demo/scheduler.hbs | 5 +++++ .../Coroutine/BenchMark/tcp_demo/tcp_demo.cbs | 8 +++++--- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/queue.hbs b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/queue.hbs index cccee388c81f..0624bf61aec7 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/queue.hbs +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/queue.hbs @@ -73,7 +73,7 @@ void struct Queue::init(struct Queue *this, unsigned int capacity) this->buf = malloc(sizeof(T) * capacity); if (this->buf == NULL) { - fprintf(stderr, "Error: maloc failed, size: %lu\n", (sizeof(T) * capacity)); + fprintf(stderr, "Error: malloc failed, size: %lu\n", (sizeof(T) * capacity)); return; } int res = pthread_mutex_init(&this->mutex, NULL); diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.cbs b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.cbs index 7909c8b2da71..c15923ca1914 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.cbs +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.cbs @@ -120,6 +120,7 @@ void *schedule(void *arg) { struct ThreadContext *ctx = (struct ThreadContext *)arg; g_curCtx = ctx; clock_t start, end; + ++S.running_threads; while (true) { start = read_tsc(); @@ -159,6 +160,8 @@ void *schedule(void *arg) { break; } } + --S.running_threads; + return NULL; } @@ -188,6 +191,7 @@ void struct Scheduler::init(unsigned int threadCount) { g_curCtx = g_mainThread; S.threads[0] = g_mainThread; S.isInit = true; + S.running_threads = 0; unsigned int i; for (i = 1; i <= threadCount; i++) { @@ -245,9 +249,16 @@ struct Task *struct Scheduler::spawn(trait Future *future) { return t; } +void struct Scheduler::deinit() { + S.isInit = false; +} + void struct Scheduler::destroy() { unsigned int i; S.isInit = false; + while (S.running_threads > 0) { + // All threads must finish before deallocating + } if (S.globalQueue != NULL) { S.globalQueue->destroy(); free(S.globalQueue); diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.hbs b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.hbs index aaf33752472c..10b2aec47b02 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.hbs +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.hbs @@ -27,6 +27,7 @@ struct ThreadContext { }; struct Scheduler { + _Atomic int running_threads; _Bool isInit; struct Queue *globalQueue; unsigned int threadCount; @@ -41,6 +42,10 @@ struct ThreadContext * getCurrentCtx(); void struct Scheduler::init(unsigned int threadCount); void struct Scheduler::run(); struct Task * struct Scheduler::spawn(trait Future * future); +/** + * Start the de initialization of the scheduler, by telling all scheduling threads to stop + */ +void struct Scheduler::deinit(); void struct Scheduler::destroy(); // async void yield() diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/tcp_demo.cbs b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/tcp_demo.cbs index 00c175a3fb5f..1e6e8b84818c 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/tcp_demo.cbs +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/tcp_demo.cbs @@ -60,7 +60,7 @@ async void createMatrix(int matrix[ROW][COL]) { srand((unsigned)time(NULL)); for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { - matrix[i][j] = rand() %2; + matrix[i][j] = rand() % 2; } } } @@ -91,7 +91,7 @@ async void matrixCalculation() { FILE *file = fopen("./matrix.txt", "w"); if (file == NULL) { perror("error opening file\n"); - fclose(file); + return; } int k = 0; @@ -104,7 +104,8 @@ async void matrixCalculation() { k = 0; } - struct Scheduler::destroy(); + fclose(file); + struct Scheduler::deinit(); } int main() { @@ -119,6 +120,7 @@ int main() { struct Scheduler::run(); + struct Scheduler::destroy(); // 协程基础设施 if (g_noise.initCost > 0) -- Gitee From 58b6e4776433f7a22d21d884e854cd91dea23dad Mon Sep 17 00:00:00 2001 From: Teodoro Freund Date: Wed, 18 Dec 2024 11:28:39 +0000 Subject: [PATCH 2/3] Re generated tcp_demo_rewrite --- .../BenchMark/tcp_demo_rewrite/noise.c | 24 +- .../BenchMark/tcp_demo_rewrite/noise.h | 2 +- .../BenchMark/tcp_demo_rewrite/queue.h | 33 +- .../BenchMark/tcp_demo_rewrite/scheduler.c | 96 ++++-- .../BenchMark/tcp_demo_rewrite/scheduler.h | 82 ++++- .../BenchMark/tcp_demo_rewrite/tcp_demo.c | 300 +++++++++--------- 6 files changed, 355 insertions(+), 182 deletions(-) diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.c b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.c index 5ccb305269d2..313368947676 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.c +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.c @@ -1,7 +1,28 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s // expected-no-diagnostics -#include "noise.h" +#include + + +typedef struct { + uint64_t initCost; + uint64_t createTaskCost; + uint64_t createTaskCount; + uint64_t pushCost; + uint64_t pushCount; + uint64_t popCost; + uint64_t popCount; + uint64_t pollCost; + uint64_t getTaskCost; + uint64_t getTaskCount; + uint64_t freeCost; + uint64_t freeCount; + uint64_t businessCost; +}NOISE; + +uint64_t read_tsc(); + +void NOISE_init(NOISE *this); uint64_t read_tsc() { uint32_t start, end; @@ -22,6 +43,5 @@ void NOISE_init(NOISE *this) { this->getTaskCount = 0; this->freeCost = 0; this->businessCost = 0; - this->initFutureCost = 0; } diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.h b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.h index b3278153e735..9582e86249b3 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.h +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.h @@ -1,5 +1,6 @@ #include + typedef struct { uint64_t initCost; uint64_t createTaskCost; @@ -14,7 +15,6 @@ typedef struct { uint64_t freeCost; uint64_t freeCount; uint64_t businessCost; - uint64_t initFutureCost; }NOISE; uint64_t read_tsc(); diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/queue.h b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/queue.h index bd01e0a7f139..54e52f8725d1 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/queue.h +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/queue.h @@ -1,16 +1,31 @@ -#ifndef BISHENG_C_QUEUE_H -#define BISHENG_C_QUEUE_H - -#include -#include #include #include -#include #include -#include "noise.h" +#include +#include +#include +#include -extern NOISE g_noise; +typedef struct { + uint64_t initCost; + uint64_t createTaskCost; + uint64_t createTaskCount; + uint64_t pushCost; + uint64_t pushCount; + uint64_t popCost; + uint64_t popCount; + uint64_t pollCost; + uint64_t getTaskCost; + uint64_t getTaskCount; + uint64_t freeCost; + uint64_t freeCount; + uint64_t businessCost; +}NOISE; + +uint64_t read_tsc(); +void NOISE_init(NOISE *this); + +extern NOISE g_noise; -#endif \ No newline at end of file diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.c b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.c index b1881b1e99da..8cb28941e5ac 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.c +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.c @@ -1,23 +1,55 @@ // RUN: %clang -fsyntax-only %s // expected-no-diagnostics -#include "scheduler.h" +#include +#include +#include +#include +#include +#include +#include #include + +typedef struct { + uint64_t initCost; + uint64_t createTaskCost; + uint64_t createTaskCount; + uint64_t pushCost; + uint64_t pushCount; + uint64_t popCost; + uint64_t popCount; + uint64_t pollCost; + uint64_t getTaskCost; + uint64_t getTaskCount; + uint64_t freeCost; + uint64_t freeCount; + uint64_t businessCost; +}NOISE; + +struct Void {}; + struct __Trait_Future_struct_Void { void *data; struct __Trait_Future_Vtable_struct_Void *vtable; }; +enum State { + READY, + PARKED, + RUNNING, + COMPLETED +}; + struct Task { struct __Trait_Future_struct_Void future; - _Atomic(int) state; + atomic_int state; }; struct Queue_void_P { unsigned int writeIndex; unsigned int readIndex; - _Atomic(unsigned int) count; + atomic_uint count; unsigned int capacity; void **buf; pthread_mutex_t mutex; @@ -25,12 +57,13 @@ struct Queue_void_P { struct ThreadContext { unsigned int id; - unsigned long pid; + pthread_t pid; struct Queue_void_P localQueue; void *runningTask; }; struct Scheduler { + _Atomic(int) running_threads; _Bool isInit; struct Queue_void_P *globalQueue; unsigned int threadCount; @@ -63,17 +96,35 @@ static void struct_Queue_void_P_init(struct Queue_void_P *this, unsigned int cap static void struct_Queue_void_P_destroy(struct Queue_void_P *this); -struct Scheduler *getScheduler(void); +uint64_t read_tsc(); + +void NOISE_init(NOISE *this); + +extern NOISE g_noise; + +int taskCount(); + +void taskAddOne(); + +struct Scheduler *getScheduler(); + +struct ThreadContext * getCurrentCtx(); -struct ThreadContext *getCurrentCtx(void); +void struct_Scheduler_init(unsigned int threadCount); + +void struct_Scheduler_run(void); struct Task *struct_Scheduler_spawn(struct __Trait_Future_struct_Void future); +void struct_Scheduler_deinit(void); + +void struct_Scheduler_destroy(void); + struct __Trait_Future_struct_Void yield(void); struct Scheduler S; -_Atomic(int) g_taskCount; +atomic_int g_taskCount; struct ThreadContext *g_mainThread; @@ -181,7 +232,8 @@ static int findQueue() { void *schedule(void *arg) { struct ThreadContext *ctx = (struct ThreadContext *)arg; g_curCtx = ctx; - atomic_llong start, end; + clock_t start, end; + ++S.running_threads; while (1) { start = read_tsc(); @@ -193,13 +245,10 @@ void *schedule(void *arg) { end = read_tsc(); g_noise.getTaskCost += end - start; g_noise.getTaskCount++; - start = read_tsc(); struct PollResult_struct_Void s = task->future.vtable->poll(task->future.data); - end = read_tsc(); - g_noise.pollCost += end - start; ctx->runningTask = ((void *)0); if (s.isPending) { - __c11_atomic_store(&task->state, PARKED, 5); + atomic_store(&task->state, PARKED); int index = findQueue(); if (index == 0) { struct_Queue_void_P_push(S.globalQueue, task); @@ -208,8 +257,8 @@ void *schedule(void *arg) { } } else { start = read_tsc(); - __c11_atomic_store(&task->state, COMPLETED, 5); - __c11_atomic_fetch_sub(&g_taskCount, 1, 5); + atomic_store(&task->state, COMPLETED); + atomic_fetch_sub(&g_taskCount, 1); task->future.vtable->free(task->future.data); if (task != ((void *)0)) { free(task); @@ -223,6 +272,7 @@ void *schedule(void *arg) { break; } } + --S.running_threads; return ((void *)0); } @@ -250,6 +300,7 @@ void struct_Scheduler_init(unsigned int threadCount) { g_curCtx = g_mainThread; S.threads[0] = g_mainThread; S.isInit = 1; + S.running_threads = 0; unsigned int i; for (i = 1; i <= threadCount; i++) { struct ThreadContext *thread = malloc(sizeof(struct ThreadContext)); @@ -260,7 +311,7 @@ void struct_Scheduler_init(unsigned int threadCount) { thread->id = i; struct_Queue_void_P_init(&thread->localQueue, 128); S.threads[i] = thread; - unsigned long pid; + pthread_t pid; int res = pthread_create(&pid, ((void *)0), schedule, (void *)thread); thread->pid = pid; if (res != 0) { @@ -279,7 +330,7 @@ void struct_Scheduler_run(void) { } struct Task *struct_Scheduler_spawn(struct __Trait_Future_struct_Void future) { - long start, end; + clock_t start, end; start = read_tsc(); if (!S.isInit) { fprintf(stderr, "Error: please initialize the scheduler before spawn.\n"); @@ -305,9 +356,16 @@ struct Task *struct_Scheduler_spawn(struct __Trait_Future_struct_Void future) { return t; } +void struct_Scheduler_deinit(void) { + S.isInit = 0; +} + void struct_Scheduler_destroy(void) { unsigned int i; S.isInit = 0; + while (S.running_threads > 0) + { + } if (S.globalQueue != ((void *)0)) { struct_Queue_void_P_destroy(S.globalQueue); free(S.globalQueue); @@ -341,7 +399,7 @@ static struct PollResult_struct_Void struct_PollResult_struct_Void_completed(str } static void struct_Queue_void_P_push(struct Queue_void_P *this, void *value) { - unsigned long start, end; + uint64_t start, end; start = read_tsc(); pthread_mutex_lock(&this->mutex); this->buf[this->writeIndex] = value; @@ -366,7 +424,7 @@ static void struct_Queue_void_P_push(struct Queue_void_P *this, void *value) { } static void *struct_Queue_void_P_pop(struct Queue_void_P *this) { - unsigned long start, end; + uint64_t start, end; start = read_tsc(); pthread_mutex_lock(&this->mutex); if (this->count == 0) { @@ -390,7 +448,7 @@ static void struct_Queue_void_P_init(struct Queue_void_P *this, unsigned int cap } this->buf = malloc(sizeof(void *) * capacity); if (this->buf == ((void *)0)) { - fprintf(stderr, "Error: maloc failed, size: %lu\n", (sizeof(void *) * capacity)); + fprintf(stderr, "Error: malloc failed, size: %lu\n", (sizeof(void *) * capacity)); return; } int res = pthread_mutex_init(&this->mutex, ((void *)0)); diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.h b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.h index ddc541bb4a58..9258a2e0339d 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.h +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.h @@ -1,10 +1,27 @@ -#ifndef BISHENG_C_SCHEDULER_H -#define BISHENG_C_SCHEDULER_H - +#include +#include #include -#include -#include "future.h" -#include "queue.h" +#include +#include +#include +#include + + +typedef struct { + uint64_t initCost; + uint64_t createTaskCost; + uint64_t createTaskCount; + uint64_t pushCost; + uint64_t pushCount; + uint64_t popCost; + uint64_t popCount; + uint64_t pollCost; + uint64_t getTaskCost; + uint64_t getTaskCount; + uint64_t freeCost; + uint64_t freeCount; + uint64_t businessCost; +}NOISE; struct Void {}; @@ -15,16 +32,65 @@ enum State { COMPLETED }; +struct __Trait_Future_struct_Void { + void *data; + struct __Trait_Future_Vtable_struct_Void *vtable; +}; + +struct Task { + struct __Trait_Future_struct_Void future; + atomic_int state; +}; + +struct Queue_void_P { + unsigned int writeIndex; + unsigned int readIndex; + atomic_uint count; + unsigned int capacity; + void **buf; + pthread_mutex_t mutex; +}; + +struct ThreadContext { + unsigned int id; + pthread_t pid; + struct Queue_void_P localQueue; + void *runningTask; +}; + +struct Scheduler { + _Atomic(int) running_threads; + _Bool isInit; + struct Queue_void_P *globalQueue; + unsigned int threadCount; + struct ThreadContext **threads; +}; + +struct __Trait_Future_Vtable_struct_Void; + +uint64_t read_tsc(); + +void NOISE_init(NOISE *this); + +extern NOISE g_noise; + int taskCount(); void taskAddOne(); +struct Scheduler *getScheduler(); + +struct ThreadContext * getCurrentCtx(); + void struct_Scheduler_init(unsigned int threadCount); void struct_Scheduler_run(void); -void struct_Scheduler_destroy(void); +struct Task *struct_Scheduler_spawn(struct __Trait_Future_struct_Void future); +void struct_Scheduler_deinit(void); + +void struct_Scheduler_destroy(void); +struct __Trait_Future_struct_Void yield(void); -#endif \ No newline at end of file diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/tcp_demo.c b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/tcp_demo.c index 05309eafbac0..859b041f4b68 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/tcp_demo.c +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/tcp_demo.c @@ -1,34 +1,62 @@ // RUN: %clang %s %S/scheduler.c %S/noise.c -o %test.output -lpthread // expected-no-diagnostics +#include +#include +#include +#include +#include +#include #include #include -#include -#include #include -#include -#include +#include #include -#include "scheduler.h" +#include -#define ROW 50 #define COL 50 +#define ROW 50 #define BUFFER_SIZE 1024 +typedef struct { + uint64_t initCost; + uint64_t createTaskCost; + uint64_t createTaskCount; + uint64_t pushCost; + uint64_t pushCount; + uint64_t popCost; + uint64_t popCount; + uint64_t pollCost; + uint64_t getTaskCost; + uint64_t getTaskCount; + uint64_t freeCost; + uint64_t freeCount; + uint64_t businessCost; +}NOISE; + +struct Void {}; + struct __Trait_Future_struct_Void { void *data; struct __Trait_Future_Vtable_struct_Void *vtable; }; +enum State { + READY, + PARKED, + RUNNING, + COMPLETED +}; + struct Task { struct __Trait_Future_struct_Void future; - _Atomic(int) state; + atomic_int state; }; struct Queue_void_P { unsigned int writeIndex; unsigned int readIndex; - _Atomic(unsigned int) count; + atomic_uint count; unsigned int capacity; void **buf; pthread_mutex_t mutex; @@ -36,12 +64,13 @@ struct Queue_void_P { struct ThreadContext { unsigned int id; - unsigned long pid; + pthread_t pid; struct Queue_void_P localQueue; void *runningTask; }; struct Scheduler { + _Atomic(int) running_threads; _Bool isInit; struct Queue_void_P *globalQueue; unsigned int threadCount; @@ -91,14 +120,14 @@ struct _FuturematrixCalculation { int matrix2[50][50]; int result[50][50]; char buffer[1024]; - struct _IO_FILE *file; + FILE *file; int k; int i; int j; - struct __Trait_Future_struct_Void Ft_1; - struct __Trait_Future_struct_Void Ft_2; - struct __Trait_Future_struct_Void Ft_3; - struct FileWriter Ft_4; + struct _FuturecreateMatrix *Ft_1; + struct _FuturecreateMatrix *Ft_2; + struct _FuturemultiMatrix *Ft_3; + FileWriter Ft_4; int __future_state; }; @@ -108,12 +137,30 @@ static _Bool struct_PollResult_struct_Void_is_completed(struct PollResult_struct static struct PollResult_struct_Void struct_PollResult_struct_Void_completed(struct Void result); -struct Scheduler *getScheduler(void); +uint64_t read_tsc(); -struct ThreadContext *getCurrentCtx(void); +void NOISE_init(NOISE *this); + +extern NOISE g_noise; + +int taskCount(); + +void taskAddOne(); + +struct Scheduler *getScheduler(); + +struct ThreadContext * getCurrentCtx(); + +void struct_Scheduler_init(unsigned int threadCount); + +void struct_Scheduler_run(void); struct Task *struct_Scheduler_spawn(struct __Trait_Future_struct_Void future); +void struct_Scheduler_deinit(void); + +void struct_Scheduler_destroy(void); + struct __Trait_Future_struct_Void yield(void); NOISE g_noise; @@ -126,30 +173,43 @@ FileWriter fileWriter(FILE *file, char *buffer) { return fw; } -struct PollResult_struct_Void struct_FileWriter_poll(struct FileWriter *this) { +struct PollResult_struct_Void FileWriter_poll(FileWriter *this) { if (this->isWrited) { this->isWrited = 0; struct Void res = {}; return struct_PollResult_struct_Void_completed(res); } else { - unsigned long start, end; - start = read_tsc(); if (fprintf(this->file, "%s", this->buffer) < 0) { perror("file writer failed"); } - end = read_tsc(); - g_noise.businessCost = end - start; this->isWrited = 1; return struct_PollResult_struct_Void_pending(); } } -void struct_FileWriter_free(struct FileWriter *this) { +void FileWriter_free(FileWriter *this) { } -struct __Trait_Future_Vtable_struct_Void __struct_FileWriter_trait_Future = {.poll = (struct PollResult_struct_Void (*)(void *))struct_FileWriter_poll, .free = (void (*)(void *))struct_FileWriter_free}; +struct __Trait_Future_Vtable_struct_Void __struct_FileWriter_trait_Future = {.poll = (struct PollResult_struct_Void (*)(void *))FileWriter_poll, .free = (void (*)(void *))FileWriter_free}; + +struct _FuturecreateMatrix *__createMatrix(int (*matrix)[50]); + +struct _FuturecreateMatrix *__createMatrix(int (*matrix)[50]) { + struct _FuturecreateMatrix *data = calloc(1, sizeof(struct _FuturecreateMatrix)); + if (data == 0) { + exit(1); + } + data->matrix = matrix; + data->__future_state = 0; + return data; +} -struct __Trait_Future_struct_Void __createMatrix(int (*matrix)[50]); +void struct__FuturecreateMatrix_free(struct _FuturecreateMatrix *this) { + if (this != 0) { + free((void *)this); + this = (struct _FuturecreateMatrix *)(void *)0; + } +} struct PollResult_struct_Void struct__FuturecreateMatrix_poll(struct _FuturecreateMatrix *this) { switch (this->__future_state) { @@ -158,8 +218,6 @@ struct PollResult_struct_Void struct__FuturecreateMatrix_poll(struct _Futurecrea } __L0: ; - unsigned long start, end; - start = read_tsc(); int i; int j; this->k = 0; @@ -169,8 +227,6 @@ struct PollResult_struct_Void struct__FuturecreateMatrix_poll(struct _Futurecrea this->matrix[this->i][this->j] = rand() % 2; } } - end = read_tsc(); - g_noise.businessCost = end - start; { this->__future_state = -1; struct Void __RES_RETURN = (struct Void){}; @@ -178,27 +234,28 @@ struct PollResult_struct_Void struct__FuturecreateMatrix_poll(struct _Futurecrea } } -void struct__FuturecreateMatrix_free(struct _FuturecreateMatrix *this) { - if (this != 0) { - free((void *)this); - this = (struct _FuturecreateMatrix *)(void *)0; - } -} +struct __Trait_Future_Vtable_struct_Void __struct__FuturecreateMatrix_trait_Future = {.poll = (struct PollResult_struct_Void (*)(void *))struct__FuturecreateMatrix_poll, .free = (void (*)(void *))struct__FuturecreateMatrix_free}; -struct __Trait_Future_Vtable_struct_Void __Trait_Future_VtablecreateMatrix = {(struct PollResult_struct_Void (*)(void *))struct__FuturecreateMatrix_poll, (void (*)(void *))struct__FuturecreateMatrix_free}; +struct _FuturemultiMatrix *__multiMatrix(int (*matrix1)[50], int (*matrix2)[50], int (*result)[50]); -struct __Trait_Future_struct_Void __createMatrix(int (*matrix)[50]) { - struct _FuturecreateMatrix *data = calloc(1, sizeof(struct _FuturecreateMatrix)); +struct _FuturemultiMatrix *__multiMatrix(int (*matrix1)[50], int (*matrix2)[50], int (*result)[50]) { + struct _FuturemultiMatrix *data = calloc(1, sizeof(struct _FuturemultiMatrix)); if (data == 0) { exit(1); } - data->matrix = matrix; + data->matrix1 = matrix1; + data->matrix2 = matrix2; + data->result = result; data->__future_state = 0; - struct __Trait_Future_struct_Void fp = {(void *)data, &__Trait_Future_VtablecreateMatrix}; - return fp; + return data; } -struct __Trait_Future_struct_Void __multiMatrix(int (*matrix1)[50], int (*matrix2)[50], int (*result)[50]); +void struct__FuturemultiMatrix_free(struct _FuturemultiMatrix *this) { + if (this != 0) { + free((void *)this); + this = (struct _FuturemultiMatrix *)(void *)0; + } +} struct PollResult_struct_Void struct__FuturemultiMatrix_poll(struct _FuturemultiMatrix *this) { switch (this->__future_state) { @@ -207,8 +264,6 @@ struct PollResult_struct_Void struct__FuturemultiMatrix_poll(struct _Futuremulti } __L0: ; - unsigned long start, end; - start = read_tsc(); for (this->i = 0; this->i < 50; this->i++) { for (this->j = 0; this->j < 50; this->j++) { this->sum = 0; @@ -218,8 +273,6 @@ struct PollResult_struct_Void struct__FuturemultiMatrix_poll(struct _Futuremulti this->result[this->i][this->j] = this->sum; } } - end = read_tsc(); - g_noise.businessCost = end - start; { this->__future_state = -1; struct Void __RES_RETURN = (struct Void){}; @@ -227,29 +280,37 @@ struct PollResult_struct_Void struct__FuturemultiMatrix_poll(struct _Futuremulti } } -void struct__FuturemultiMatrix_free(struct _FuturemultiMatrix *this) { - if (this != 0) { - free((void *)this); - this = (struct _FuturemultiMatrix *)(void *)0; - } -} +struct __Trait_Future_Vtable_struct_Void __struct__FuturemultiMatrix_trait_Future = {.poll = (struct PollResult_struct_Void (*)(void *))struct__FuturemultiMatrix_poll, .free = (void (*)(void *))struct__FuturemultiMatrix_free}; -struct __Trait_Future_Vtable_struct_Void __Trait_Future_VtablemultiMatrix = {(struct PollResult_struct_Void (*)(void *))struct__FuturemultiMatrix_poll, (void (*)(void *))struct__FuturemultiMatrix_free}; +struct _FuturematrixCalculation *__matrixCalculation(void); -struct __Trait_Future_struct_Void __multiMatrix(int (*matrix1)[50], int (*matrix2)[50], int (*result)[50]) { - struct _FuturemultiMatrix *data = calloc(1, sizeof(struct _FuturemultiMatrix)); +struct _FuturematrixCalculation *__matrixCalculation(void) { + struct _FuturematrixCalculation *data = calloc(1, sizeof(struct _FuturematrixCalculation)); if (data == 0) { exit(1); } - data->matrix1 = matrix1; - data->matrix2 = matrix2; - data->result = result; data->__future_state = 0; - struct __Trait_Future_struct_Void fp = {(void *)data, &__Trait_Future_VtablemultiMatrix}; - return fp; + return data; } -struct __Trait_Future_struct_Void __matrixCalculation(void); +void struct__FuturematrixCalculation_free(struct _FuturematrixCalculation *this) { + if (this->Ft_3 != 0) { + struct__FuturemultiMatrix_free((void *)this->Ft_3); + this->Ft_3 = (struct _FuturemultiMatrix *)(void *)0; + } + if (this->Ft_2 != 0) { + struct__FuturecreateMatrix_free((void *)this->Ft_2); + this->Ft_2 = (struct _FuturecreateMatrix *)(void *)0; + } + if (this->Ft_1 != 0) { + struct__FuturecreateMatrix_free((void *)this->Ft_1); + this->Ft_1 = (struct _FuturecreateMatrix *)(void *)0; + } + if (this != 0) { + free((void *)this); + this = (struct _FuturematrixCalculation *)(void *)0; + } +} struct PollResult_struct_Void struct__FuturematrixCalculation_poll(struct _FuturematrixCalculation *this) { switch (this->__future_state) { @@ -266,8 +327,6 @@ struct PollResult_struct_Void struct__FuturematrixCalculation_poll(struct _Futur } __L0: ; - unsigned long start, end; - start = read_tsc(); char str[52]; int matrix1[50][50]; int matrix2[50][50]; @@ -279,17 +338,15 @@ struct PollResult_struct_Void struct__FuturematrixCalculation_poll(struct _Futur *__ARRAY_PTR_char++ = *__ASSIGNED_ARRAY_PTR_char++; } __ARRAY_PTR_char = /*implicit*/(char *)0; - end = read_tsc(); - g_noise.businessCost = end - start; this->Ft_1 = __createMatrix(this->matrix1); __L1: ; struct Void Res_1; - struct PollResult_struct_Void PR_1 = this->Ft_1.vtable->poll(this->Ft_1.data); + struct PollResult_struct_Void PR_1 = struct__FuturecreateMatrix_poll(this->Ft_1); if (struct_PollResult_struct_Void_is_completed(&PR_1, &Res_1)) { - if (this->Ft_1.data != 0) { - this->Ft_1.vtable->free(this->Ft_1.data); - this->Ft_1.data = (void *)0; + { + struct__FuturecreateMatrix_free(this->Ft_1); + this->Ft_1 = (struct _FuturecreateMatrix *)0; } } else { this->__future_state = 1; @@ -300,11 +357,11 @@ struct PollResult_struct_Void struct__FuturematrixCalculation_poll(struct _Futur __L2: ; struct Void Res_2; - struct PollResult_struct_Void PR_2 = this->Ft_2.vtable->poll(this->Ft_2.data); + struct PollResult_struct_Void PR_2 = struct__FuturecreateMatrix_poll(this->Ft_2); if (struct_PollResult_struct_Void_is_completed(&PR_2, &Res_2)) { - if (this->Ft_2.data != 0) { - this->Ft_2.vtable->free(this->Ft_2.data); - this->Ft_2.data = (void *)0; + { + struct__FuturecreateMatrix_free(this->Ft_2); + this->Ft_2 = (struct _FuturecreateMatrix *)0; } } else { this->__future_state = 2; @@ -315,41 +372,39 @@ struct PollResult_struct_Void struct__FuturematrixCalculation_poll(struct _Futur __L3: ; struct Void Res_3; - struct PollResult_struct_Void PR_3 = this->Ft_3.vtable->poll(this->Ft_3.data); + struct PollResult_struct_Void PR_3 = struct__FuturemultiMatrix_poll(this->Ft_3); if (struct_PollResult_struct_Void_is_completed(&PR_3, &Res_3)) { - if (this->Ft_3.data != 0) { - this->Ft_3.vtable->free(this->Ft_3.data); - this->Ft_3.data = (void *)0; + { + struct__FuturemultiMatrix_free(this->Ft_3); + this->Ft_3 = (struct _FuturemultiMatrix *)0; } } else { this->__future_state = 3; return struct_PollResult_struct_Void_pending(); } Res_3; - start = read_tsc(); this->file = fopen("./matrix.txt", "w"); if (this->file == ((void *)0)) { perror("error opening file\n"); - fclose(this->file); + { + this->__future_state = -1; + struct Void __RES_RETURN = (struct Void){}; + return struct_PollResult_struct_Void_completed(__RES_RETURN); + } } this->k = 0; - end = read_tsc(); - g_noise.businessCost = end - start; for (this->i = 0; this->i < 50; this->i++) { - start = read_tsc(); for (this->j = 0; this->j < 50; this->j++) { this->k += sprintf(&this->str[this->k], "%d ", this->result[this->i][this->j]); } this->str[this->k++] = '\x00'; - end = read_tsc(); - g_noise.businessCost = end - start; this->Ft_4 = fileWriter(this->file, this->buffer); __L4: ; struct Void Res_4; - struct PollResult_struct_Void PR_4 = struct_FileWriter_poll(&this->Ft_4); + struct PollResult_struct_Void PR_4 = FileWriter_poll(&this->Ft_4); if (struct_PollResult_struct_Void_is_completed(&PR_4, &Res_4)) { - struct_FileWriter_free(&this->Ft_4); + FileWriter_free(&this->Ft_4); } else { this->__future_state = 4; return struct_PollResult_struct_Void_pending(); @@ -357,75 +412,37 @@ struct PollResult_struct_Void struct__FuturematrixCalculation_poll(struct _Futur Res_4; this->k = 0; } - end = read_tsc(); - g_noise.businessCost = end - start; - struct_Scheduler_destroy(); + fclose(this->file); + struct_Scheduler_deinit(); { this->__future_state = -1; - struct Void __RES_RETURN = (struct Void){}; - return struct_PollResult_struct_Void_completed(__RES_RETURN); - } -} - -void struct__FuturematrixCalculation_free(struct _FuturematrixCalculation *this) { - if (this->Ft_3.data != 0) { - this->Ft_3.vtable->free(this->Ft_3.data); - this->Ft_3.data = (void *)0; - } - if (this->Ft_2.data != 0) { - this->Ft_2.vtable->free(this->Ft_2.data); - this->Ft_2.data = (void *)0; - } - if (this->Ft_1.data != 0) { - this->Ft_1.vtable->free(this->Ft_1.data); - this->Ft_1.data = (void *)0; - } - if (this != 0) { - free((void *)this); - this = (struct _FuturematrixCalculation *)(void *)0; + struct Void __RES_RETURN_1 = (struct Void){}; + return struct_PollResult_struct_Void_completed(__RES_RETURN_1); } } -struct __Trait_Future_Vtable_struct_Void __Trait_Future_VtablematrixCalculation = {(struct PollResult_struct_Void (*)(void *))struct__FuturematrixCalculation_poll, (void (*)(void *))struct__FuturematrixCalculation_free}; - -struct __Trait_Future_struct_Void __matrixCalculation(void) { - struct _FuturematrixCalculation *data = calloc(1, sizeof(struct _FuturematrixCalculation)); - if (data == 0) { - exit(1); - } - data->__future_state = 0; - struct __Trait_Future_struct_Void fp = {(void *)data, &__Trait_Future_VtablematrixCalculation}; - return fp; -} +struct __Trait_Future_Vtable_struct_Void __struct__FuturematrixCalculation_trait_Future = {.poll = (struct PollResult_struct_Void (*)(void *))struct__FuturematrixCalculation_poll, .free = (void (*)(void *))struct__FuturematrixCalculation_free}; int main(void) { NOISE_init(&g_noise); - unsigned long start, end; + uint64_t start, end; start = read_tsc(); struct_Scheduler_init(4); end = read_tsc(); g_noise.initCost = end - start; - struct_Scheduler_spawn(__matrixCalculation()); + struct_Scheduler_spawn((struct __Trait_Future_struct_Void){.data = __matrixCalculation(), .vtable = &__struct__FuturematrixCalculation_trait_Future}); struct_Scheduler_run(); - - // 业务逻辑 - printf("matrixCalculation cost: %lu\n", g_noise.businessCost); - - // 协程基础设施 - printf("scheduler init cost: %lu\n", g_noise.initCost); // 初始化调度器 - printf("scheduler init future cost: %lu\n", g_noise.initFutureCost); // 初始化 Future 对象 - if (g_noise.createTaskCount > 0) - printf("scheduler creat async task cost: %lu\n",g_noise.createTaskCost / g_noise.createTaskCount); // 创建异步任务 + struct_Scheduler_destroy(); + if (g_noise.initCost > 0) + printf("scheduler init cost: %lu\n", g_noise.initCost); + if (g_noise.createTaskCost > 0) + printf("scheduler creat async task cost: %lu\n", g_noise.createTaskCost / g_noise.createTaskCount); if (g_noise.freeCount > 0) - printf("scheduler free cost: %lu\n", g_noise.freeCost / g_noise.freeCount); // 销毁任务 - if (g_noise.pushCount > 0) - printf("scheduler push cost: %lu\n", g_noise.pushCost / g_noise.pushCount); // 入队 - if (g_noise.popCount > 0) - printf("scheduler pop cost: %lu\n", g_noise.popCost / g_noise.popCount); // 出队 - if (g_noise.businessCost > 0) - printf("scheduler poll cost: %lu\n", g_noise.pollCost - g_noise.businessCost); // 业务逻辑之外的开销(上下文切换等) - - // 调度策略 + printf("scheduler free cost: %lu\n", g_noise.freeCost / g_noise.freeCount); + if (g_noise.pushCost > 0) + printf("scheduler push cost: %lu\n", g_noise.pushCost / g_noise.pushCount); + if (g_noise.popCost > 0) + printf("scheduler pop cost: %lu\n", g_noise.popCost / g_noise.popCount); if (g_noise.getTaskCount > 0 && g_noise.popCount > 0) printf("scheduler get task cost: %lu\n", (g_noise.getTaskCost / g_noise.getTaskCount) - (g_noise.popCost / g_noise.popCount)); return 0; @@ -449,6 +466,3 @@ static struct PollResult_struct_Void struct_PollResult_struct_Void_completed(str return this; } - - - -- Gitee From 122cbeb0190d881b9d35dc6c6f966d760a7ee24e Mon Sep 17 00:00:00 2001 From: Teodoro Freund Date: Fri, 3 Jan 2025 09:32:10 +0000 Subject: [PATCH 3/3] scheduler must be destroyed after deinitialization --- .../BenchMark/tcp_demo/scheduler.cbs | 2 +- .../BenchMark/tcp_demo_rewrite/noise.c | 33 ++--- .../BenchMark/tcp_demo_rewrite/noise.h | 33 ++--- .../BenchMark/tcp_demo_rewrite/queue.h | 33 ++--- .../BenchMark/tcp_demo_rewrite/scheduler.c | 103 +++++++++------- .../BenchMark/tcp_demo_rewrite/scheduler.h | 62 ++++++---- .../BenchMark/tcp_demo_rewrite/tcp_demo.c | 115 ++++++++++-------- 7 files changed, 215 insertions(+), 166 deletions(-) diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.cbs b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.cbs index c15923ca1914..358c0bc27769 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.cbs +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.cbs @@ -255,7 +255,7 @@ void struct Scheduler::deinit() { void struct Scheduler::destroy() { unsigned int i; - S.isInit = false; + assert(!S.isInit); while (S.running_threads > 0) { // All threads must finish before deallocating } diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.c b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.c index 313368947676..93501f9eaaaa 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.c +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.c @@ -4,21 +4,24 @@ #include -typedef struct { - uint64_t initCost; - uint64_t createTaskCost; - uint64_t createTaskCount; - uint64_t pushCost; - uint64_t pushCount; - uint64_t popCost; - uint64_t popCount; - uint64_t pollCost; - uint64_t getTaskCost; - uint64_t getTaskCount; - uint64_t freeCost; - uint64_t freeCount; - uint64_t businessCost; -}NOISE; +struct _TD_NOISE; +typedef struct _TD_NOISE NOISE; + +struct _TD_NOISE { + uint64_t initCost; + uint64_t createTaskCost; + uint64_t createTaskCount; + uint64_t pushCost; + uint64_t pushCount; + uint64_t popCost; + uint64_t popCount; + uint64_t pollCost; + uint64_t getTaskCost; + uint64_t getTaskCount; + uint64_t freeCost; + uint64_t freeCount; + uint64_t businessCost; +}; uint64_t read_tsc(); diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.h b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.h index 9582e86249b3..769c7d2c3646 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.h +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/noise.h @@ -1,21 +1,24 @@ #include -typedef struct { - uint64_t initCost; - uint64_t createTaskCost; - uint64_t createTaskCount; - uint64_t pushCost; - uint64_t pushCount; - uint64_t popCost; - uint64_t popCount; - uint64_t pollCost; - uint64_t getTaskCost; - uint64_t getTaskCount; - uint64_t freeCost; - uint64_t freeCount; - uint64_t businessCost; -}NOISE; +struct _TD_NOISE; +typedef struct _TD_NOISE NOISE; + +struct _TD_NOISE { + uint64_t initCost; + uint64_t createTaskCost; + uint64_t createTaskCount; + uint64_t pushCost; + uint64_t pushCount; + uint64_t popCost; + uint64_t popCount; + uint64_t pollCost; + uint64_t getTaskCost; + uint64_t getTaskCount; + uint64_t freeCost; + uint64_t freeCount; + uint64_t businessCost; +}; uint64_t read_tsc(); diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/queue.h b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/queue.h index 54e52f8725d1..cc721687e08f 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/queue.h +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/queue.h @@ -7,21 +7,24 @@ #include -typedef struct { - uint64_t initCost; - uint64_t createTaskCost; - uint64_t createTaskCount; - uint64_t pushCost; - uint64_t pushCount; - uint64_t popCost; - uint64_t popCount; - uint64_t pollCost; - uint64_t getTaskCost; - uint64_t getTaskCount; - uint64_t freeCost; - uint64_t freeCount; - uint64_t businessCost; -}NOISE; +struct _TD_NOISE; +typedef struct _TD_NOISE NOISE; + +struct _TD_NOISE { + uint64_t initCost; + uint64_t createTaskCost; + uint64_t createTaskCount; + uint64_t pushCost; + uint64_t pushCount; + uint64_t popCost; + uint64_t popCount; + uint64_t pollCost; + uint64_t getTaskCost; + uint64_t getTaskCount; + uint64_t freeCost; + uint64_t freeCount; + uint64_t businessCost; +}; uint64_t read_tsc(); diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.c b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.c index 8cb28941e5ac..7e641ddd7778 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.c +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.c @@ -11,21 +11,44 @@ #include -typedef struct { - uint64_t initCost; - uint64_t createTaskCost; - uint64_t createTaskCount; - uint64_t pushCost; - uint64_t pushCount; - uint64_t popCost; - uint64_t popCount; - uint64_t pollCost; - uint64_t getTaskCost; - uint64_t getTaskCount; - uint64_t freeCost; - uint64_t freeCount; - uint64_t businessCost; -}NOISE; +struct PollResult_struct_Void; +struct __Trait_Future_Vtable_struct_Void; +struct __Trait_Future_struct_Void; +struct _TD_NOISE; +struct Queue_void_P; +struct Void; +struct Task; +struct ThreadContext; +struct Scheduler; +struct _Yield; +typedef struct _TD_NOISE NOISE; + +enum State { + READY, + PARKED, + RUNNING, + COMPLETED +}; + +struct _Yield { + int __future_state; +}; + +struct _TD_NOISE { + uint64_t initCost; + uint64_t createTaskCost; + uint64_t createTaskCount; + uint64_t pushCost; + uint64_t pushCount; + uint64_t popCost; + uint64_t popCount; + uint64_t pollCost; + uint64_t getTaskCost; + uint64_t getTaskCount; + uint64_t freeCost; + uint64_t freeCount; + uint64_t businessCost; +}; struct Void {}; @@ -34,11 +57,22 @@ struct __Trait_Future_struct_Void { struct __Trait_Future_Vtable_struct_Void *vtable; }; -enum State { - READY, - PARKED, - RUNNING, - COMPLETED +struct __Trait_Future_Vtable_struct_Void { + struct PollResult_struct_Void (*poll)(void *); + void (*free)(void *); +}; + +struct Scheduler { + _Atomic(int) running_threads; + _Bool isInit; + struct Queue_void_P *globalQueue; + unsigned int threadCount; + struct ThreadContext **threads; +}; + +struct PollResult_struct_Void { + _Bool isPending; + struct Void res; }; struct Task { @@ -62,28 +96,6 @@ struct ThreadContext { void *runningTask; }; -struct Scheduler { - _Atomic(int) running_threads; - _Bool isInit; - struct Queue_void_P *globalQueue; - unsigned int threadCount; - struct ThreadContext **threads; -}; - -struct _Yield { - int __future_state; -}; - -struct PollResult_struct_Void { - _Bool isPending; - struct Void res; -}; - -struct __Trait_Future_Vtable_struct_Void { - struct PollResult_struct_Void (*poll)(void *); - void (*free)(void *); -}; - static struct PollResult_struct_Void struct_PollResult_struct_Void_pending(void); static struct PollResult_struct_Void struct_PollResult_struct_Void_completed(struct Void result); @@ -362,7 +374,12 @@ void struct_Scheduler_deinit(void) { void struct_Scheduler_destroy(void) { unsigned int i; - S.isInit = 0; + ((void)sizeof ((!S.isInit) ? 1 : 0) , __extension__ ({ + if (!S.isInit) + ; + else + __assert_fail("!S.isInit", "clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo/scheduler.cbs", 258, __extension__ __PRETTY_FUNCTION__); + })); while (S.running_threads > 0) { } diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.h b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.h index 9258a2e0339d..ba576e2f9409 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.h +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/scheduler.h @@ -7,23 +7,15 @@ #include -typedef struct { - uint64_t initCost; - uint64_t createTaskCost; - uint64_t createTaskCount; - uint64_t pushCost; - uint64_t pushCount; - uint64_t popCost; - uint64_t popCount; - uint64_t pollCost; - uint64_t getTaskCost; - uint64_t getTaskCount; - uint64_t freeCost; - uint64_t freeCount; - uint64_t businessCost; -}NOISE; - -struct Void {}; +struct __Trait_Future_Vtable_struct_Void; +struct __Trait_Future_struct_Void; +struct _TD_NOISE; +struct Queue_void_P; +struct Void; +struct Task; +struct ThreadContext; +struct Scheduler; +typedef struct _TD_NOISE NOISE; enum State { READY, @@ -32,11 +24,37 @@ enum State { COMPLETED }; +struct _TD_NOISE { + uint64_t initCost; + uint64_t createTaskCost; + uint64_t createTaskCount; + uint64_t pushCost; + uint64_t pushCount; + uint64_t popCost; + uint64_t popCount; + uint64_t pollCost; + uint64_t getTaskCost; + uint64_t getTaskCount; + uint64_t freeCost; + uint64_t freeCount; + uint64_t businessCost; +}; + +struct Void {}; + struct __Trait_Future_struct_Void { void *data; struct __Trait_Future_Vtable_struct_Void *vtable; }; +struct Scheduler { + _Atomic(int) running_threads; + _Bool isInit; + struct Queue_void_P *globalQueue; + unsigned int threadCount; + struct ThreadContext **threads; +}; + struct Task { struct __Trait_Future_struct_Void future; atomic_int state; @@ -58,16 +76,6 @@ struct ThreadContext { void *runningTask; }; -struct Scheduler { - _Atomic(int) running_threads; - _Bool isInit; - struct Queue_void_P *globalQueue; - unsigned int threadCount; - struct ThreadContext **threads; -}; - -struct __Trait_Future_Vtable_struct_Void; - uint64_t read_tsc(); void NOISE_init(NOISE *this); diff --git a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/tcp_demo.c b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/tcp_demo.c index 859b041f4b68..081696c6ca10 100644 --- a/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/tcp_demo.c +++ b/clang/test/BSC/Positive/Coroutine/BenchMark/tcp_demo_rewrite/tcp_demo.c @@ -14,32 +14,24 @@ #include #include -#define COL 50 #define ROW 50 #define BUFFER_SIZE 1024 +#define COL 50 -typedef struct { - uint64_t initCost; - uint64_t createTaskCost; - uint64_t createTaskCount; - uint64_t pushCost; - uint64_t pushCount; - uint64_t popCost; - uint64_t popCount; - uint64_t pollCost; - uint64_t getTaskCost; - uint64_t getTaskCount; - uint64_t freeCost; - uint64_t freeCount; - uint64_t businessCost; -}NOISE; - -struct Void {}; - -struct __Trait_Future_struct_Void { - void *data; - struct __Trait_Future_Vtable_struct_Void *vtable; -}; +struct PollResult_struct_Void; +struct __Trait_Future_Vtable_struct_Void; +struct __Trait_Future_struct_Void; +struct _TD_NOISE; +struct Queue_void_P; +struct Void; +struct Task; +struct ThreadContext; +struct Scheduler; +struct FileWriter; +struct _FuturecreateMatrix; +struct _FuturemultiMatrix; +struct _FuturematrixCalculation; +typedef struct _TD_NOISE NOISE; enum State { READY, @@ -48,25 +40,34 @@ enum State { COMPLETED }; -struct Task { - struct __Trait_Future_struct_Void future; - atomic_int state; +typedef struct FileWriter FileWriter; + +struct _TD_NOISE { + uint64_t initCost; + uint64_t createTaskCost; + uint64_t createTaskCount; + uint64_t pushCost; + uint64_t pushCount; + uint64_t popCost; + uint64_t popCount; + uint64_t pollCost; + uint64_t getTaskCost; + uint64_t getTaskCount; + uint64_t freeCost; + uint64_t freeCount; + uint64_t businessCost; }; -struct Queue_void_P { - unsigned int writeIndex; - unsigned int readIndex; - atomic_uint count; - unsigned int capacity; - void **buf; - pthread_mutex_t mutex; +struct Void {}; + +struct __Trait_Future_struct_Void { + void *data; + struct __Trait_Future_Vtable_struct_Void *vtable; }; -struct ThreadContext { - unsigned int id; - pthread_t pid; - struct Queue_void_P localQueue; - void *runningTask; +struct __Trait_Future_Vtable_struct_Void { + struct PollResult_struct_Void (*poll)(void *); + void (*free)(void *); }; struct Scheduler { @@ -83,18 +84,6 @@ struct FileWriter { _Bool isWrited; }; -typedef struct FileWriter FileWriter; - -struct PollResult_struct_Void { - _Bool isPending; - struct Void res; -}; - -struct __Trait_Future_Vtable_struct_Void { - struct PollResult_struct_Void (*poll)(void *); - void (*free)(void *); -}; - struct _FuturecreateMatrix { int (*matrix)[50]; int i; @@ -114,6 +103,16 @@ struct _FuturemultiMatrix { int __future_state; }; +struct PollResult_struct_Void { + _Bool isPending; + struct Void res; +}; + +struct Task { + struct __Trait_Future_struct_Void future; + atomic_int state; +}; + struct _FuturematrixCalculation { char str[52]; int matrix1[50][50]; @@ -131,6 +130,22 @@ struct _FuturematrixCalculation { int __future_state; }; +struct Queue_void_P { + unsigned int writeIndex; + unsigned int readIndex; + atomic_uint count; + unsigned int capacity; + void **buf; + pthread_mutex_t mutex; +}; + +struct ThreadContext { + unsigned int id; + pthread_t pid; + struct Queue_void_P localQueue; + void *runningTask; +}; + static struct PollResult_struct_Void struct_PollResult_struct_Void_pending(void); static _Bool struct_PollResult_struct_Void_is_completed(struct PollResult_struct_Void *this, struct Void *out); -- Gitee