LLVM OpenMP 22.0.0git
bug_taskwait_detach.cpp
Go to the documentation of this file.
1// RUN: %libomp-cxx-compile-and-run
2
3#include <omp.h>
4
5#include <chrono>
6#include <cstdint>
7#include <iostream>
8#include <thread>
9
10// detached
11#define PTASK_FLAG_DETACHABLE 0x40
12
13// OpenMP RTL interfaces
14using kmp_int32 = int32_t;
15
16typedef struct ID {
17 int reserved_1;
18 int flags;
19 int reserved_2;
20 int reserved_3;
21 char *psource;
23
24// Compiler-generated code (emulation)
25typedef struct ident {
26 void *dummy; // not used in the library
28
33
34typedef struct {
36 union {
37 void *task;
38 } ed;
40
41typedef struct shar { // shareds used in the task
43
44typedef struct task {
46 int (*routine)(int, struct task *);
47 int part_id;
48 // void *destructor_thunk; // optional, needs flag setting if provided
49 // int priority; // optional, needs flag setting if provided
50 // ------------------------------
51 // privates used in the task:
52 omp_event_handle_t evt;
54
56
57#ifdef __cplusplus
58extern "C" {
59#endif
60extern int __kmpc_global_thread_num(void *id_ref);
61extern int **__kmpc_omp_task_alloc(id *loc, int gtid, int flags, size_t sz,
62 size_t shar, task_entry_t rtn);
63extern kmp_int32 __kmpc_omp_task(ident_t *loc_ref, kmp_int32 gtid,
64 kmp_task_t *new_task);
65extern omp_event_handle_t __kmpc_task_allow_completion_event(ident_t *loc_ref,
66 int gtid,
68#ifdef __cplusplus
69}
70#endif
71
72int volatile checker;
73
75 std::this_thread::sleep_for(std::chrono::seconds(3));
76 checker = 1;
77 omp_fulfill_event(task->evt);
78}
79
80// User's code
81int task_entry(int gtid, ptask task) {
82 std::thread t(target, task);
83 t.detach();
84 return 0;
85}
86
87int main(int argc, char *argv[]) {
88 int gtid = __kmpc_global_thread_num(nullptr);
89 checker = 0;
90
91 /*
92 #pragma omp task detach(evt)
93 {}
94 */
95 std::cout << "detaching...\n";
97 nullptr, gtid, PTASK_FLAG_DETACHABLE, sizeof(struct task),
98 sizeof(struct shar), &task_entry);
99 omp_event_handle_t evt =
100 (omp_event_handle_t)__kmpc_task_allow_completion_event(nullptr, gtid,
101 task);
102 task->evt = evt;
103
104 __kmpc_omp_task(nullptr, gtid, task);
105
106#pragma omp taskwait
107
108 // check results
109 if (checker == 1) {
110 std::cout << "PASS\n";
111 return 0;
112 }
113
114 return 1;
115}
116
117// CHECK: PASS
void * target(void *task)
int task_entry(kmp_int32 gtid, kmp_task_t *task)
struct shar * pshareds
int __kmpc_global_thread_num(void *id_ref)
kmp_int32 __kmpc_omp_task(ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *new_task)
struct task * ptask
int task_entry(int gtid, ptask task)
int ** __kmpc_omp_task_alloc(id *loc, int gtid, int flags, size_t sz, size_t shar, task_entry_t rtn)
void target(ptask task)
int(* task_entry_t)(int, ptask)
omp_event_handle_t __kmpc_task_allow_completion_event(ident_t *loc_ref, int gtid, kmp_task_t *task)
#define PTASK_FLAG_DETACHABLE
struct kmp_task kmp_task_t
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d int
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type type
kmp_event_type_t
Definition kmp.h:2617
@ KMP_EVENT_UNINITIALIZED
Definition kmp.h:2618
@ KMP_EVENT_ALLOW_COMPLETION
Definition kmp.h:2619
int32_t kmp_int32
static id loc
static int checker
char * psource
The ident structure that describes a source location.
Definition kmp.h:227
kmp_task_t * task
Definition kmp.h:2626
int(* routine)(int, struct task *)
omp_event_handle_t evt
void ** shareds
int main()
Definition test-touch.c:21