1 | // |
---|
2 | // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo |
---|
3 | // |
---|
4 | // The contents of this file are covered under the licence agreement in the |
---|
5 | // file "LICENCE" distributed with Cforall. |
---|
6 | // |
---|
7 | // clib/cfathread.h -- |
---|
8 | // |
---|
9 | // Author : Thierry Delisle |
---|
10 | // Created On : Tue Sep 22 15:31:20 2020 |
---|
11 | // Last Modified By : Peter A. Buhr |
---|
12 | // Last Modified On : Mon Mar 13 23:48:40 2023 |
---|
13 | // Update Count : 7 |
---|
14 | // |
---|
15 | |
---|
16 | #pragma once |
---|
17 | |
---|
18 | #if defined(__cforall) || defined(__cplusplus) |
---|
19 | #include <unistd.h> |
---|
20 | #include <errno.h> |
---|
21 | #include <sys/socket.h> |
---|
22 | |
---|
23 | extern "C" { |
---|
24 | #endif |
---|
25 | //-------------------- |
---|
26 | // Basic types |
---|
27 | |
---|
28 | typedef struct cluster * cfathread_cluster_t; |
---|
29 | |
---|
30 | int cfathread_cluster_create(cfathread_cluster_t * cluster); |
---|
31 | cfathread_cluster_t cfathread_cluster_self(void); |
---|
32 | int cfathread_cluster_print_stats(cfathread_cluster_t cluster); |
---|
33 | int cfathread_cluster_add_worker(cfathread_cluster_t cluster, pthread_t* tid, void (*init_routine) (void *), void * arg); |
---|
34 | int cfathread_cluster_pause (cfathread_cluster_t cluster); |
---|
35 | int cfathread_cluster_resume(cfathread_cluster_t cluster); |
---|
36 | |
---|
37 | //-------------------- |
---|
38 | // thread attribute |
---|
39 | typedef struct cfathread_attr { |
---|
40 | cfathread_cluster_t cl; |
---|
41 | } cfathread_attr_t; |
---|
42 | |
---|
43 | int cfathread_attr_init(cfathread_attr_t * attr) __attribute__((nonnull (1))); |
---|
44 | static inline int cfathread_attr_destroy(cfathread_attr_t * attr) __attribute__((nonnull (1))); |
---|
45 | static inline int cfathread_attr_destroy(cfathread_attr_t * attr) { return 0; } |
---|
46 | static inline int cfathread_attr_setbackground(cfathread_attr_t * attr, int background) __attribute__((nonnull (1))); |
---|
47 | static inline int cfathread_attr_setbackground(cfathread_attr_t * attr, int background) { return 0; } |
---|
48 | static inline int cfathread_attr_setcluster(cfathread_attr_t * attr, cfathread_cluster_t cl) __attribute__((nonnull (1))); |
---|
49 | static inline int cfathread_attr_setcluster(cfathread_attr_t * attr, cfathread_cluster_t cl) { attr->cl = cl; return 0; } |
---|
50 | |
---|
51 | //-------------------- |
---|
52 | // thread type |
---|
53 | struct cfathread_object; |
---|
54 | typedef struct cfathread_object * cfathread_t; |
---|
55 | |
---|
56 | int cfathread_create( cfathread_t * h, const cfathread_attr_t * a, void *(*main)( void * ), void * arg ) __attribute__((nonnull (1))); |
---|
57 | int cfathread_join( cfathread_t, void ** retval ); |
---|
58 | |
---|
59 | int cfathread_get_errno(void); |
---|
60 | cfathread_t cfathread_self(void); |
---|
61 | |
---|
62 | int cfathread_usleep(useconds_t usecs); |
---|
63 | int cfathread_sleep(unsigned int secs); |
---|
64 | |
---|
65 | void cfathread_park( void ); |
---|
66 | void cfathread_unpark( cfathread_t ); |
---|
67 | void cfathread_yield( void ); |
---|
68 | |
---|
69 | //-------------------- |
---|
70 | // mutex and condition |
---|
71 | struct timespec; |
---|
72 | |
---|
73 | typedef struct cfathread_mutex_attr { |
---|
74 | } cfathread_mutexattr_t; |
---|
75 | typedef struct cfathread_mutex * cfathread_mutex_t; |
---|
76 | int cfathread_mutex_init(cfathread_mutex_t * restrict mut, const cfathread_mutexattr_t * restrict attr) __attribute__((nonnull (1))); |
---|
77 | int cfathread_mutex_destroy(cfathread_mutex_t *mut) __attribute__((nonnull (1))); |
---|
78 | int cfathread_mutex_lock(cfathread_mutex_t *mut) __attribute__((nonnull (1))); |
---|
79 | int cfathread_mutex_trylock(cfathread_mutex_t *mut) __attribute__((nonnull (1))); |
---|
80 | int cfathread_mutex_unlock(cfathread_mutex_t *mut) __attribute__((nonnull (1))); |
---|
81 | |
---|
82 | typedef struct cfathread_cond_attr { |
---|
83 | // WARNING: adding support for pthread_condattr_setclock would require keeping track of the clock |
---|
84 | // and reading it in cond_timedwait |
---|
85 | } cfathread_condattr_t; |
---|
86 | typedef struct cfathread_condition * cfathread_cond_t; |
---|
87 | int cfathread_cond_init(cfathread_cond_t *restrict cond, const cfathread_condattr_t *restrict attr) __attribute__((nonnull (1))); |
---|
88 | int cfathread_cond_wait(cfathread_cond_t *restrict cond, cfathread_mutex_t *restrict mut) __attribute__((nonnull (1,2))); |
---|
89 | int cfathread_cond_timedwait(cfathread_cond_t *restrict cond, cfathread_mutex_t *restrict mut, const struct timespec *restrict abstime) __attribute__((nonnull (1,2,3))); |
---|
90 | int cfathread_cond_signal(cfathread_cond_t *cond) __attribute__((nonnull (1))); |
---|
91 | |
---|
92 | //-------------------- |
---|
93 | // IO operations |
---|
94 | int cfathread_socket(int domain, int type, int protocol); |
---|
95 | int cfathread_bind(int socket, __CONST_SOCKADDR_ARG address, socklen_t address_len); |
---|
96 | int cfathread_listen(int socket, int backlog); |
---|
97 | int cfathread_accept(int socket, __SOCKADDR_ARG address, socklen_t * restrict address_len); |
---|
98 | int cfathread_connect(int socket, __CONST_SOCKADDR_ARG address, socklen_t address_len); |
---|
99 | int cfathread_dup(int fildes); |
---|
100 | int cfathread_close(int fildes); |
---|
101 | ssize_t cfathread_sendmsg(int socket, const struct msghdr *message, int flags); |
---|
102 | ssize_t cfathread_write(int fildes, const void *buf, size_t nbyte); |
---|
103 | ssize_t cfathread_recvfrom(int socket, void *restrict buffer, size_t length, int flags, struct sockaddr *restrict address, socklen_t *restrict address_len); |
---|
104 | ssize_t cfathread_read(int fildes, void *buf, size_t nbyte); |
---|
105 | |
---|
106 | #if defined(__cforall) || defined(__cplusplus) |
---|
107 | } |
---|
108 | #endif |
---|