Changeset 75d874a
- Timestamp:
- Mar 24, 2023, 4:51:11 PM (13 months ago)
- Branches:
- ADT, ast-experimental, master
- Children:
- 512d937c
- Parents:
- 0e16a2d (diff), 1633e04 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 1 deleted
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/theses/mike_brooks_MMath/list.tex
r0e16a2d r75d874a 13 13 14 14 15 16 15 \section{Design Issues} 17 16 \label{toc:lst:issue} … … 20 19 21 20 All design-issue discussions assume the following invariants. 22 They are stated here to clarify that none of the discussed design issues refers to one of these. 21 \PAB{They are stated here to clarify that none of the discussed design issues refers to one of these.} 23 22 Alternatives to the assumptions are discussed under Future Work (Section~\ref{toc:lst:futwork}). 24 23 \begin{itemize} … … 30 29 The system has freedom over how to represent these links. 31 30 The library is not providing applied wrapper operations that consume a user's hand-implemented list primitives. 32 \item These issues are compared at a requirement/functional level.31 \item \PAB{These issues are compared at a requirement/functional level.} 33 32 \end{itemize} 34 33 35 34 Two preexisting linked-list libraries are used throughout, to show examples of the concepts being defined, 36 35 and further libraries are introduced as needed. 37 A general comparison of libraries' abilities is given under Related Work (Section~\ref{toc:lst:relwork}).38 36 \begin{description} 39 37 \item[LQ] Linux Queue library\cite{lst:linuxq} of @<sys/queue.h>@. 40 38 \item[STL] C++ Standard Template Library's @std::list@\cite{lst:stl} 41 39 \end{description} 40 A general comparison of libraries' abilities is given under Related Work (Section~\ref{toc:lst:relwork}). 42 41 43 42 The fictional type @req@ (request) is the user's payload in examples. … … 58 57 59 58 The wrapped style admits the further distinction between wrapping a reference and wrapping a value. 60 This distinction is pervasive in all STL collections; @list<req *>@ wraps a reference; @list<req>@ wraps a value.61 (For this discussion, @list<req &>@ is similar to @list<req*>@.)59 This distinction is pervasive in all STL collections; @list<req *>@ wraps a reference; @list<req>@ wraps a value. 60 (For this discussion, @list<req &>@ is similar to @list<req *>@.) 62 61 This difference is one of user style, not framework capability. 63 62 Figure~\ref{fig:lst-issues-attach} compares the three styles. 63 64 \begin{comment} 64 65 \begin{figure} 65 66 \begin{tabularx}{\textwidth}{Y|Y|Y}\lstinputlisting[language=C , firstline=20, lastline=39]{lst-issues-intrusive.run.c} … … 77 78 (a) & (b) & (c) 78 79 \end{tabularx} 79 80 \caption{ 80 81 Three styles of link attachment: (a)~intrusive, (b)~wrapped reference, and (c)~wrapped value. 81 82 The diagrams show the memory layouts that result after the code runs, eliding the head object \lstinline{reqs}; … … 87 88 (TODO: cite? found in /usr/include/c++/7/bits/stl\_list.h ) 88 89 } 90 \label{fig:lst-issues-attach} 91 \end{figure} 92 \end{comment} 93 94 \begin{figure} 95 \centering 96 \newsavebox{\myboxA} % used with subfigure 97 \newsavebox{\myboxB} 98 \newsavebox{\myboxC} 99 100 \begin{lrbox}{\myboxA} 101 \begin{tabular}{@{}l@{}} 102 \lstinputlisting[language=C, firstline=20, lastline=39]{lst-issues-intrusive.run.c} \\ 103 \ \\ 104 \includegraphics[page=1]{lst-issues-attach.pdf} 105 \end{tabular} 106 \end{lrbox} 107 108 \begin{lrbox}{\myboxB} 109 \begin{tabular}{@{}l@{}} 110 \lstinputlisting[language=C++, firstline=20, lastline=39]{lst-issues-wrapped-byref.run.cpp} \\ 111 \ \\ 112 \includegraphics[page=2]{lst-issues-attach.pdf} 113 \end{tabular} 114 \end{lrbox} 115 116 \begin{lrbox}{\myboxC} 117 \begin{tabular}{@{}l@{}} 118 \lstinputlisting[language=C++, firstline=20, lastline=39]{lst-issues-wrapped-emplaced.run.cpp} \\ 119 \ \\ 120 \includegraphics[page=3]{lst-issues-attach.pdf} 121 \end{tabular} 122 \end{lrbox} 123 124 \subfloat[Intrusive]{\label{f:Intrusive}\usebox\myboxA} 125 \hspace{10pt} 126 \vrule 127 \hspace{10pt} 128 \subfloat[Wrapped reference]{\label{f:WrappedRef}\usebox\myboxB} 129 \hspace{10pt} 130 \vrule 131 \hspace{10pt} 132 \subfloat[Wrapped value]{\label{f:WrappedValue}\usebox\myboxC} 133 134 \caption{ 135 Three styles of link attachment: \protect\subref*{f:Intrusive}~intrusive, \protect\subref*{f:WrappedRef}~wrapped 136 reference, and \protect\subref*{f:WrappedValue}~wrapped value. 137 The diagrams show the memory layouts that result after the code runs, eliding the head object \lstinline{reqs}; 138 head objects are discussed in Section~\ref{toc:lst:issue:ident}. 139 In \protect\subref*{f:Intrusive}, the field \lstinline{req.x} names a list direction; 140 these are discussed in Section~\ref{toc:lst:issue:derection}. 141 In \protect\subref*{f:WrappedRef} and \protect\subref*{f:WrappedValue}, the type \lstinline{node} represents a 142 system-internal type, which is \lstinline{std::_List_node} in the GNU implementation. 143 (TODO: cite? found in /usr/include/c++/7/bits/stl\_list.h ) 144 } 89 145 \label{fig:lst-issues-attach} 90 146 \end{figure} 91 92 93 Figure~\ref{fig:lst-issues-attach} compares the three styles.94 147 95 148 The advantage of intrusive attachment is the control that it gives the user over memory layout. … … 97 150 Both wrapped attachment styles imply system-induced heap allocations. 98 151 Such an allocation has a lifetime that matches the item's membership in the list. 99 In (a) and (b), one @req@ object can enter and leave a list many times.100 In (b), doing do implies a dynamic allocation for each time joining; in (a), it does not.152 In \subref*{f:Intrusive} and \subref*{f:WrappedRef}, one @req@ object can enter and leave a list many times. 153 In \subref*{f:WrappedRef}, it implies a dynamic allocation/deallocation for each enter/leave; in \subref*{f:Intrusive}, it does not. 101 154 102 155 A further aspect of layout control is allowing the user to specify the location of the link fields within the @req@ object. … … 110 163 Another subtle advantage of intrusive arrangement is that 111 164 a reference to a user-level item (@req@) is sufficient to navigate or manage the item's membership. 112 In LQ, (a), a @req@ pointer is the right argument type for operations @LIST_NEXT@ or @LIST_REMOVE@;165 In LQ, \subref*{f:Intrusive}, a @req@ pointer is the right argument type for operations @LIST_NEXT@ or @LIST_REMOVE@; 113 166 there is no distinguishing a @req@ from ``a @req@ in a list.'' 114 The same is not true of STL, (b) or (c).167 The same is not true of STL, \subref*{f:WrappedRef} or \subref*{f:WrappedValue}. 115 168 There, the analogous operations work on a parameter of type @list<T>::iterator@; 116 169 they are @iterator::operator++()@, @iterator::operator*()@, and @list::erase(iterator)@. 117 There is no mapping from @req &@ to @list<req>::iterator@, except for linear search.170 There is no mapping from @req &@ to @list<req>::iterator@, except for linear search. 118 171 119 172 The advantage of wrapped attachment is the abstraction of a data item from its list membership(s). 120 173 In the wrapped style, the @req@ type can come from a library that serves many independent uses, 121 174 which generally have no need for listing. 122 Then, a novel use can still put @req@ in a (further) list, without requiring any upstream change in the @re @ library.175 Then, a novel use can still put @req@ in a (further) list, without requiring any upstream change in the @req@ library. 123 176 In intrusive attachment, the ability to be listed must be planned during the definition of @req@. 124 Similarly, style (b) allows for one @req@ to occur at several positions in one list. 125 Styles (a) and (c) do not support this ability. 177 Similarly, style \subref*{f:WrappedRef} allows for one @req@ to occur at several positions in one list. 178 Styles \subref*{f:Intrusive} and \subref*{f:WrappedValue} do not support this ability. 179 \PAB{But style \subref*{f:WrappedValue} can sort of mimic this effect by have multiple copies of \lstinline{req} in the list, modulo changes to the copies are not seen by the original.} 126 180 127 181 \begin{figure} … … 135 189 the LQ C macros do not expand to valid C++ when instantiated with template parameters---there is no \lstinline{struct El}. 136 190 When using a custom-patched version of LQ to work around this issue, 137 the programs of Figure~\ref{f ig:lst-issues-attach}~(b) and (c)work with this shim in place of real STL.191 the programs of Figure~\ref{f:WrappedRef} and \protect\subref*{f:WrappedValue} work with this shim in place of real STL. 138 192 Their executions lead to the same memory layouts. 139 193 } … … 147 201 148 202 So intrusion is a lower-level listing primitive. 149 And so, the system design choice is not between forcing users to use intrusion and forcing them to usewrapping.203 And so, the system design choice is not between forcing users to use intrusion or wrapping. 150 204 The choice is whether or not to provide access to an allocation-free layer of functionality. 151 205 A wrapped-primitive library like STL forces users to incur the costs of wrapping, whether or not they access its benefits. … … 153 207 154 208 155 156 157 209 \subsection{Directionality: Single vs.\ Multi-Static vs.\ Dynamic} 158 210 \label{toc:lst:issue:derection} 159 211 212 \PAB{I'm not sure about the term \newterm{Directionality}. Directionality to me, means going forward or backwards through a list. 213 Would \newterm{dimensionality} work? Think of each list containing the node as a different dimension in which the node sits.} 214 160 215 Directionality deals with the question: 161 216 In how many different lists can an item be stored, at a given time? 162 217 163 164 Consider STL in the wrapped-value arrangement of Figure~\ref{fig:lst-issues-attach}~(c). 218 Consider STL in the wrapped-value arrangement of Figure~\ref{f:WrappedValue}. 165 219 The STL API completely hides its @node@ type from a user; the user cannot configure this choice or impose a custom one. 166 220 STL's @node@ type offers the sole set of links shown in the diagram. 167 Therefore, every @req@ in existence was allocated either to belong to an occurrence of the diagrammed arrangement,221 Therefore, every @req@ in existence is allocated either to belong to an occurrence of the diagrammed arrangement, 168 222 or to be apart from all occurrences of it. 169 223 In the first case, the @req@ belongs to exactly one list (of the style in question). … … 171 225 172 226 \begin{figure} 173 \label{fig:lst-issues-multi-static}174 227 \parbox[t]{3.5in} { 175 228 \lstinputlisting[language=C++, firstline=20, lastline=60]{lst-issues-multi-static.run.c} … … 187 240 The zoomed-in diagram portion shows the field-level state that results from running the LQ code. 188 241 } 242 \label{fig:lst-issues-multi-static} 189 243 \end{figure} 190 244 … … 205 259 The corresponding flexibility of wrapped attachment means 206 260 the STL wrapped-reference arrangement supports an item being a member of arbitrarily many lists. 207 This support also applies to the hybrid in which an item's allocation is within a wrapped-value list,261 This support also applies to the wrapped-value list because the @req@ is copied, 208 262 but wrapped-reference lists provide further link directions. 263 \PAB{Explain how} 209 264 STL with wrapped references supports dynamic link directions. 210 211 When allowing multiple static directions,frameworks differ in their ergonomics for 212 the typical case, when the user needs only one direction, vs.\ the atypical case, when the user needs several. 213 265 \PAB{Expand} 266 267 When allowing multiple static directions, frameworks differ in their ergonomics for 268 the typical case: when the user needs only one direction, vs.\ the atypical case, when the user needs several. 214 269 LQ's ergonomics are well-suited to the uncommon case of multiple list directions. 215 270 Its intrusion declaration and insertion operation both use a mandatory explicit parameter naming the direction. 216 271 This decision works well in Figure~\ref{fig:lst-issues-multi-static}, where the names @by_pri@ and @by_rqr@ work well, 217 but it clutters Figure~\ref{f ig:lst-issues-attach}~(a), where a contrived name must be invented and used.218 The example uses @x@; @reqs@ would be a more readily ignored choice. 272 but it clutters Figure~\ref{f:Intrusive}, where a contrived name must be invented and used. 273 The example uses @x@; @reqs@ would be a more readily ignored choice. \PAB{wording?} 219 274 220 275 \uCpp offers an intrusive list that makes the opposite choice. TODO: elaborate on inheritance for first direction and acrobatics for subsequent directions. 221 276 222 277 223 224 225 278 \subsection{User integration: Preprocessed vs.\ Type-System Mediated} 226 279 227 280 % example of poor error message due to LQ's preprocessed integration 228 % programs/lst-issues-multi-static.run.c:46:1: error: expected identifier or ‘(’ before ‘do’281 % programs/lst-issues-multi-static.run.c:46:1: error: expected identifier or '(' before 'do' 229 282 % 46 | LIST_INSERT_HEAD(&reqs_rtr_42, &r42b, by_rqr); 230 283 % | ^~~~~~~~~~~~~~~~ … … 239 292 an item found in a list (type @req@, of variables like @r1@), and 240 293 a list (type @reql@ or @list<req>@, of variables like @reqs@ or @reqs_rqr_42@). 241 The latter type is a head, and these examples are of are headed lists. 294 \see{Figure~\ref{fig:lst-issues-attach} and Figure~\ref{fig:lst-issues-multi-static}} 295 The latter type is a head, and these examples are of headed lists. 242 296 243 297 A bespoke ``pointer to next @req@'' implementation often omits the latter type. … … 246 300 In headed thinking, there are length-zero lists (heads with no elements), and an element can be listed or not listed. 247 301 In ad-hoc thinking, there are no length-zero lists and every element belongs to a list of length at least one. 302 \PAB{Create a figure for this.} 248 303 249 304 By omitting the head, elements can enter into an adjacency relationship, … … 283 338 identifies a list using an explicit head. 284 339 285 286 \begin{figure} 287 \label{fig:lst-features-intro} 288 \lstinputlisting[language=CFA, firstline=20, lastline=32]{lst-features-intro.run.cfa} 289 \caption[Multiple link directions in \CFA list library]{ 290 Demonstration of the running \lstinline{req} example, done using the \CFA list library\protect\footnotemark. 291 This example does the same job that Figure~\ref{fig:lst-issues-attach} shows three ways. 292 } 293 \end{figure} 294 \footnotetext{ 340 The \CFA list library's version of the running @req@ example is in Figure~\ref{fig:lst-features-intro}. 341 Its link attachment is intrusive and the resulting memory layout is pure-stack, just as for the LQ version of Figure~\ref{f:Intrusive}. 342 The framework-provided type @dlink(...)@ provides the links. 343 The user inserts the links into the @req@ structure by using \CFA inline-inheritance (TODO: reference introduction). 344 Inline inheritance means the type of the field is @dlink(req)@, the field is unnamed, a reference to a @req@ is implicitly convertible to @dlink@.\footnote{ 295 345 The \CFA list examples elide the \lstinline{P9_EMBEDDED} annotations that (TODO: xref P9E future work) proposes to obviate. 296 346 Thus, these examples illustrate a to-be state, free of what is to be historic clutter. 297 347 The elided portions are immaterial to the discussion and the examples work with the annotations provided. 298 The \CFA test suite (TODO:cite?) includes equivalent demonstrations, with the annotations included. 299 }. 300 301 My \CFA list library's version of the running @req@ example is in Figure~\ref{fig:lst-features-intro}. 302 Its link attachment is intrusive and the resulting memory layout is pure-stack, just as for the LQ version of Figure~\ref{fig:lst-issues-attach}-(a). 303 The framework-provided type @dlink(-)@ provides the links. 304 The user puts links into the @req@ structure by inline-inheriting (TODO: reference introduction) this type. 305 Which means: the type of the field is @dlink(req)@; the field is unnamed; a reference to a @req@ is implicitly convertible to @dlink@. 306 As these links have a nontrivial, user-specified location within the @req@ structure, this conversion also encapsulates the implied pointer arithmetic safely. 307 308 \begin{figure} 309 \label{fig:lst-features-multidir} 310 \lstinputlisting[language=CFA, firstline=20, lastline=25]{lst-features-multidir.run.cfa} 348 The \CFA test suite (TODO:cite?) includes equivalent demonstrations, with the annotations included.} 349 These links have a nontrivial, user-specified location within the @req@ structure; 350 this convention encapsulates the implied pointer arithmetic safely. 351 352 \begin{figure} 353 \lstinputlisting[language=CFA, firstline=20, lastline=32]{lst-features-intro.run.cfa} 354 \caption[Multiple link directions in \CFA list library]{ 355 Demonstration of the running \lstinline{req} example, done using the \CFA list library. 356 This example does the same job that Figure~\ref{fig:lst-issues-attach} shows three ways. 357 } 358 \label{fig:lst-features-intro} 359 \end{figure} 360 361 \begin{figure} 362 \centering 363 \begin{tabular}{@{}ll@{}} 364 \begin{tabular}{@{}l@{}} 365 \lstinputlisting[language=CFA, firstline=20, lastline=25]{lst-features-multidir.run.cfa} \\ 311 366 \lstinputlisting[language=CFA, firstline=40, lastline=67]{lst-features-multidir.run.cfa} 312 \caption{ 367 \end{tabular} 368 & 369 \lstinputlisting[language=C++, firstline=20, lastline=60]{lst-issues-multi-static.run.c} 370 \end{tabular} 371 372 \caption{ 313 373 Demonstration of multiple static link directions done in the \CFA list library. 314 374 This example does the same job as Figure~\ref{fig:lst-issues-multi-static}. 315 375 } 316 \end{figure} 317 318 The \CFA library supports multi-static link directionality. Figure~\ref{fig:lst-features-multidir} illustrates how. 376 \label{fig:lst-features-multidir} 377 \end{figure} 378 379 Figure~\ref{fig:lst-features-multidir} shows how the \CFA library supports multi-static link directionality. 319 380 The declaration of @req@ now has two inline-inheriting @dlink@ occurrences. 320 The first of these lines gives a type named @req.by_pri@ ; @req@ inherits from it;it inherits from @dlink@.321 The second line gives a similar @req.by_rqr@.381 The first of these lines gives a type named @req.by_pri@, @req@ inherits from it, and it inherits from @dlink@. 382 The second line @req.by_rqr@ is similar to @req.by_pri@. 322 383 Thus, there is a diamond, non-virtual, inheritance from @req@ to @dlink@, with @by_pri@ and @by_rqr@ being the mid-level types. 323 384 Disambiguation occurs in the declarations of the list-head objects. 324 385 The type of the variable @reqs_pri_global@ is @dlist(req, req.by_pri)@, 325 386 meaning operations called on @reqs_pri_global@ are implicitly disambiguated. 326 In the example, the calls @insert_first(reqs_pri_global, ...)@ imply, ``here, we 're working by priority.''387 In the example, the calls @insert_first(reqs_pri_global, ...)@ imply, ``here, we are working by priority.'' 327 388 328 389 The \CFA library also supports the common case, of single directionality, more naturally than LQ. 329 390 Figure~\ref{fig:lst-features-intro} shows a single-direction list done with no contrived name for the link direction, 330 where Figure~\ref{f ig:lst-issues-attach}-(a)adds the unnecessary name, @x@.391 where Figure~\ref{f:Intrusive} adds the unnecessary name, @x@. 331 392 In \CFA, a user doing a single direction (Figure~\ref{fig:lst-features-intro}) 332 sets up a simple inheritance with @dlink@, and declares a list head to have the simpler type @dlist( -)@.393 sets up a simple inheritance with @dlink@, and declares a list head to have the simpler type @dlist(...)@. 333 394 While a user doing multiple link directions (Figure~\ref{fig:lst-features-multidir}) 334 sets up a diamond inheritance with @dlink@, and declares a list head to have the more-informed type @dlist( -, DIR)@.395 sets up a diamond inheritance with @dlink@, and declares a list head to have the more-informed type @dlist(..., DIR)@. 335 396 336 397 The \CFA library offers a type-system mediated integration with user code. … … 348 409 349 410 350 351 352 353 411 \subsection{Iteration} 354 412 -
doc/theses/mike_brooks_MMath/uw-ethesis.tex
r0e16a2d r75d874a 60 60 % For hyperlinked PDF, suitable for viewing on a computer, use this: 61 61 \documentclass[letterpaper,12pt,titlepage,oneside,final]{book} 62 \usepackage{times} 62 63 \usepackage[T1]{fontenc} % Latin-1 => 256-bit characters, => | not dash, <> not Spanish question marks 63 64 … … 87 88 \usepackage{comment} % Removes large sections of the document. 88 89 \usepackage{tabularx} 89 \usepackage{subfigure} 90 \usepackage[labelformat=simple,aboveskip=0pt,farskip=0pt,font=normalsize]{subfig} 91 \renewcommand\thesubfigure{(\alph{subfigure})} 90 92 91 93 \usepackage{algorithm} 92 94 \usepackage{algpseudocode} 93 94 \usepackage{pbox}95 95 96 96 % Hyperlinks make it very easy to navigate an electronic document. … … 117 117 citecolor=blue, % color of links to bibliography 118 118 filecolor=magenta, % color of file links 119 urlcolor=blue % color of external links 119 urlcolor=blue, % color of external links 120 breaklinks=true 120 121 } 121 122 \ifthenelse{\boolean{PrintVersion}}{ % for improved print quality, change some hyperref options … … 180 181 \CFAStyle % CFA code-style 181 182 \lstset{language=CFA} % default language 182 \lstset{basicstyle=\linespread{0.9}\ tt} % CFA typewriter font183 \lstset{basicstyle=\linespread{0.9}\sf} % CFA typewriter font 183 184 \lstset{inputpath={programs}} 184 185 \newcommand{\PAB}[1]{{\color{red}PAB: #1}} 185 186 186 187 \newcommand{\uCpp}{$\mu${C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}}} 187 \newcommand{\uCpp}{$\mu$\CC} 188 188 189 189 %====================================================================== -
libcfa/src/bits/random.hfa
r0e16a2d r75d874a 10 10 // Created On : Fri Jan 14 07:18:11 2022 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Mar 20 10:01:40202313 // Update Count : 18 012 // Last Modified On : Mon Mar 20 21:45:24 2023 13 // Update Count : 186 14 14 // 15 15 … … 131 131 #ifdef __cforall // don't include in C code (invoke.h) 132 132 133 // Splitmix64134 133 // https://rosettacode.org/wiki/Pseudo-random_numbers/Splitmix64 135 // Splitmix64 is not recommended for demanding random number requirements, 136 // but is often used to calculate initial states for other more complex 137 // pseudo-random number generators. 134 // 135 // Splitmix64 is not recommended for demanding random number requirements, but is often used to calculate initial states 136 // for other more complex pseudo-random number generators (see https://prng.di.unimi.it). 137 // Also https://rosettacode.org/wiki/Pseudo-random_numbers/Splitmix64. 138 138 static inline uint64_t splitmix64( uint64_t & state ) { 139 139 state += 0x9e3779b97f4a7c15; … … 149 149 } // splitmix64_set_seed 150 150 151 // Splitmix32152 151 // https://github.com/bryc/code/blob/master/jshash/PRNGs.md#splitmix32 153 // Splitmix32 is not recommended for demanding random number requirements,154 // but is often used to calculate initial states for other more complex155 // pseudo-random number generators.156 // SplitMix32 is a 32 bit variant of Splitmix64 152 // 153 // Splitmix32 is not recommended for demanding random number requirements, but is often used to calculate initial states 154 // for other more complex pseudo-random number generators (see https://prng.di.unimi.it). 155 157 156 static inline uint32_t splitmix32( uint32_t & state ) { 158 157 state += 0x9e3779b9; … … 169 168 170 169 #ifdef __SIZEOF_INT128__ 171 //-------------------------------------------------- 172 static inline uint64_t lehmer64( __uint128_t & state ) { 173 __uint128_t ret = state; 174 state *= 0x_da94_2042_e4dd_58b5; 175 return ret >> 64; 176 } // lehmer64 177 178 static inline void lehmer64_set_seed( __uint128_t & state, uint64_t seed ) { 179 // The seed needs to be coprime with the 2^64 modulus to get the largest period, so no factors of 2 in the seed. 180 state = seed; 181 lehmer64( state ); // prime 182 } // lehmer64_set_seed 183 184 //-------------------------------------------------- 185 static inline uint64_t wyhash64( uint64_t & state ) { 186 uint64_t ret = state; 187 state += 0x_60be_e2be_e120_fc15; 188 __uint128_t tmp; 189 tmp = (__uint128_t) ret * 0x_a3b1_9535_4a39_b70d; 190 uint64_t m1 = (tmp >> 64) ^ tmp; 191 tmp = (__uint128_t)m1 * 0x_1b03_7387_12fa_d5c9; 192 uint64_t m2 = (tmp >> 64) ^ tmp; 193 return m2; 194 } // wyhash64 170 //-------------------------------------------------- 171 static inline uint64_t lehmer64( __uint128_t & state ) { 172 __uint128_t ret = state; 173 state *= 0x_da94_2042_e4dd_58b5; 174 return ret >> 64; 175 } // lehmer64 176 177 static inline void lehmer64_set_seed( __uint128_t & state, uint64_t seed ) { 178 // The seed needs to be coprime with the 2^64 modulus to get the largest period, so no factors of 2 in the seed. 179 state = splitmix64( seed ); // prime 180 } // lehmer64_set_seed 181 182 //-------------------------------------------------- 183 static inline uint64_t wyhash64( uint64_t & state ) { 184 uint64_t ret = state; 185 state += 0x_60be_e2be_e120_fc15; 186 __uint128_t tmp; 187 tmp = (__uint128_t) ret * 0x_a3b1_9535_4a39_b70d; 188 uint64_t m1 = (tmp >> 64) ^ tmp; 189 tmp = (__uint128_t)m1 * 0x_1b03_7387_12fa_d5c9; 190 uint64_t m2 = (tmp >> 64) ^ tmp; 191 return m2; 192 } // wyhash64 193 194 static inline void wyhash64_set_seed( uint64_t & state, uint64_t seed ) { 195 state = splitmix64( seed ); // prime 196 } // wyhash64_set_seed 195 197 #endif // __SIZEOF_INT128__ 196 198 … … 227 229 228 230 static inline void xoshiro256pp_set_seed( xoshiro256pp_t & state, uint64_t seed ) { 229 // these are done explicitly in this order to attain repeatable seeding. 230 // do not call splitmix64 directly in the state init since order of argument evaluation 231 // may not be consistent leading to irreproducible seeding 232 uint64_t seed1 = splitmix64( seed ); 231 // To attain repeatable seeding, compute seeds separately because the order of argument evaluation is undefined. 232 uint64_t seed1 = splitmix64( seed ); // prime 233 233 uint64_t seed2 = splitmix64( seed ); 234 234 uint64_t seed3 = splitmix64( seed ); 235 235 uint64_t seed4 = splitmix64( seed ); 236 236 state = (xoshiro256pp_t){ seed1, seed2, seed3, seed4 }; 237 xoshiro256pp( state ); // prime238 237 } // xoshiro256pp_set_seed 239 238 … … 269 268 270 269 static inline void xoshiro128pp_set_seed( xoshiro128pp_t & state, uint32_t seed ) { 271 // these are done explicitly in this order to attain repeatable seeding. 272 // do not call splitmix32 directly in the state init since order of argument evaluation 273 // may not be consistent leading to irreproducible seeding 274 uint32_t seed1 = splitmix32( seed ); 270 // To attain repeatable seeding, compute seeds separately because the order of argument evaluation is undefined. 271 uint32_t seed1 = splitmix32( seed ); // prime 275 272 uint32_t seed2 = splitmix32( seed ); 276 273 uint32_t seed3 = splitmix32( seed ); 277 274 uint32_t seed4 = splitmix32( seed ); 278 275 state = (xoshiro128pp_t){ seed1, seed2, seed3, seed4 }; 279 xoshiro128pp( state ); // prime280 276 } // xoshiro128pp_set_seed 281 277 … … 290 286 291 287 static inline void xorshift_13_7_17_set_seed( uint64_t & state, uint64_t seed ) { 292 state = seed; 293 xorshift_13_7_17( state ); // prime 288 state = splitmix64( seed ); // prime 294 289 } // xorshift_13_7_17_set_seed 295 290 … … 308 303 309 304 static inline void xorshift_6_21_7_set_seed( uint32_t & state, uint32_t seed ) { 310 state = seed; 311 xorshift_6_21_7( state ); // prime 305 state = splitmix32( seed ); // prime 312 306 } // xorshift_6_21_7_set_seed 313 307 … … 323 317 324 318 static inline void xorshift_12_25_27_set_seed( uint64_t & state, uint64_t seed ) { 325 state = seed; 326 xorshift_12_25_27( state ); // prime 319 state = splitmix64( seed ); // prime 327 320 } // xorshift_12_25_27_set_seed 328 321 … … 345 338 346 339 static inline void kiss_64_set_seed( kiss_64_t & rs, uint64_t seed ) with(rs) { 347 z = 1; w = 1; jsr = 4; jcong = seed; 348 kiss_64( rs ); // prime 340 z = 1; w = 1; jsr = 4; jcong = splitmix64( seed ); // prime 349 341 } // kiss_64_set_seed 350 342 … … 374 366 375 367 static inline void xorwow_set_seed( xorwow_t & rs, uint32_t seed ) { 376 // these are done explicitly in this order to attain repeatable seeding. 377 // do not call splitmix32 directly in the state init since order of argument evaluation 378 // may not be consistent leading to irreproducible seeding 379 uint32_t seed1 = splitmix32( seed ); 368 // To attain repeatable seeding, compute seeds separately because the order of argument evaluation is undefined. 369 uint32_t seed1 = splitmix32( seed ); // prime 380 370 uint32_t seed2 = splitmix32( seed ); 381 371 uint32_t seed3 = splitmix32( seed ); 382 372 uint32_t seed4 = splitmix32( seed ); 383 373 rs = (xorwow_t){ seed1, seed2, seed3, seed4, 0 }; 384 xorwow( rs ); // prime385 374 } // xorwow_set_seed 386 375 … … 388 377 // Used in __tls_rand_fwd 389 378 #define M (1_l64u << 48_l64u) 390 #define A (25 214903917_l64u)391 #define AI (18 446708753438544741_l64u)379 #define A (25_214_903_917_l64u) 380 #define AI (18_446_708_753_438_544_741_l64u) 392 381 #define C (11_l64u) 393 382 #define D (16_l64u) -
libcfa/src/concurrency/channel.hfa
r0e16a2d r75d874a 2 2 3 3 #include <locks.hfa> 4 5 struct no_reacq_lock { 6 inline exp_backoff_then_block_lock; 7 }; 8 9 // have to override these by hand to get around plan 9 inheritance bug where resolver can't find the appropriate routine to call 10 static inline void ?{}( no_reacq_lock & this ) { ((exp_backoff_then_block_lock &)this){}; } 11 static inline bool try_lock(no_reacq_lock & this) { return try_lock(((exp_backoff_then_block_lock &)this)); } 12 static inline void lock(no_reacq_lock & this) { lock(((exp_backoff_then_block_lock &)this)); } 13 static inline void unlock(no_reacq_lock & this) { unlock(((exp_backoff_then_block_lock &)this)); } 14 static inline void on_notify(no_reacq_lock & this, struct thread$ * t ) { on_notify(((exp_backoff_then_block_lock &)this), t); } 15 static inline size_t on_wait(no_reacq_lock & this) { return on_wait(((exp_backoff_then_block_lock &)this)); } 16 // override wakeup so that we don't reacquire the lock if using a condvar 17 static inline void on_wakeup( no_reacq_lock & this, size_t recursion ) {} 18 19 #define __PREVENTION_CHANNEL 4 #include <list.hfa> 5 6 #define __COOP_CHANNEL 20 7 #ifdef __PREVENTION_CHANNEL 21 8 forall( T ) { 22 9 struct channel { 23 size_t size; 24 size_t front, back, count; 10 size_t size, count, front, back; 25 11 T * buffer; 26 12 thread$ * chair; … … 87 73 return; 88 74 } 89 elseinsert_( chan, elem );75 insert_( chan, elem ); 90 76 91 77 unlock( mutex_lock ); … … 110 96 111 97 // wait if buffer is empty, work will be completed by someone else 112 if ( count == 0 ) { 98 if ( count == 0 ) { 113 99 chair = active_thread(); 114 100 chair_elem = &retval; … … 121 107 memcpy((void *)&retval, (void *)&buffer[front], sizeof(T)); 122 108 count -= 1; 123 front = (front + 1) % size; 109 front++; 110 if ( front == size ) front = 0; 124 111 125 112 if ( chair != 0p ) { … … 142 129 143 130 #ifdef __COOP_CHANNEL 131 132 // link field used for threads waiting on channel 133 struct wait_link { 134 // used to put wait_link on a dl queue 135 inline dlink(wait_link); 136 137 // waiting thread 138 struct thread$ * t; 139 140 // shadow field 141 void * elem; 142 }; 143 P9_EMBEDDED( wait_link, dlink(wait_link) ) 144 145 static inline void ?{}( wait_link & this, thread$ * t, void * elem ) { 146 this.t = t; 147 this.elem = elem; 148 } 149 144 150 forall( T ) { 151 145 152 struct channel { 146 153 size_t size; 147 154 size_t front, back, count; 148 155 T * buffer; 149 fast_cond_var( no_reacq_lock ) prods, cons;150 no_reacq_lock mutex_lock;156 dlist( wait_link ) prods, cons; 157 exp_backoff_then_block_lock mutex_lock; 151 158 }; 152 159 … … 164 171 static inline size_t get_count( channel(T) & chan ) with(chan) { return count; } 165 172 static inline size_t get_size( channel(T) & chan ) with(chan) { return size; } 166 static inline bool has_waiters( channel(T) & chan ) with(chan) { return ! empty( cons ) || !empty( prods ); }167 static inline bool has_waiting_consumers( channel(T) & chan ) with(chan) { return ! empty( cons ); }168 static inline bool has_waiting_producers( channel(T) & chan ) with(chan) { return ! empty( prods ); }173 static inline bool has_waiters( channel(T) & chan ) with(chan) { return !cons`isEmpty || !prods`isEmpty; } 174 static inline bool has_waiting_consumers( channel(T) & chan ) with(chan) { return !cons`isEmpty; } 175 static inline bool has_waiting_producers( channel(T) & chan ) with(chan) { return !prods`isEmpty; } 169 176 170 177 static inline void insert_( channel(T) & chan, T & elem ) with(chan) { … … 175 182 } 176 183 184 static inline void wake_one( dlist( wait_link ) & queue ) { 185 wait_link & popped = try_pop_front( queue ); 186 unpark( popped.t ); 187 } 188 189 static inline void block( dlist( wait_link ) & queue, void * elem_ptr, exp_backoff_then_block_lock & lock ) { 190 wait_link w{ active_thread(), elem_ptr }; 191 insert_last( queue, w ); 192 unlock( lock ); 193 park(); 194 } 177 195 178 196 static inline void insert( channel(T) & chan, T elem ) with(chan) { … … 180 198 181 199 // have to check for the zero size channel case 182 if ( size == 0 && ! empty( cons )) {183 memcpy( (void *)front( cons ), (void *)&elem, sizeof(T));184 notify_one( cons );200 if ( size == 0 && !cons`isEmpty ) { 201 memcpy(cons`first.elem, (void *)&elem, sizeof(T)); 202 wake_one( cons ); 185 203 unlock( mutex_lock ); 186 204 return; … … 188 206 189 207 // wait if buffer is full, work will be completed by someone else 190 if ( count == size ) { 191 wait( prods, mutex_lock, (uintptr_t)&elem);208 if ( count == size ) { 209 block( prods, &elem, mutex_lock ); 192 210 return; 193 211 } // if 194 212 195 if ( count == 0 && ! empty( cons ) )196 // do waiting consumer work197 memcpy((void *)front( cons ), (void *)&elem, sizeof(T));198 else insert_( chan, elem );213 if ( count == 0 && !cons`isEmpty ) { 214 memcpy(cons`first.elem, (void *)&elem, sizeof(T)); // do waiting consumer work 215 wake_one( cons ); 216 } else insert_( chan, elem ); 199 217 200 notify_one( cons );201 218 unlock( mutex_lock ); 202 219 } … … 207 224 208 225 // have to check for the zero size channel case 209 if ( size == 0 && ! empty( prods )) {210 memcpy((void *)&retval, (void *) front( prods ), sizeof(T));211 notify_one( prods );226 if ( size == 0 && !prods`isEmpty ) { 227 memcpy((void *)&retval, (void *)prods`first.elem, sizeof(T)); 228 wake_one( prods ); 212 229 unlock( mutex_lock ); 213 230 return retval; … … 215 232 216 233 // wait if buffer is empty, work will be completed by someone else 217 if (count == 0) { 218 wait( cons, mutex_lock, (uintptr_t)&retval);234 if (count == 0) { 235 block( cons, &retval, mutex_lock ); 219 236 return retval; 220 237 } … … 225 242 front = (front + 1) % size; 226 243 227 if (count == size - 1 && !empty( prods ) ) 228 insert_( chan, *((T *)front( prods )) ); // do waiting producer work 229 230 notify_one( prods ); 244 if (count == size - 1 && !prods`isEmpty ) { 245 insert_( chan, *(T *)prods`first.elem ); // do waiting producer work 246 wake_one( prods ); 247 } 248 231 249 unlock( mutex_lock ); 232 250 return retval; 233 251 } 234 235 252 } // forall( T ) 236 253 #endif -
libcfa/src/concurrency/io.cfa
r0e16a2d r75d874a 295 295 // make sure the target hasn't stopped existing since last time 296 296 HELP: if(target < ctxs_count) { 297 // calculate it's age and how young it could be before we give ip on helping297 // calculate it's age and how young it could be before we give up on helping 298 298 const __readyQ_avg_t cutoff = calc_cutoff(ctsc, ctx->cq.id, ctxs_count, io.data, io.tscs, __shard_factor.io, false); 299 299 const __readyQ_avg_t age = moving_average(ctsc, io.tscs[target].t.tv, io.tscs[target].t.ma, false); -
libcfa/src/concurrency/io/call.cfa.in
r0e16a2d r75d874a 89 89 #if defined(CFA_HAVE_PREADV2) 90 90 struct iovec; 91 extern ssize_t preadv2 (int fd, const struct iovec * iov, int iovcnt, off_t offset, int flags);91 extern ssize_t preadv2 (int fd, const struct iovec * iov, int iovcnt, off_t offset, int flags); 92 92 #endif 93 93 #if defined(CFA_HAVE_PWRITEV2) 94 94 struct iovec; 95 extern ssize_t pwritev2(int fd, const struct iovec * iov, int iovcnt, off_t offset, int flags);95 extern ssize_t pwritev2(int fd, const struct iovec * iov, int iovcnt, off_t offset, int flags); 96 96 #endif 97 97 … … 108 108 struct msghdr; 109 109 struct sockaddr; 110 extern ssize_t sendmsg(int sockfd, const struct msghdr * msg, int flags);111 extern ssize_t recvmsg(int sockfd, struct msghdr * msg, int flags);112 extern ssize_t send(int sockfd, const void * buf, size_t len, int flags);113 extern ssize_t recv(int sockfd, void * buf, size_t len, int flags);110 extern ssize_t sendmsg(int sockfd, const struct msghdr * msg, int flags); 111 extern ssize_t recvmsg(int sockfd, struct msghdr * msg, int flags); 112 extern ssize_t send(int sockfd, const void * buf, size_t len, int flags); 113 extern ssize_t recv(int sockfd, void * buf, size_t len, int flags); 114 114 115 115 extern int fallocate(int fd, int mode, off_t offset, off_t len); 116 116 extern int posix_fadvise(int fd, off_t offset, off_t len, int advice); 117 extern int madvise(void * addr, size_t length, int advice);118 119 extern int openat(int dirfd, const char * pathname, int flags, mode_t mode);117 extern int madvise(void * addr, size_t length, int advice); 118 119 extern int openat(int dirfd, const char * pathname, int flags, mode_t mode); 120 120 extern int close(int fd); 121 121 122 extern ssize_t read (int fd, void * buf, size_t count);122 extern ssize_t read (int fd, void * buf, size_t count); 123 123 124 124 struct epoll_event; 125 extern int epoll_ctl(int epfd, int op, int fd, struct epoll_event * event);126 127 extern ssize_t splice(int fd_in, __off64_t * off_in, int fd_out, __off64_t *off_out, size_t len, unsigned int flags);125 extern int epoll_ctl(int epfd, int op, int fd, struct epoll_event * event); 126 127 extern ssize_t splice(int fd_in, __off64_t * off_in, int fd_out, __off64_t * off_out, size_t len, unsigned int flags); 128 128 extern ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags); 129 129 } … … 224 224 calls = [ 225 225 # CFA_HAVE_IORING_OP_READV 226 Call('READV', 'ssize_t preadv2(int fd, const struct iovec * iov, int iovcnt, off_t offset, int flags)', {226 Call('READV', 'ssize_t preadv2(int fd, const struct iovec * iov, int iovcnt, off_t offset, int flags)', { 227 227 'fd' : 'fd', 228 'addr': '(typeof(sqe->addr))iov', 229 'len' : 'iovcnt', 228 230 'off' : 'offset', 229 'addr': '(uintptr_t)iov', 230 'len' : 'iovcnt', 231 'rw_flags' : 'flags' 231 232 }, define = 'CFA_HAVE_PREADV2'), 232 233 # CFA_HAVE_IORING_OP_WRITEV 233 Call('WRITEV', 'ssize_t pwritev2(int fd, const struct iovec * iov, int iovcnt, off_t offset, int flags)', {234 Call('WRITEV', 'ssize_t pwritev2(int fd, const struct iovec * iov, int iovcnt, off_t offset, int flags)', { 234 235 'fd' : 'fd', 236 'addr': '(typeof(sqe->addr))iov', 237 'len' : 'iovcnt', 235 238 'off' : 'offset', 236 'addr': '(uintptr_t)iov', 237 'len' : 'iovcnt' 239 'rw_flags' : 'flags' 238 240 }, define = 'CFA_HAVE_PWRITEV2'), 239 241 # CFA_HAVE_IORING_OP_FSYNC … … 242 244 }), 243 245 # CFA_HAVE_IORING_OP_EPOLL_CTL 244 Call('EPOLL_CTL', 'int epoll_ctl(int epfd, int op, int fd, struct epoll_event * event)', {246 Call('EPOLL_CTL', 'int epoll_ctl(int epfd, int op, int fd, struct epoll_event * event)', { 245 247 'fd': 'epfd', 248 'len': 'op', 246 249 'addr': 'fd', 247 'len': 'op', 248 'off': '(uintptr_t)event' 250 'off': '(typeof(sqe->off))event' 249 251 }), 250 252 # CFA_HAVE_IORING_OP_SYNC_FILE_RANGE … … 256 258 }), 257 259 # CFA_HAVE_IORING_OP_SENDMSG 258 Call('SENDMSG', 'ssize_t sendmsg(int sockfd, const struct msghdr * msg, int flags)', {259 'fd': 'sockfd', 260 'addr': '( uintptr_t)(struct msghdr *)msg',260 Call('SENDMSG', 'ssize_t sendmsg(int sockfd, const struct msghdr * msg, int flags)', { 261 'fd': 'sockfd', 262 'addr': '(typeof(sqe->addr))(struct msghdr *)msg', 261 263 'len': '1', 262 264 'msg_flags': 'flags' 263 265 }), 264 266 # CFA_HAVE_IORING_OP_RECVMSG 265 Call('RECVMSG', 'ssize_t recvmsg(int sockfd, struct msghdr * msg, int flags)', {266 'fd': 'sockfd', 267 'addr': '( uintptr_t)(struct msghdr *)msg',267 Call('RECVMSG', 'ssize_t recvmsg(int sockfd, struct msghdr * msg, int flags)', { 268 'fd': 'sockfd', 269 'addr': '(typeof(sqe->addr))(struct msghdr *)msg', 268 270 'len': '1', 269 271 'msg_flags': 'flags' 270 272 }), 271 273 # CFA_HAVE_IORING_OP_SEND 272 Call('SEND', 'ssize_t send(int sockfd, const void * buf, size_t len, int flags)', {273 'fd': 'sockfd', 274 'addr': '( uintptr_t)buf',274 Call('SEND', 'ssize_t send(int sockfd, const void * buf, size_t len, int flags)', { 275 'fd': 'sockfd', 276 'addr': '(typeof(sqe->addr))buf', 275 277 'len': 'len', 276 278 'msg_flags': 'flags' 277 279 }), 278 280 # CFA_HAVE_IORING_OP_RECV 279 Call('RECV', 'ssize_t recv(int sockfd, void * buf, size_t len, int flags)', {280 'fd': 'sockfd', 281 'addr': '( uintptr_t)buf',281 Call('RECV', 'ssize_t recv(int sockfd, void * buf, size_t len, int flags)', { 282 'fd': 'sockfd', 283 'addr': '(typeof(sqe->addr))buf', 282 284 'len': 'len', 283 285 'msg_flags': 'flags' … … 286 288 Call('ACCEPT', 'int accept4(int sockfd, __SOCKADDR_ARG addr, socklen_t * restrict addrlen, int flags)', { 287 289 'fd': 'sockfd', 288 'addr': '( uintptr_t)&addr',289 'addr2': '( uintptr_t)addrlen',290 'addr': '(typeof(sqe->addr))&addr', 291 'addr2': '(typeof(sqe->addr2))addrlen', 290 292 'accept_flags': 'flags' 291 293 }), … … 293 295 Call('CONNECT', 'int connect(int sockfd, __CONST_SOCKADDR_ARG addr, socklen_t addrlen)', { 294 296 'fd': 'sockfd', 295 'addr': '( uintptr_t)&addr',297 'addr': '(typeof(sqe->addr))&addr', 296 298 'off': 'addrlen' 297 299 }), … … 299 301 Call('FALLOCATE', 'int fallocate(int fd, int mode, off_t offset, off_t len)', { 300 302 'fd': 'fd', 301 'addr': '(uintptr_t)len',302 303 'len': 'mode', 303 'off': 'offset' 304 'off': 'offset', 305 'addr': 'len' 304 306 }), 305 307 # CFA_HAVE_IORING_OP_FADVISE … … 311 313 }), 312 314 # CFA_HAVE_IORING_OP_MADVISE 313 Call('MADVISE', 'int madvise(void * addr, size_t length, int advice)', {314 'addr': '( uintptr_t)addr',315 Call('MADVISE', 'int madvise(void * addr, size_t length, int advice)', { 316 'addr': '(typeof(sqe->addr))addr', 315 317 'len': 'length', 316 318 'fadvise_advice': 'advice' 317 319 }), 318 320 # CFA_HAVE_IORING_OP_OPENAT 319 Call('OPENAT', 'int openat(int dirfd, const char * pathname, int flags, mode_t mode)', {321 Call('OPENAT', 'int openat(int dirfd, const char * pathname, int flags, mode_t mode)', { 320 322 'fd': 'dirfd', 321 'addr': '( uintptr_t)pathname',322 ' len': 'mode',323 ' open_flags': 'flags;'323 'addr': '(typeof(sqe->addr))pathname', 324 'open_flags': 'flags;', 325 'len': 'mode' 324 326 }), 325 327 # CFA_HAVE_IORING_OP_OPENAT2 326 Call('OPENAT2', 'int openat2(int dirfd, const char * pathname, struct open_how * how, size_t size)', {328 Call('OPENAT2', 'int openat2(int dirfd, const char * pathname, struct open_how * how, size_t size)', { 327 329 'fd': 'dirfd', 328 'addr': ' pathname',329 ' len': 'sizeof(*how)',330 ' off': '(uintptr_t)how',330 'addr': '(typeof(sqe->addr))pathname', 331 'off': '(typeof(sqe->off))how', 332 'len': 'sizeof(*how)' 331 333 }, define = 'CFA_HAVE_OPENAT2'), 332 334 # CFA_HAVE_IORING_OP_CLOSE … … 335 337 }), 336 338 # CFA_HAVE_IORING_OP_STATX 337 Call('STATX', 'int statx(int dirfd, const char * pathname, int flags, unsigned int mask, struct statx *statxbuf)', {339 Call('STATX', 'int statx(int dirfd, const char * pathname, int flags, unsigned int mask, struct statx * statxbuf)', { 338 340 'fd': 'dirfd', 339 ' off': '(uintptr_t)statxbuf',340 ' addr': 'pathname',341 'addr': '(typeof(sqe->addr))pathname', 342 'statx_flags': 'flags', 341 343 'len': 'mask', 342 ' statx_flags': 'flags'344 'off': '(typeof(sqe->off))statxbuf' 343 345 }, define = 'CFA_HAVE_STATX'), 344 346 # CFA_HAVE_IORING_OP_READ 345 347 Call('READ', 'ssize_t read(int fd, void * buf, size_t count)', { 346 348 'fd': 'fd', 347 'addr': '( uintptr_t)buf',349 'addr': '(typeof(sqe->addr))buf', 348 350 'len': 'count' 349 351 }), … … 351 353 Call('WRITE', 'ssize_t write(int fd, void * buf, size_t count)', { 352 354 'fd': 'fd', 353 'addr': '( uintptr_t)buf',355 'addr': '(typeof(sqe->addr))buf', 354 356 'len': 'count' 355 357 }), 356 358 # CFA_HAVE_IORING_OP_SPLICE 357 Call('SPLICE', 'ssize_t splice(int fd_in, __off64_t * off_in, int fd_out, __off64_t *off_out, size_t len, unsigned int flags)', {359 Call('SPLICE', 'ssize_t splice(int fd_in, __off64_t * off_in, int fd_out, __off64_t * off_out, size_t len, unsigned int flags)', { 358 360 'splice_fd_in': 'fd_in', 359 'splice_off_in': 'off_in ? ( __u64)*off_in : (__u64)-1',361 'splice_off_in': 'off_in ? (typeof(sqe->splice_off_in))*off_in : (typeof(sqe->splice_off_in))-1', 360 362 'fd': 'fd_out', 361 'off': 'off_out ? ( __u64)*off_out : (__u64)-1',363 'off': 'off_out ? (typeof(sqe->off))*off_out : (typeof(sqe->off))-1', 362 364 'len': 'len', 363 365 'splice_flags': 'flags' -
libcfa/src/concurrency/locks.hfa
r0e16a2d r75d874a 253 253 static inline void on_wakeup(clh_lock & this, size_t recursion ) { lock(this); } 254 254 255 256 255 //----------------------------------------------------------------------------- 257 256 // Exponential backoff then block lock … … 272 271 this.lock_value = 0; 273 272 } 274 static inline void ^?{}( exp_backoff_then_block_lock & this ) {}275 // static inline void ?{}( exp_backoff_then_block_lock & this, exp_backoff_then_block_lock this2 ) = void;276 // static inline void ?=?( exp_backoff_then_block_lock & this, exp_backoff_then_block_lock this2 ) = void;277 273 278 274 static inline bool internal_try_lock(exp_backoff_then_block_lock & this, size_t & compare_val) with(this) { 279 if (__atomic_compare_exchange_n(&lock_value, &compare_val, 1, false, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) { 280 return true; 281 } 282 return false; 275 return __atomic_compare_exchange_n(&lock_value, &compare_val, 1, false, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED); 283 276 } 284 277 … … 286 279 287 280 static inline bool try_lock_contention(exp_backoff_then_block_lock & this) with(this) { 288 if (__atomic_exchange_n(&lock_value, 2, __ATOMIC_ACQUIRE) == 0) { 289 return true; 290 } 291 return false; 281 return !__atomic_exchange_n(&lock_value, 2, __ATOMIC_ACQUIRE); 292 282 } 293 283 294 284 static inline bool block(exp_backoff_then_block_lock & this) with(this) { 295 lock( spinlock __cfaabi_dbg_ctx2 ); // TODO change to lockfree queue (MPSC) 296 if (lock_value!= 2) {297 298 299 300 301 285 lock( spinlock __cfaabi_dbg_ctx2 ); 286 if (__atomic_load_n( &lock_value, __ATOMIC_SEQ_CST) != 2) { 287 unlock( spinlock ); 288 return true; 289 } 290 insert_last( blocked_threads, *active_thread() ); 291 unlock( spinlock ); 302 292 park( ); 303 293 return true; … … 307 297 size_t compare_val = 0; 308 298 int spin = 4; 299 309 300 // linear backoff 310 301 for( ;; ) { … … 324 315 static inline void unlock(exp_backoff_then_block_lock & this) with(this) { 325 316 if (__atomic_exchange_n(&lock_value, 0, __ATOMIC_RELEASE) == 1) return; 326 327 328 329 317 lock( spinlock __cfaabi_dbg_ctx2 ); 318 thread$ * t = &try_pop_front( blocked_threads ); 319 unlock( spinlock ); 320 unpark( t ); 330 321 } 331 322 -
src/AST/Print.cpp
r0e16a2d r75d874a 369 369 --indent; 370 370 } 371 } 372 373 if ( ! node->withExprs.empty() ) { 374 // Not with a clause, but the 'with clause'. 375 ++indent; 376 os << " with clause" << endl << indent; 377 printAll( node->withExprs ); 378 --indent; 371 379 } 372 380 -
src/Common/module.mk
r0e16a2d r75d874a 20 20 Common/CodeLocationTools.hpp \ 21 21 Common/CodeLocationTools.cpp \ 22 Common/Debug.h \23 22 Common/DeclStats.hpp \ 24 23 Common/DeclStats.cpp \ -
src/Common/utility.h
r0e16a2d r75d874a 190 190 } 191 191 192 template< typename... Params >193 void warn( const Params & ... params ) {194 std::cerr << "Warning: ";195 toString_single( std::cerr, params... );196 std::cerr << std::endl;197 }198 199 192 // determines if pref is a prefix of str 200 193 static inline bool isPrefix( const std::string & str, const std::string & pref, unsigned int start = 0 ) { -
src/InitTweak/FixInit.cc
r0e16a2d r75d874a 1233 1233 } 1234 1234 1235 template< typename Visitor, typename... Params >1236 void error( Visitor & v, CodeLocation loc, const Params &... params ) {1237 SemanticErrorException err( loc, toString( params... ) );1238 v.errors.append( err );1239 }1240 1241 1235 template< typename... Params > 1242 1236 void GenStructMemberCalls::emit( CodeLocation loc, const Params &... params ) { 1243 // toggle warnings vs. errors here. 1244 // warn( params... ); 1245 error( *this, loc, params... ); 1237 SemanticErrorException err( loc, toString( params... ) ); 1238 errors.append( err ); 1246 1239 } 1247 1240 -
src/InitTweak/FixInitNew.cpp
r0e16a2d r75d874a 1303 1303 } 1304 1304 1305 template< typename Visitor, typename... Params >1306 void error( Visitor & v, CodeLocation loc, const Params &... params ) {1307 SemanticErrorException err( loc, toString( params... ) );1308 v.errors.append( err );1309 }1310 1311 1305 template< typename... Params > 1312 1306 void GenStructMemberCalls::emit( CodeLocation loc, const Params &... params ) { 1313 // toggle warnings vs. errors here. 1314 // warn( params... ); 1315 error( *this, loc, params... ); 1307 SemanticErrorException err( loc, toString( params... ) ); 1308 errors.append( err ); 1316 1309 } 1317 1310 -
src/Parser/parser.yy
r0e16a2d r75d874a 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Mar 14 09:37:58202313 // Update Count : 599012 // Last Modified On : Wed Mar 22 21:26:01 2023 13 // Update Count : 6002 14 14 // 15 15 … … 270 270 SemanticError( yylloc, ::toString( "Identifier \"", identifier, "\" cannot appear before a ", kind, ".\n" 271 271 "Possible cause is misspelled storage/CV qualifier, misspelled typename, or missing generic parameter." ) ); 272 } // IdentifierBeforeType 273 274 static bool TypedefForall( DeclarationNode * decl ) { 275 if ( decl->type->forall || (decl->type->kind == TypeData::Aggregate && decl->type->aggregate.params) ) { 276 SemanticError( yylloc, "forall qualifier in typedef is currently unimplemented." ); 277 return true; 278 } // if 279 return false; 272 280 } // IdentifierBeforeType 273 281 … … 496 504 %type<decl> typedef_name typedef_declaration typedef_expression 497 505 498 %type<decl> variable_type_redeclarator type_ptr type_array type_function 506 %type<decl> variable_type_redeclarator variable_type_ptr variable_type_array variable_type_function 507 %type<decl> general_function_declarator function_type_redeclarator function_type_array function_type_no_ptr function_type_ptr 499 508 500 509 %type<decl> type_parameter_redeclarator type_parameter_ptr type_parameter_array type_parameter_function … … 1957 1966 TYPEDEF type_specifier declarator 1958 1967 { 1959 // if type_specifier is an anon aggregate => name1960 1968 typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname, "4" ); 1961 $$ = $3->addType( $2 )->addTypedef(); // watchout frees $2 and $3 1969 if ( TypedefForall( $2 ) ) $$ = nullptr; 1970 else $$ = $3->addType( $2 )->addTypedef(); // watchout frees $2 and $3 1962 1971 } 1963 1972 | typedef_declaration pop ',' push declarator … … 1969 1978 { 1970 1979 typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname, "6" ); 1971 $$ = $4->addQualifiers( $1 )->addType( $3 )->addTypedef(); 1980 if ( TypedefForall( $1 ) ) $$ = nullptr; 1981 else $$ = $4->addQualifiers( $1 )->addType( $3 )->addTypedef(); 1972 1982 } 1973 1983 | type_specifier TYPEDEF declarator 1974 1984 { 1975 1985 typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname, "7" ); 1976 $$ = $3->addType( $1 )->addTypedef(); 1986 if ( TypedefForall( $1 ) ) $$ = nullptr; 1987 else $$ = $3->addType( $1 )->addTypedef(); 1977 1988 } 1978 1989 | type_specifier TYPEDEF type_qualifier_list declarator 1979 1990 { 1980 1991 typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname, "8" ); 1981 $$ = $4->addQualifiers( $1 )->addType( $1 )->addTypedef(); 1992 if ( TypedefForall( $3 ) ) $$ = nullptr; 1993 else $$ = $4->addQualifiers( $1 )->addType( $1 )->addTypedef(); 1982 1994 } 1983 1995 ; … … 2016 2028 // A semantic check is required to ensure asm_name only appears on declarations with implicit or explicit static 2017 2029 // storage-class 2018 declarator asm_name_opt initializer_opt2030 variable_declarator asm_name_opt initializer_opt 2019 2031 { $$ = $1->addAsmName( $2 )->addInitializer( $3 ); } 2032 | variable_type_redeclarator asm_name_opt initializer_opt 2033 { $$ = $1->addAsmName( $2 )->addInitializer( $3 ); } 2034 2035 | general_function_declarator asm_name_opt 2036 { $$ = $1->addAsmName( $2 )->addInitializer( nullptr ); } 2037 | general_function_declarator asm_name_opt '=' VOID 2038 { $$ = $1->addAsmName( $2 )->addInitializer( new InitializerNode( true ) ); } 2039 2020 2040 | declaring_list ',' attribute_list_opt declarator asm_name_opt initializer_opt 2021 2041 { $$ = $1->appendList( $4->addQualifiers( $3 )->addAsmName( $5 )->addInitializer( $6 ) ); } 2042 ; 2043 2044 general_function_declarator: 2045 function_type_redeclarator 2046 | function_declarator 2022 2047 ; 2023 2048 … … 2543 2568 // A semantic check is required to ensure bit_subrange only appears on integral types. 2544 2569 { $$ = $1->addBitfield( $2 ); } 2570 | function_type_redeclarator bit_subrange_size_opt 2571 // A semantic check is required to ensure bit_subrange only appears on integral types. 2572 { $$ = $1->addBitfield( $2 ); } 2545 2573 ; 2546 2574 … … 3195 3223 $$ = $2->addFunctionBody( $4, $3 )->addType( $1 ); 3196 3224 } 3197 | declaration_specifier variable_type_redeclarator with_clause_opt compound_statement3225 | declaration_specifier function_type_redeclarator with_clause_opt compound_statement 3198 3226 { 3199 3227 rebindForall( $1, $2 ); … … 3231 3259 | variable_type_redeclarator 3232 3260 | function_declarator 3261 | function_type_redeclarator 3233 3262 ; 3234 3263 … … 3481 3510 ; 3482 3511 3483 // This pattern parses a declaration for a variable or function prototypethat redefines a type name, e.g.:3512 // This pattern parses a declaration for a variable that redefines a type name, e.g.: 3484 3513 // 3485 3514 // typedef int foo; … … 3487 3516 // int foo; // redefine typedef name in new scope 3488 3517 // } 3489 //3490 // The pattern precludes declaring an array of functions versus a pointer to an array of functions, and returning arrays3491 // and functions versus pointers to arrays and functions.3492 3518 3493 3519 paren_type: … … 3504 3530 paren_type attribute_list_opt 3505 3531 { $$ = $1->addQualifiers( $2 ); } 3506 | type_ptr3507 | type_array attribute_list_opt3532 | variable_type_ptr 3533 | variable_type_array attribute_list_opt 3508 3534 { $$ = $1->addQualifiers( $2 ); } 3509 | type_function attribute_list_opt3535 | variable_type_function attribute_list_opt 3510 3536 { $$ = $1->addQualifiers( $2 ); } 3511 3537 ; 3512 3538 3513 type_ptr:3539 variable_type_ptr: 3514 3540 ptrref_operator variable_type_redeclarator 3515 3541 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); } 3516 3542 | ptrref_operator type_qualifier_list variable_type_redeclarator 3517 3543 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 3518 | '(' type_ptr ')' attribute_list_opt// redundant parenthesis3544 | '(' variable_type_ptr ')' attribute_list_opt // redundant parenthesis 3519 3545 { $$ = $2->addQualifiers( $4 ); } 3520 | '(' attribute_list type_ptr ')' attribute_list_opt // redundant parenthesis3546 | '(' attribute_list variable_type_ptr ')' attribute_list_opt // redundant parenthesis 3521 3547 { $$ = $3->addQualifiers( $2 )->addQualifiers( $5 ); } 3522 3548 ; 3523 3549 3524 type_array:3550 variable_type_array: 3525 3551 paren_type array_dimension 3526 3552 { $$ = $1->addArray( $2 ); } 3527 | '(' type_ptr ')' array_dimension3553 | '(' variable_type_ptr ')' array_dimension 3528 3554 { $$ = $2->addArray( $4 ); } 3529 | '(' attribute_list type_ptr ')' array_dimension3555 | '(' attribute_list variable_type_ptr ')' array_dimension 3530 3556 { $$ = $3->addQualifiers( $2 )->addArray( $5 ); } 3531 | '(' type_array ')' multi_array_dimension// redundant parenthesis3557 | '(' variable_type_array ')' multi_array_dimension // redundant parenthesis 3532 3558 { $$ = $2->addArray( $4 ); } 3533 | '(' attribute_list type_array ')' multi_array_dimension // redundant parenthesis3559 | '(' attribute_list variable_type_array ')' multi_array_dimension // redundant parenthesis 3534 3560 { $$ = $3->addQualifiers( $2 )->addArray( $5 ); } 3535 | '(' type_array ')'// redundant parenthesis3561 | '(' variable_type_array ')' // redundant parenthesis 3536 3562 { $$ = $2; } 3537 | '(' attribute_list type_array ')'// redundant parenthesis3563 | '(' attribute_list variable_type_array ')' // redundant parenthesis 3538 3564 { $$ = $3->addQualifiers( $2 ); } 3539 3565 ; 3540 3566 3541 type_function: 3567 variable_type_function: 3568 '(' variable_type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3) 3569 { $$ = $2->addParamList( $6 ); } 3570 | '(' attribute_list variable_type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3) 3571 { $$ = $3->addQualifiers( $2 )->addParamList( $7 ); } 3572 | '(' variable_type_function ')' // redundant parenthesis 3573 { $$ = $2; } 3574 | '(' attribute_list variable_type_function ')' // redundant parenthesis 3575 { $$ = $3->addQualifiers( $2 ); } 3576 ; 3577 3578 // This pattern parses a declaration for a function prototype that redefines a type name. It precludes declaring an 3579 // array of functions versus a pointer to an array of functions, and returning arrays and functions versus pointers to 3580 // arrays and functions. 3581 3582 function_type_redeclarator: 3583 function_type_no_ptr attribute_list_opt 3584 { $$ = $1->addQualifiers( $2 ); } 3585 | function_type_ptr 3586 | function_type_array attribute_list_opt 3587 { $$ = $1->addQualifiers( $2 ); } 3588 ; 3589 3590 function_type_no_ptr: 3542 3591 paren_type '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3) 3543 3592 { $$ = $1->addParamList( $4 ); } 3544 | '(' type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)3593 | '(' function_type_ptr ')' '(' push parameter_type_list_opt pop ')' 3545 3594 { $$ = $2->addParamList( $6 ); } 3546 | '(' attribute_list type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)3595 | '(' attribute_list function_type_ptr ')' '(' push parameter_type_list_opt pop ')' 3547 3596 { $$ = $3->addQualifiers( $2 )->addParamList( $7 ); } 3548 | '(' type_function ')'// redundant parenthesis3597 | '(' function_type_no_ptr ')' // redundant parenthesis 3549 3598 { $$ = $2; } 3550 | '(' attribute_list type_function ')' // redundant parenthesis 3599 | '(' attribute_list function_type_no_ptr ')' // redundant parenthesis 3600 { $$ = $3->addQualifiers( $2 ); } 3601 ; 3602 3603 function_type_ptr: 3604 ptrref_operator function_type_redeclarator 3605 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); } 3606 | ptrref_operator type_qualifier_list function_type_redeclarator 3607 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 3608 | '(' function_type_ptr ')' attribute_list_opt 3609 { $$ = $2->addQualifiers( $4 ); } 3610 | '(' attribute_list function_type_ptr ')' attribute_list_opt 3611 { $$ = $3->addQualifiers( $2 )->addQualifiers( $5 ); } 3612 ; 3613 3614 function_type_array: 3615 '(' function_type_ptr ')' array_dimension 3616 { $$ = $2->addArray( $4 ); } 3617 | '(' attribute_list function_type_ptr ')' array_dimension 3618 { $$ = $3->addQualifiers( $2 )->addArray( $5 ); } 3619 | '(' function_type_array ')' multi_array_dimension // redundant parenthesis 3620 { $$ = $2->addArray( $4 ); } 3621 | '(' attribute_list function_type_array ')' multi_array_dimension // redundant parenthesis 3622 { $$ = $3->addQualifiers( $2 )->addArray( $5 ); } 3623 | '(' function_type_array ')' // redundant parenthesis 3624 { $$ = $2; } 3625 | '(' attribute_list function_type_array ')' // redundant parenthesis 3551 3626 { $$ = $3->addQualifiers( $2 ); } 3552 3627 ; -
src/SynTree/FunctionDecl.cc
r0e16a2d r75d874a 87 87 } // if 88 88 89 if ( !withExprs.empty() ) { 90 os << indent << "... with clause" << std::endl; 91 os << indent + 1; 92 printAll( withExprs, os, indent + 1 ); 93 } 94 89 95 if ( statements ) { 90 96 os << indent << "... with body" << endl << indent+1; -
tests/.expect/PRNG.x64.txt
r0e16a2d r75d874a 1 1 2 2 PRNG() PRNG(5) PRNG(0,5) 3 2629641414891406278 3 04 11972157801652581900 3 55 94706820939349784372 26 316134424938305673 2 27 5572275127081588144 0 38 1 2394954141290188855 2 29 15386440704589550620 2 110 5760167266331356361 2 511 8021670258373873290 2 512 8813161879342109574 1 413 10525294799876107814 2014 14801827301969351008 3 015 1 7016612914230924215 0 016 5485205801221744751 3 217 6143666691223938511 4 018 1 5086131934315954459 4 519 4547668615176940328 4 520 1 7718351571399359777 0521 2636252641646208341 4 022 12820158953704882599 0 43 13944458589275087071 3 2 4 129977468648444256 0 4 5 2357727400298891021 2 2 6 8855179187835660146 3 3 7 9957620185645882382 4 1 8 13396406983727409795 0 5 9 3342782395220265920 0 5 10 1707651271867677937 1 0 11 16402561450140881681 0 1 12 17838519215740313729 4 2 13 7425936020594490136 4 0 14 4174865704721714670 3 5 15 16055269689200152092 0 2 16 15091270195803594018 1 5 17 11807315541476180798 1 1 18 10697186588988060306 4 1 19 14665526411527044929 3 2 20 11289342279096164771 2 5 21 16126980828050300615 1 4 22 7821578301767524260 4 1 23 23 seed 1009 24 24 … … 33 33 34 34 prng() prng(5) prng(0,5) 35 2629641414891406278 3 036 11972157801652581900 3 537 94706820939349784372 238 316134424938305673 2 239 5572275127081588144 0 340 1 2394954141290188855 2 241 15386440704589550620 2 142 5760167266331356361 2 543 8021670258373873290 2 544 8813161879342109574 1 445 10525294799876107814 2046 14801827301969351008 3 047 1 7016612914230924215 0 048 5485205801221744751 3 249 6143666691223938511 4 050 1 5086131934315954459 4 551 4547668615176940328 4 552 1 7718351571399359777 0553 2636252641646208341 4 054 12820158953704882599 0 435 13944458589275087071 3 2 36 129977468648444256 0 4 37 2357727400298891021 2 2 38 8855179187835660146 3 3 39 9957620185645882382 4 1 40 13396406983727409795 0 5 41 3342782395220265920 0 5 42 1707651271867677937 1 0 43 16402561450140881681 0 1 44 17838519215740313729 4 2 45 7425936020594490136 4 0 46 4174865704721714670 3 5 47 16055269689200152092 0 2 48 15091270195803594018 1 5 49 11807315541476180798 1 1 50 10697186588988060306 4 1 51 14665526411527044929 3 2 52 11289342279096164771 2 5 53 16126980828050300615 1 4 54 7821578301767524260 4 1 55 55 seed 1009 56 56 … … 65 65 66 66 prng(t) prng(t,5) prng(t,0,5) 67 2629641414891406278 3 068 11972157801652581900 3 569 94706820939349784372 270 316134424938305673 2 271 5572275127081588144 0 372 1 2394954141290188855 2 273 15386440704589550620 2 174 5760167266331356361 2 575 8021670258373873290 2 576 8813161879342109574 1 477 10525294799876107814 2078 14801827301969351008 3 079 1 7016612914230924215 0 080 5485205801221744751 3 281 6143666691223938511 4 082 1 5086131934315954459 4 583 4547668615176940328 4 584 1 7718351571399359777 0585 2636252641646208341 4 086 12820158953704882599 0 467 13944458589275087071 3 2 68 129977468648444256 0 4 69 2357727400298891021 2 2 70 8855179187835660146 3 3 71 9957620185645882382 4 1 72 13396406983727409795 0 5 73 3342782395220265920 0 5 74 1707651271867677937 1 0 75 16402561450140881681 0 1 76 17838519215740313729 4 2 77 7425936020594490136 4 0 78 4174865704721714670 3 5 79 16055269689200152092 0 2 80 15091270195803594018 1 5 81 11807315541476180798 1 1 82 10697186588988060306 4 1 83 14665526411527044929 3 2 84 11289342279096164771 2 5 85 16126980828050300615 1 4 86 7821578301767524260 4 1 87 87 seed 1009 88 88 -
tests/.expect/PRNG.x86.txt
r0e16a2d r75d874a 1 1 2 2 PRNG() PRNG(5) PRNG(0,5) 3 130161 1 14 4074541490 0 05 927506267 0 36 1991273445 1 37 669918146 2 38 519546860 119 1136699882 4310 2130185384 3 111 992239050 0 512 2250903111 0 113 1544429724 3 214 1591091660 3 315 2511657707 2 416 1065770984 2417 2412763405 4418 18 34447239 4 219 360289337 0 420 2449452027 1 121 3370425396 2 122 3109103043 0 33 2884683541 0 0 4 3465286746 2 4 5 3268922916 0 1 6 2396374907 3 0 7 2135076892 4 1 8 944377718 3 1 9 2204845346 3 3 10 3736609533 0 4 11 4063231336 0 2 12 1075394776 0 2 13 712844808 4 0 14 4246343110 3 1 15 3793873837 2 1 16 3690340337 1 4 17 319207944 1 4 18 1815791072 3 5 19 2581617261 1 5 20 3873329448 1 3 21 832631329 4 0 22 651551615 3 5 23 23 seed 1009 24 24 25 25 Sequential 26 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%26 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 27 27 28 28 Concurrent 29 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%30 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%31 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%32 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%29 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 30 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 31 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 32 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 33 33 34 34 prng() prng(5) prng(0,5) 35 130161 1 136 4074541490 0 037 927506267 0 338 1991273445 1 339 669918146 2 340 519546860 1141 1136699882 4342 2130185384 3 143 992239050 0 544 2250903111 0 145 1544429724 3 246 1591091660 3 347 2511657707 2 448 1065770984 2449 2412763405 4450 18 34447239 4 251 360289337 0 452 2449452027 1 153 3370425396 2 154 3109103043 0 335 2884683541 0 0 36 3465286746 2 4 37 3268922916 0 1 38 2396374907 3 0 39 2135076892 4 1 40 944377718 3 1 41 2204845346 3 3 42 3736609533 0 4 43 4063231336 0 2 44 1075394776 0 2 45 712844808 4 0 46 4246343110 3 1 47 3793873837 2 1 48 3690340337 1 4 49 319207944 1 4 50 1815791072 3 5 51 2581617261 1 5 52 3873329448 1 3 53 832631329 4 0 54 651551615 3 5 55 55 seed 1009 56 56 57 57 Sequential 58 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%58 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 59 59 60 60 Concurrent 61 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%62 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%63 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%64 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%61 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 62 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 63 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 64 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 65 65 66 66 prng(t) prng(t,5) prng(t,0,5) 67 130161 1 168 4074541490 0 069 927506267 0 370 1991273445 1 371 669918146 2 372 519546860 1173 1136699882 4374 2130185384 3 175 992239050 0 576 2250903111 0 177 1544429724 3 278 1591091660 3 379 2511657707 2 480 1065770984 2481 2412763405 4482 18 34447239 4 283 360289337 0 484 2449452027 1 185 3370425396 2 186 3109103043 0 367 2884683541 0 0 68 3465286746 2 4 69 3268922916 0 1 70 2396374907 3 0 71 2135076892 4 1 72 944377718 3 1 73 2204845346 3 3 74 3736609533 0 4 75 4063231336 0 2 76 1075394776 0 2 77 712844808 4 0 78 4246343110 3 1 79 3793873837 2 1 80 3690340337 1 4 81 319207944 1 4 82 1815791072 3 5 83 2581617261 1 5 84 3873329448 1 3 85 832631329 4 0 86 651551615 3 5 87 87 seed 1009 88 88 89 89 Sequential 90 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%90 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 91 91 92 92 Concurrent 93 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%94 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%95 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%96 trials 100000000 buckets 100000 min 8 67 max 1135 avg 1000.0 std 31.7rstd 3.2%93 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 94 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 95 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% 96 trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2% -
tests/.expect/nested_function.x86.txt
r0e16a2d r75d874a 1 total 1051 total 245 -
tests/concurrent/channels/parallel_harness.hfa
r0e16a2d r75d874a 100 100 101 101 int test( size_t Processors, size_t Channels, size_t Producers, size_t Consumers, size_t ChannelSize ) { 102 size_t Clusters = 1;102 size_t Clusters = Processors; 103 103 // create a cluster 104 104 cluster clus[Clusters]; … … 108 108 } 109 109 110 channels = a new( Channels );110 channels = aalloc( Channels ); 111 111 112 112 // sout | "Processors: " | Processors | " ProdsPerChan: " | Producers | " ConsPerChan: " | Consumers | "Channels: " | Channels | " Channel Size: " | ChannelSize; … … 150 150 151 151 } 152 // for ( i; Channels ) { 153 // // sout | get_count( channels[i] ); 154 // if ( get_count( channels[i] ) < Consumers ){ 155 // #ifdef BIG 156 // bigObject b{0}; 157 // #endif 158 // for ( j; Consumers ) { 159 // #ifdef BIG 160 // insert( channels[i], b ); 161 // #else 162 // insert( channels[i], 0 ); 163 // #endif 164 // } 165 // } 166 // } 152 167 153 sout | "cons"; 168 154 for ( i; Consumers * Channels ) { -
tests/concurrent/pthread/.expect/bounded_buffer.x64.txt
r0e16a2d r75d874a 1 producer total value is 3 81602 consumer total value is 3 81601 producer total value is 39780 2 consumer total value is 39780 -
tests/concurrent/pthread/.expect/bounded_buffer.x86.txt
r0e16a2d r75d874a 1 producer total value is 450602 consumer total value is 450601 producer total value is 1770 2 consumer total value is 1770
Note: See TracChangeset
for help on using the changeset viewer.