source: libcfa/src/concurrency/io/types.hfa@ c402739f

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum stuck-waitfor-destruct
Last change on this file since c402739f was c402739f, checked in by Thierry Delisle <tdelisle@…>, 6 years ago

I/O operations now use futures.
io calls implementation are now generated at configure time.

  • Property mode set to 100644
File size: 3.6 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2020 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// io/types.hfa --
8//
9// Author : Thierry Delisle
10// Created On : Fri Jul 31 16:22:47 2020
11// Last Modified By :
12// Last Modified On :
13// Update Count :
14//
15
16#pragma once
17
18#if defined(CFA_HAVE_LINUX_IO_URING_H)
19 extern "C" {
20 #include <linux/types.h>
21 }
22
23 #include "bits/locks.hfa"
24
25 #define LEADER_LOCK
26 struct __leaderlock_t {
27 struct $thread * volatile value; // ($thread) next_leader | (bool:1) is_locked
28 };
29
30 static inline void ?{}( __leaderlock_t & this ) { this.value = 0p; }
31
32 //-----------------------------------------------------------------------
33 // Ring Data structure
34 struct __submition_data {
35 // Head and tail of the ring (associated with array)
36 volatile __u32 * head;
37 volatile __u32 * tail;
38 volatile __u32 prev_head;
39
40 // The actual kernel ring which uses head/tail
41 // indexes into the sqes arrays
42 __u32 * array;
43
44 // number of entries and mask to go with it
45 const __u32 * num;
46 const __u32 * mask;
47
48 // Submission flags (Not sure what for)
49 __u32 * flags;
50
51 // number of sqes not submitted (whatever that means)
52 __u32 * dropped;
53
54 // Like head/tail but not seen by the kernel
55 volatile __u32 * ready;
56 __u32 ready_cnt;
57 __u32 prev_ready;
58
59 #if defined(LEADER_LOCK)
60 __leaderlock_t submit_lock;
61 #else
62 __spinlock_t submit_lock;
63 #endif
64 __spinlock_t release_lock;
65
66 // A buffer of sqes (not the actual ring)
67 struct io_uring_sqe * sqes;
68
69 // The location and size of the mmaped area
70 void * ring_ptr;
71 size_t ring_sz;
72 };
73
74 struct __completion_data {
75 // Head and tail of the ring
76 volatile __u32 * head;
77 volatile __u32 * tail;
78
79 // number of entries and mask to go with it
80 const __u32 * mask;
81 const __u32 * num;
82
83 // number of cqes not submitted (whatever that means)
84 __u32 * overflow;
85
86 // the kernel ring
87 struct io_uring_cqe * cqes;
88
89 // The location and size of the mmaped area
90 void * ring_ptr;
91 size_t ring_sz;
92 };
93
94 struct __io_data {
95 struct __submition_data submit_q;
96 struct __completion_data completion_q;
97 __u32 ring_flags;
98 int fd;
99 bool eager_submits:1;
100 bool poller_submits:1;
101 };
102
103
104 //-----------------------------------------------------------------------
105 // IO user data
106 struct io_future_t {
107 future_t self;
108 __s32 result;
109 };
110
111 static inline {
112 bool fulfil( io_future_t & this, __s32 result ) {
113 this.result = result;
114 return fulfil(this.self);
115 }
116
117 // Wait for the future to be fulfilled
118 bool wait( io_future_t & this ) {
119 return wait(this.self);
120 }
121 }
122
123 //-----------------------------------------------------------------------
124 // Misc
125 // Weirdly, some systems that do support io_uring don't actually define these
126 #ifdef __alpha__
127 /*
128 * alpha is the only exception, all other architectures
129 * have common numbers for new system calls.
130 */
131 #ifndef __NR_io_uring_setup
132 #define __NR_io_uring_setup 535
133 #endif
134 #ifndef __NR_io_uring_enter
135 #define __NR_io_uring_enter 536
136 #endif
137 #ifndef __NR_io_uring_register
138 #define __NR_io_uring_register 537
139 #endif
140 #else /* !__alpha__ */
141 #ifndef __NR_io_uring_setup
142 #define __NR_io_uring_setup 425
143 #endif
144 #ifndef __NR_io_uring_enter
145 #define __NR_io_uring_enter 426
146 #endif
147 #ifndef __NR_io_uring_register
148 #define __NR_io_uring_register 427
149 #endif
150 #endif
151
152 struct epoll_event;
153 struct $io_ctx_thread;
154 void __ioctx_register($io_ctx_thread & ctx, struct epoll_event & ev);
155 void __ioctx_prepare_block($io_ctx_thread & ctx, struct epoll_event & ev);
156#endif
Note: See TracBrowser for help on using the repository browser.