1 // RUN: %libomp-compile && env OMP_NUM_THREADS='3' %libomp-run
2 // RUN: %libomp-compile && env OMP_NUM_THREADS='1' %libomp-run
6 #include "omp_my_sleep.h"
9 #define PTASK_FLAG_DETACHABLE 0x41
11 // OpenMP RTL interfaces
12 typedef unsigned long long kmp_uint64
;
13 typedef long long kmp_int64
;
23 // Compiler-generated code (emulation)
24 typedef struct ident
{
25 void* dummy
; // not used in the library
28 typedef enum kmp_event_type_t
{
29 KMP_EVENT_UNINITIALIZED
= 0,
30 KMP_EVENT_ALLOW_COMPLETION
= 1
34 kmp_event_type_t type
;
40 typedef struct shar
{ // shareds used in the task
45 int(*routine
)(int,struct task
*);
47 // void *destructor_thunk; // optional, needs flag setting if provided
48 // int priority; // optional, needs flag setting if provided
49 // ------------------------------
50 // privates used in the task:
51 omp_event_handle_t evt
;
54 typedef int(* task_entry_t
)( int, ptask
);
59 extern int __kmpc_global_thread_num(void *id_ref
);
60 extern int** __kmpc_omp_task_alloc(id
*loc
, int gtid
, int flags
,
61 size_t sz
, size_t shar
, task_entry_t rtn
);
62 extern int __kmpc_omp_task(id
*loc
, int gtid
, kmp_task_t
*task
);
63 extern omp_event_handle_t
__kmpc_task_allow_completion_event(
64 ident_t
*loc_ref
, int gtid
, kmp_task_t
*task
);
71 // User's code, outlined into task entry
72 int task_entry(int gtid
, ptask task
) {
79 int i
, j
, gtid
= __kmpc_global_thread_num(NULL
);
80 int nt
= omp_get_max_threads();
85 #pragma omp parallel //num_threads(N)
89 int gtid
= __kmpc_global_thread_num(NULL
);
90 omp_event_handle_t evt
;
92 #pragma omp task detach(evt)
95 task
= (ptask
)__kmpc_omp_task_alloc(NULL
,gtid
,PTASK_FLAG_DETACHABLE
,
96 sizeof(struct task
),sizeof(struct shar
),&task_entry
);
98 evt
= (omp_event_handle_t
)__kmpc_task_allow_completion_event(NULL
,gtid
,task
);
100 __kmpc_omp_task(NULL
, gtid
, task
);
101 omp_fulfill_event(evt
);
104 // printf("after tw %d\n", omp_get_thread_num());