File: mtest_thread_qthreads.h

package info (click to toggle)
mpich 5.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 251,828 kB
  • sloc: ansic: 1,323,147; cpp: 82,869; f90: 72,420; javascript: 40,763; perl: 28,296; sh: 19,399; python: 16,191; xml: 14,418; makefile: 9,468; fortran: 8,046; java: 4,635; pascal: 352; asm: 324; ruby: 176; awk: 27; lisp: 19; php: 8; sed: 4
file content (122 lines) | stat: -rw-r--r-- 2,588 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
 * Copyright (C) by Argonne National Laboratory
 *     See COPYRIGHT in top-level directory
 */

/************************************************/
/* Inline file to be included in mtest_thread.c */
/************************************************/

/* Error handling */

#include <qthread/barrier.h>

typedef long unsigned int (*Qthreads_thread_func_t) (void *data);

static void MTest_qthreads_error(int err, const char *msg, const char *file, int line)
{
    if (err == QTHREAD_SUCCESS)
        return;
    fprintf(stderr, "%s (%d) (%s:%d)\n", msg, err, file, line);
    exit(EXIT_FAILURE);
}

#define MTEST_QTHR_ERROR(e,m) MTest_qthreads_error(e,m,__FILE__,__LINE__)

/* -------------------------------------------- */

int MTest_Start_thread(MTEST_THREAD_RETURN_TYPE(*fn) (void *p), void *arg)
{
    if (nthreads >= MTEST_MAX_THREADS) {
        fprintf(stderr, "Too many threads already created: max is %d\n", MTEST_MAX_THREADS);
        return 1;
    }

    Qthreads_thread_func_t f = (Qthreads_thread_func_t) fn;
    int ret = qthread_fork(f, arg, &threads[nthreads]);
    MTEST_QTHR_ERROR(ret, "qthread_fork");
    nthreads++;

    return 0;
}

int MTest_Join_threads(void)
{
    int i, ret, err = 0;
    for (i = 0; i < nthreads; i++) {
        ret = qthread_readFE(&threads[i], NULL);
        MTEST_QTHR_ERROR(ret, "qthread_readFE");
    }
    
    nthreads = 0;
    return 0;
}

int MTest_thread_lock_create(MTEST_THREAD_LOCK_TYPE * lock)
{
    return 0;
}

int MTest_thread_lock_free(MTEST_THREAD_LOCK_TYPE * lock)
{
    return 0;
}

int MTest_thread_lock(MTEST_THREAD_LOCK_TYPE * lock)
{
    int ret;
    ret  =  qthread_lock(lock);
    MTEST_QTHR_ERROR(ret, "qthread_lock");
    return 0;
}

int MTest_thread_unlock(MTEST_THREAD_LOCK_TYPE * lock)
{
    int ret;
    ret  =  qthread_unlock(lock);
    MTEST_QTHR_ERROR(ret, "qthread_unlock");
    return 0;
}

int MTest_thread_yield(void)
{
    qthread_yield();
    return 0;
}

/* -------------------------------------------- */
#define HAVE_MTEST_THREAD_BARRIER 1

qt_barrier_t * qt_barrier;

int MTest_thread_barrier_init(void)
{
    qt_barrier = qt_barrier_create(nthreads, REGION_BARRIER);
    return 0;
}

int MTest_thread_barrier_free(void)
{
    qt_barrier_destroy(qt_barrier);
    return 0;
}

int MTest_thread_barrier(int nt)
{
    qt_barrier_enter(qt_barrier);
    return 0;
}

#define HAVE_MTEST_INIT_THREAD_PKG

void MTest_init_thread_pkg(void)
{
    int ret;
    ret = qthread_initialize();
    MTEST_QTHR_ERROR(ret, "qthread_initialize");
}

void MTest_finalize_thread_pkg(void)
{
    qthread_finalize();
}