2019-02-04 22:26:45 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
< html >
< head >
< title > 1/pp< / title >
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" >
< meta http-equiv = "Content-Language" content = "en-gb" >
< link href = "inweb.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
< / head >
< body >
2019-02-09 12:33:40 +00:00
<!-- Weave of '1/wp' generated by 7 -->
2019-02-04 22:26:45 +00:00
< ul class = "crumbs" > < li > < a href = "../webs.html" > ★ < / a > < / li > < li > < a href = "index.html" > foundation< / a > < / li > < li > < a href = "index.html#1" > Chapter 1: Setting Up< / a > < / li > < li > < b > Windows Platform< / b > < / li > < / ul > < p class = "purpose" > A version of our operating system interface suitable for Microsoft Windows.< / p >
< ul class = "toc" > < li > < a href = "#SP2" > § 2. Microsoft Windows< / a > < / li > < li > < a href = "#SP4" > § 4. Environment variables< / a > < / li > < li > < a href = "#SP5" > § 5. Executable location< / a > < / li > < li > < a href = "#SP6" > § 6. Shell commands< / a > < / li > < li > < a href = "#SP7" > § 7. Directory handling< / a > < / li > < li > < a href = "#SP8" > § 8. Sleep< / a > < / li > < li > < a href = "#SP9" > § 9. Notifications< / a > < / li > < li > < a href = "#SP10" > § 10. Concurrency< / a > < / li > < li > < a href = "#SP12" > § 12. Mutexes< / a > < / li > < / ul > < hr class = "tocbar" >
< p class = "inwebparagraph" > < a id = "SP1" > < / a > < b > § 1. < / b > This Foundation module comes with two variant versions of the < code class = "display" > < span class = "extract" > Platform::< / span > < / code >
section of code. The one you're reading compiles on Windows, and the other
on a POSIX operating system.
< / p >
< p class = "endnote" > This paragraph is used only if PLATFORM_WINDOWS is defined.< / p >
< p class = "inwebparagraph" > < a id = "SP2" > < / a > < b > § 2. Microsoft Windows. < / b > < / p >
< pre class = "definitions" >
< span class = "definitionkeyword" > define< / span > < span class = "constant" > PLATFORM_STRING< / span > < span class = "plain" > < / span > < span class = "string" > "windows"< / span >
< span class = "definitionkeyword" > define< / span > < span class = "constant" > LOCALE_IS_ISO< / span >
< span class = "definitionkeyword" > define< / span > < span class = "constant" > FOLDER_SEPARATOR< / span > < span class = "plain" > < / span > < span class = "character" > '\< / span > < span class = "plain" > \< / span > < span class = "character" > '< / span >
< span class = "definitionkeyword" > define< / span > < span class = "constant" > SHELL_QUOTE_CHARACTER< / span > < span class = "plain" > < / span > < span class = "character" > '\< / span > < span class = "plain" > "< / span > < span class = "character" > '< / span >
< span class = "definitionkeyword" > define< / span > < span class = "constant" > WINDOWS_JAVASCRIPT< / span >
< span class = "definitionkeyword" > define< / span > < span class = "constant" > INFORM_FOLDER_RELATIVE_TO_HOME< / span > < span class = "plain" > < / span > < span class = "string" > ""< / span >
< span class = "definitionkeyword" > define< / span > < span class = "constant" > HTML_MAP_FONT_SIZE< / span > < span class = "plain" > 11< / span >
< / pre >
< pre class = "display" >
< span class = "plain" > #< / span > < span class = "identifier" > include< / span > < span class = "plain" > < < / span > < span class = "identifier" > sys< / span > < span class = "plain" > /< / span > < span class = "identifier" > stat< / span > < span class = "plain" > .< / span > < span class = "identifier" > h< / span > < span class = "plain" > > < / span >
< span class = "plain" > #< / span > < span class = "identifier" > include< / span > < span class = "plain" > < < / span > < span class = "identifier" > dirent< / span > < span class = "plain" > .< / span > < span class = "identifier" > h< / span > < span class = "plain" > > < / span >
< span class = "plain" > #< / span > < span class = "identifier" > include< / span > < span class = "plain" > < < / span > < span class = "identifier" > errno< / span > < span class = "plain" > .< / span > < span class = "identifier" > h< / span > < span class = "plain" > > < / span >
< span class = "plain" > #< / span > < span class = "identifier" > include< / span > < span class = "plain" > < < / span > < span class = "identifier" > io< / span > < span class = "plain" > .< / span > < span class = "identifier" > h< / span > < span class = "plain" > > < / span >
2019-02-09 12:33:40 +00:00
< span class = "plain" > #< / span > < span class = "identifier" > include< / span > < span class = "plain" > < < / span > < span class = "identifier" > windows< / span > < span class = "plain" > .< / span > < span class = "identifier" > h< / span > < span class = "plain" > > < / span >
2019-02-04 22:26:45 +00:00
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This paragraph is used only if PLATFORM_WINDOWS is defined.< / p >
< p class = "inwebparagraph" > < a id = "SP3" > < / a > < b > § 3. < / b > A Windows-safe form of < code class = "display" > < span class = "extract" > isdigit< / span > < / code > . Annoyingly, the C specification allows
the implementation to have < code class = "display" > < span class = "extract" > char< / span > < / code > either signed or unsigned. On Windows it's
generally signed. Now, consider what happens with a character value of
acute-e. This has an < code class = "display" > < span class = "extract" > unsigned char< / span > < / code > value of 233. When stored in a < code class = "display" > < span class = "extract" > char< / span > < / code >
on Windows, this becomes a value of < code class = "display" > < span class = "extract" > -23< / span > < / code > . When this is passed to < code class = "display" > < span class = "extract" > isdigit()< / span > < / code > ,
we need to consider the prototype for < code class = "display" > < span class = "extract" > isdigit()< / span > < / code > :
< / p >
< p class = "inwebparagraph" > < code class = "display" > < span class = "extract" > int isdigit(int);< / span > < / code >
< / p >
< p class = "inwebparagraph" > So, when casting to int we get < code class = "display" > < span class = "extract" > -23< / span > < / code > , not < code class = "display" > < span class = "extract" > 233< / span > < / code > . Unfortunately the return value
from < code class = "display" > < span class = "extract" > isdigit()< / span > < / code > is only defined by the C specification for values in the
range 0 to 255 (and also EOF), so the return value for < code class = "display" > < span class = "extract" > -23< / span > < / code > is undefined.
And with Windows GCC, < code class = "display" > < span class = "extract" > isdigit(-23)< / span > < / code > returns a non-zero value.
< / p >
< pre class = "definitions" >
< span class = "definitionkeyword" > define< / span > < span class = "identifier" > isdigit< / span > < span class = "plain" > (< / span > < span class = "identifier" > x< / span > < span class = "plain" > ) < / span > < span class = "functiontext" > Platform::Windows_isdigit< / span > < span class = "plain" > (< / span > < span class = "identifier" > x< / span > < span class = "plain" > )< / span >
< / pre >
< pre class = "display" >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::Windows_isdigit< / span > < span class = "plain" > (< / span > < span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > c< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > return< / span > < span class = "plain" > ((< / span > < span class = "identifier" > c< / span > < span class = "plain" > > = < / span > < span class = "character" > '0'< / span > < span class = "plain" > ) & & (< / span > < span class = "identifier" > c< / span > < span class = "plain" > < = < / span > < span class = "character" > '9'< / span > < span class = "plain" > )) ? 1 : 0;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This paragraph is used only if PLATFORM_WINDOWS is defined.< / p >
< p class = "endnote" > The function Platform::Windows_isdigit appears nowhere else.< / p >
< p class = "inwebparagraph" > < a id = "SP4" > < / a > < b > § 4. Environment variables. < / b > < / p >
< pre class = "display" >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > __stdcall< / span > < span class = "plain" > < / span > < span class = "functiontext" > GetCurrentDirectoryA< / span > < span class = "plain" > (< / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > len< / span > < span class = "plain" > , < / span > < span class = "reserved" > char< / span > < span class = "plain" > * < / span > < span class = "identifier" > buffer< / span > < span class = "plain" > );< / span >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > __stdcall< / span > < span class = "plain" > < / span > < span class = "functiontext" > SHGetFolderPathA< / span > < span class = "plain" > (< / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > wnd< / span > < span class = "plain" > , < / span > < span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > folder< / span > < span class = "plain" > ,< / span >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > token< / span > < span class = "plain" > , < / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > flags< / span > < span class = "plain" > , < / span > < span class = "reserved" > char< / span > < span class = "plain" > * < / span > < span class = "identifier" > path< / span > < span class = "plain" > );< / span >
< span class = "reserved" > char< / span > < span class = "plain" > *< / span > < span class = "functiontext" > Platform::getenv< / span > < span class = "plain" > (< / span > < span class = "reserved" > const< / span > < span class = "plain" > < / span > < span class = "reserved" > char< / span > < span class = "plain" > *< / span > < span class = "identifier" > name< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > static< / span > < span class = "plain" > < / span > < span class = "reserved" > char< / span > < span class = "plain" > < / span > < span class = "identifier" > env< / span > < span class = "plain" > [260];< / span >
< span class = "identifier" > env< / span > < span class = "plain" > [0] = 0;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > strcmp< / span > < span class = "plain" > (< / span > < span class = "identifier" > name< / span > < span class = "plain" > ,< / span > < span class = "string" > "PWD"< / span > < span class = "plain" > ) == 0) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > GetCurrentDirectoryA< / span > < span class = "plain" > (260,< / span > < span class = "identifier" > env< / span > < span class = "plain" > ) > 0) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > env< / span > < span class = "plain" > ;< / span >
< span class = "plain" > } < / span > < span class = "reserved" > else< / span > < span class = "plain" > < / span > < span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > strcmp< / span > < span class = "plain" > (< / span > < span class = "identifier" > name< / span > < span class = "plain" > ,< / span > < span class = "string" > "HOME"< / span > < span class = "plain" > ) == 0) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > SHGetFolderPathA< / span > < span class = "plain" > (0,5,0,0,< / span > < span class = "identifier" > env< / span > < span class = "plain" > ) == 0) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > env< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > getenv< / span > < span class = "plain" > (< / span > < span class = "identifier" > name< / span > < span class = "plain" > );< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This paragraph is used only if PLATFORM_WINDOWS is defined.< / p >
< p class = "endnote" > The function GetCurrentDirectoryA appears nowhere else.< / p >
< p class = "endnote" > The function SHGetFolderPathA appears nowhere else.< / p >
< p class = "endnote" > The function Platform::getenv is used in 1/pp (< a href = "1-pp.html#SP8" > § 8< / a > ), 3/pth (< a href = "3-pth.html#SP2" > § 2< / a > , < a href = "3-pth.html#SP3" > § 3< / a > ).< / p >
< p class = "inwebparagraph" > < a id = "SP5" > < / a > < b > § 5. Executable location. < / b > Fill the wide-char buffer < code class = "display" > < span class = "extract" > p< / span > < / code > with the path to the current executable, up to
length < code class = "display" > < span class = "extract" > length< / span > < / code > . This function is guaranteed to be called from only one
thread. Should the information be unavailable, or fail to fit into < code class = "display" > < span class = "extract" > p< / span > < / code > ,
truncate < code class = "display" > < span class = "extract" > p< / span > < / code > to zero length. (On some platforms, the information will
always be unavailable: that doesn't mean we can't run on those platforms,
just that installation and use of Foundation-built tools is less convenient.)
< / p >
< pre class = "display" >
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::where_am_i< / span > < span class = "plain" > (< / span > < span class = "identifier" > wchar_t< / span > < span class = "plain" > *< / span > < span class = "identifier" > p< / span > < span class = "plain" > , < / span > < span class = "identifier" > size_t< / span > < span class = "plain" > < / span > < span class = "identifier" > length< / span > < span class = "plain" > ) {< / span >
2019-02-09 12:33:40 +00:00
< span class = "identifier" > DWORD< / span > < span class = "plain" > < / span > < span class = "identifier" > result< / span > < span class = "plain" > = < / span > < span class = "identifier" > GetModuleFileNameW< / span > < span class = "plain" > (< / span > < span class = "identifier" > NULL< / span > < span class = "plain" > , < / span > < span class = "identifier" > p< / span > < span class = "plain" > , < / span > < span class = "identifier" > length< / span > < span class = "plain" > );< / span >
< span class = "reserved" > if< / span > < span class = "plain" > ((< / span > < span class = "identifier" > result< / span > < span class = "plain" > == 0) || (< / span > < span class = "identifier" > result< / span > < span class = "plain" > == < / span > < span class = "identifier" > length< / span > < span class = "plain" > )) < / span > < span class = "identifier" > p< / span > < span class = "plain" > [0] = 0;< / span >
2019-02-04 22:26:45 +00:00
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This paragraph is used only if PLATFORM_WINDOWS is defined.< / p >
2019-02-09 12:33:40 +00:00
< p class = "endnote" > The function Platform::where_am_i is used in 1/pp (< a href = "1-pp.html#SP9" > § 9< / a > , < a href = "1-pp.html#SP9_1_1" > § 9.1.1< / a > , < a href = "1-pp.html#SP9_1_2" > § 9.1.2< / a > , < a href = "1-pp.html#SP9_1_3" > § 9.1.3< / a > ), 3/pth (< a href = "3-pth.html#SP3" > § 3< / a > ).< / p >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP6" > < / a > < b > § 6. Shell commands. < / b > < / p >
< pre class = "display" >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Startup_Info< / span > < span class = "plain" > {< / span >
< span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v1< / span > < span class = "plain" > ; < / span > < span class = "reserved" > char< / span > < span class = "plain" > * < / span > < span class = "identifier" > v2< / span > < span class = "plain" > ; < / span > < span class = "reserved" > char< / span > < span class = "plain" > * < / span > < span class = "identifier" > v3< / span > < span class = "plain" > ; < / span > < span class = "reserved" > char< / span > < span class = "plain" > * < / span > < span class = "identifier" > v4< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v5< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v6< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v7< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v8< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v9< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v10< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v11< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > flags< / span > < span class = "plain" > ; < / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > short< / span > < span class = "plain" > < / span > < span class = "identifier" > showWindow< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > short< / span > < span class = "plain" > < / span > < span class = "identifier" > v12< / span > < span class = "plain" > ; < / span > < span class = "reserved" > char< / span > < span class = "plain" > * < / span > < span class = "identifier" > v13< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v14< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v15< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v16< / span > < span class = "plain" > ; };< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Process_Info< / span > < span class = "plain" > {< / span >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > process< / span > < span class = "plain" > ; < / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > thread< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v1< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v2< / span > < span class = "plain" > ; };< / span >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > __stdcall< / span > < span class = "plain" > < / span > < span class = "functiontext" > CloseHandle< / span > < span class = "plain" > (< / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > handle< / span > < span class = "plain" > );< / span >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > __stdcall< / span > < span class = "plain" > < / span > < span class = "functiontext" > WaitForSingleObject< / span > < span class = "plain" > (< / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > handle< / span > < span class = "plain" > , < / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > ms< / span > < span class = "plain" > );< / span >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > __stdcall< / span > < span class = "plain" > < / span > < span class = "functiontext" > CreateProcessA< / span > < span class = "plain" > (< / span > < span class = "reserved" > void< / span > < span class = "plain" > * < / span > < span class = "identifier" > app< / span > < span class = "plain" > , < / span > < span class = "reserved" > char< / span > < span class = "plain" > * < / span > < span class = "identifier" > cmd< / span > < span class = "plain" > , < / span > < span class = "reserved" > void< / span > < span class = "plain" > * < / span > < span class = "identifier" > pa< / span > < span class = "plain" > ,< / span >
< span class = "reserved" > void< / span > < span class = "plain" > * < / span > < span class = "identifier" > ta< / span > < span class = "plain" > , < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > inherit< / span > < span class = "plain" > , < / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > flags< / span > < span class = "plain" > , < / span > < span class = "reserved" > void< / span > < span class = "plain" > * < / span > < span class = "identifier" > env< / span > < span class = "plain" > , < / span > < span class = "reserved" > void< / span > < span class = "plain" > * < / span > < span class = "identifier" > dir< / span > < span class = "plain" > ,< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Startup_Info< / span > < span class = "plain" > * < / span > < span class = "identifier" > start< / span > < span class = "plain" > , < / span > < span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Process_Info< / span > < span class = "plain" > * < / span > < span class = "identifier" > process< / span > < span class = "plain" > );< / span >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > __stdcall< / span > < span class = "plain" > < / span > < span class = "functiontext" > GetExitCodeProcess< / span > < span class = "plain" > (< / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > proc< / span > < span class = "plain" > , < / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > * < / span > < span class = "identifier" > code< / span > < span class = "plain" > );< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::system< / span > < span class = "plain" > (< / span > < span class = "reserved" > const< / span > < span class = "plain" > < / span > < span class = "reserved" > char< / span > < span class = "plain" > *< / span > < span class = "identifier" > cmd< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > strncmp< / span > < span class = "plain" > (< / span > < span class = "identifier" > cmd< / span > < span class = "plain" > ,< / span > < span class = "string" > "md5 "< / span > < span class = "plain" > , 4) == 0) < / span > < span class = "reserved" > return< / span > < span class = "plain" > 0;< / span >
< span class = "reserved" > char< / span > < span class = "plain" > < / span > < span class = "identifier" > cmdline< / span > < span class = "plain" > [4096];< / span >
< span class = "identifier" > sprintf< / span > < span class = "plain" > (< / span > < span class = "identifier" > cmdline< / span > < span class = "plain" > ,< / span > < span class = "string" > "cmd /s /c \< / span > < span class = "plain" > "< / span > < span class = "string" > %s\< / span > < span class = "plain" > "< / span > < span class = "string" > "< / span > < span class = "plain" > , < / span > < span class = "identifier" > cmd< / span > < span class = "plain" > );< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Startup_Info< / span > < span class = "plain" > < / span > < span class = "identifier" > start< / span > < span class = "plain" > = { < / span > < span class = "reserved" > sizeof< / span > < span class = "plain" > (< / span > < span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Startup_Info< / span > < span class = "plain" > ), 0 };< / span >
< span class = "identifier" > start< / span > < span class = "plain" > .< / span > < span class = "identifier" > flags< / span > < span class = "plain" > = 1;< / span >
< span class = "identifier" > start< / span > < span class = "plain" > .< / span > < span class = "identifier" > showWindow< / span > < span class = "plain" > = 0;< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Process_Info< / span > < span class = "plain" > < / span > < span class = "identifier" > process< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > CreateProcessA< / span > < span class = "plain" > (0, < / span > < span class = "identifier" > cmdline< / span > < span class = "plain" > , 0, 0, 0, 0< / span > < span class = "identifier" > x8000000< / span > < span class = "plain" > , 0, 0, & < / span > < span class = "identifier" > start< / span > < span class = "plain" > , & < / span > < span class = "identifier" > process< / span > < span class = "plain" > ) == 0)< / span >
< span class = "reserved" > return< / span > < span class = "plain" > -1;< / span >
< span class = "functiontext" > CloseHandle< / span > < span class = "plain" > (< / span > < span class = "identifier" > process< / span > < span class = "plain" > .< / span > < span class = "identifier" > thread< / span > < span class = "plain" > );< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > WaitForSingleObject< / span > < span class = "plain" > (< / span > < span class = "identifier" > process< / span > < span class = "plain" > .< / span > < span class = "identifier" > process< / span > < span class = "plain" > , -1) != 0) {< / span >
< span class = "functiontext" > CloseHandle< / span > < span class = "plain" > (< / span > < span class = "identifier" > process< / span > < span class = "plain" > .< / span > < span class = "identifier" > process< / span > < span class = "plain" > );< / span >
< span class = "reserved" > return< / span > < span class = "plain" > -1;< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > code< / span > < span class = "plain" > = 10;< / span >
< span class = "functiontext" > GetExitCodeProcess< / span > < span class = "plain" > (< / span > < span class = "identifier" > process< / span > < span class = "plain" > .< / span > < span class = "identifier" > process< / span > < span class = "plain" > , & < / span > < span class = "identifier" > code< / span > < span class = "plain" > );< / span >
< span class = "functiontext" > CloseHandle< / span > < span class = "plain" > (< / span > < span class = "identifier" > process< / span > < span class = "plain" > .< / span > < span class = "identifier" > process< / span > < span class = "plain" > );< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > code< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This paragraph is used only if PLATFORM_WINDOWS is defined.< / p >
< p class = "endnote" > The function CloseHandle appears nowhere else.< / p >
< p class = "endnote" > The function WaitForSingleObject is used in < a href = "#SP11" > § 11< / a > .< / p >
< p class = "endnote" > The function CreateProcessA appears nowhere else.< / p >
< p class = "endnote" > The function GetExitCodeProcess appears nowhere else.< / p >
2019-02-09 12:33:40 +00:00
< p class = "endnote" > The function Platform::system is used in 1/pp (< a href = "1-pp.html#SP10" > § 10< / a > ), 3/shl (< a href = "3-shl.html#SP5" > § 5< / a > ).< / p >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP7" > < / a > < b > § 7. Directory handling. < / b > < / p >
< pre class = "display" >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::mkdir< / span > < span class = "plain" > (< / span > < span class = "reserved" > char< / span > < span class = "plain" > *< / span > < span class = "identifier" > transcoded_pathname< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > errno< / span > < span class = "plain" > = 0;< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > rv< / span > < span class = "plain" > = < / span > < span class = "identifier" > _mkdir< / span > < span class = "plain" > (< / span > < span class = "identifier" > transcoded_pathname< / span > < span class = "plain" > );< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > rv< / span > < span class = "plain" > == 0) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > TRUE< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > errno< / span > < span class = "plain" > == < / span > < span class = "identifier" > EEXIST< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > TRUE< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > void< / span > < span class = "plain" > *< / span > < span class = "functiontext" > Platform::opendir< / span > < span class = "plain" > (< / span > < span class = "reserved" > char< / span > < span class = "plain" > *< / span > < span class = "identifier" > path_to_folder< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > DIR< / span > < span class = "plain" > *< / span > < span class = "identifier" > dirp< / span > < span class = "plain" > = < / span > < span class = "identifier" > opendir< / span > < span class = "plain" > (< / span > < span class = "identifier" > path_to_folder< / span > < span class = "plain" > );< / span >
< span class = "reserved" > return< / span > < span class = "plain" > (< / span > < span class = "reserved" > void< / span > < span class = "plain" > *) < / span > < span class = "identifier" > dirp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::readdir< / span > < span class = "plain" > (< / span > < span class = "reserved" > void< / span > < span class = "plain" > *< / span > < span class = "identifier" > folder< / span > < span class = "plain" > , < / span > < span class = "reserved" > char< / span > < span class = "plain" > *< / span > < span class = "identifier" > path_to_folder< / span > < span class = "plain" > ,< / span >
< span class = "reserved" > char< / span > < span class = "plain" > *< / span > < span class = "identifier" > leafname< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > char< / span > < span class = "plain" > < / span > < span class = "identifier" > path_to< / span > < span class = "plain" > [2*< / span > < span class = "constant" > MAX_FILENAME_LENGTH< / span > < span class = "plain" > +2];< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > _stat< / span > < span class = "plain" > < / span > < span class = "identifier" > file_status< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > rv< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > DIR< / span > < span class = "plain" > *< / span > < span class = "identifier" > dirp< / span > < span class = "plain" > = (< / span > < span class = "identifier" > DIR< / span > < span class = "plain" > *) < / span > < span class = "identifier" > folder< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > dirent< / span > < span class = "plain" > *< / span > < span class = "identifier" > dp< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > ((< / span > < span class = "identifier" > dp< / span > < span class = "plain" > = < / span > < span class = "identifier" > readdir< / span > < span class = "plain" > (< / span > < span class = "identifier" > dirp< / span > < span class = "plain" > )) == < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > sprintf< / span > < span class = "plain" > (< / span > < span class = "identifier" > path_to< / span > < span class = "plain" > , < / span > < span class = "string" > "%s%c%s"< / span > < span class = "plain" > , < / span > < span class = "identifier" > path_to_folder< / span > < span class = "plain" > , < / span > < span class = "constant" > FOLDER_SEPARATOR< / span > < span class = "plain" > , < / span > < span class = "identifier" > dp< / span > < span class = "plain" > -> < / span > < span class = "identifier" > d_name< / span > < span class = "plain" > );< / span >
< span class = "identifier" > rv< / span > < span class = "plain" > = < / span > < span class = "identifier" > _stat< / span > < span class = "plain" > (< / span > < span class = "identifier" > path_to< / span > < span class = "plain" > , & < / span > < span class = "identifier" > file_status< / span > < span class = "plain" > );< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > rv< / span > < span class = "plain" > != 0) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > S_ISDIR< / span > < span class = "plain" > (< / span > < span class = "identifier" > file_status< / span > < span class = "plain" > .< / span > < span class = "identifier" > st_mode< / span > < span class = "plain" > ))< / span >
< span class = "identifier" > sprintf< / span > < span class = "plain" > (< / span > < span class = "identifier" > leafname< / span > < span class = "plain" > , < / span > < span class = "string" > "%s%c"< / span > < span class = "plain" > , < / span > < span class = "identifier" > dp< / span > < span class = "plain" > -> < / span > < span class = "identifier" > d_name< / span > < span class = "plain" > , < / span > < span class = "constant" > FOLDER_SEPARATOR< / span > < span class = "plain" > );< / span >
< span class = "reserved" > else< / span > < span class = "plain" > < / span > < span class = "identifier" > strcpy< / span > < span class = "plain" > (< / span > < span class = "identifier" > leafname< / span > < span class = "plain" > , < / span > < span class = "identifier" > dp< / span > < span class = "plain" > -> < / span > < span class = "identifier" > d_name< / span > < span class = "plain" > );< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > TRUE< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::closedir< / span > < span class = "plain" > (< / span > < span class = "reserved" > void< / span > < span class = "plain" > *< / span > < span class = "identifier" > folder< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > DIR< / span > < span class = "plain" > *< / span > < span class = "identifier" > dirp< / span > < span class = "plain" > = (< / span > < span class = "identifier" > DIR< / span > < span class = "plain" > *) < / span > < span class = "identifier" > folder< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > closedir< / span > < span class = "plain" > (< / span > < span class = "identifier" > dirp< / span > < span class = "plain" > );< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This paragraph is used only if PLATFORM_WINDOWS is defined.< / p >
2019-02-09 12:33:40 +00:00
< p class = "endnote" > The function Platform::mkdir is used in 1/pp (< a href = "1-pp.html#SP11" > § 11< / a > ), 3/pth (< a href = "3-pth.html#SP8" > § 8< / a > ).< / p >
2019-02-04 22:26:45 +00:00
2019-02-09 12:33:40 +00:00
< p class = "endnote" > The function Platform::opendir is used in 1/pp (< a href = "1-pp.html#SP11" > § 11< / a > ), 3/drc (< a href = "3-drc.html#SP2" > § 2< / a > ).< / p >
2019-02-04 22:26:45 +00:00
2019-02-09 12:33:40 +00:00
< p class = "endnote" > The function Platform::readdir is used in 1/pp (< a href = "1-pp.html#SP11" > § 11< / a > ), 3/drc (< a href = "3-drc.html#SP2" > § 2< / a > ).< / p >
2019-02-04 22:26:45 +00:00
2019-02-09 12:33:40 +00:00
< p class = "endnote" > The function Platform::closedir is used in 1/pp (< a href = "1-pp.html#SP11" > § 11< / a > ), 3/drc (< a href = "3-drc.html#SP2" > § 2< / a > ).< / p >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP8" > < / a > < b > § 8. Sleep. < / b > The Windows < code class = "display" > < span class = "extract" > Sleep< / span > < / code > call measures time in milliseconds, whereas
POSIX < code class = "display" > < span class = "extract" > sleep< / span > < / code > is for seconds.
< / p >
< pre class = "display" >
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "identifier" > __stdcall< / span > < span class = "plain" > < / span > < span class = "identifier" > Sleep< / span > < span class = "plain" > (< / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > ms< / span > < span class = "plain" > );< / span >
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::sleep< / span > < span class = "plain" > (< / span > < span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > seconds< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > Sleep< / span > < span class = "plain" > ((< / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > ) 1000*< / span > < span class = "identifier" > seconds< / span > < span class = "plain" > );< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This paragraph is used only if PLATFORM_WINDOWS is defined.< / p >
2019-02-09 12:33:40 +00:00
< p class = "endnote" > The function Platform::sleep is used in 1/pp (< a href = "1-pp.html#SP12" > § 12< / a > ).< / p >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP9" > < / a > < b > § 9. Notifications. < / b > < / p >
< pre class = "display" >
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::notification< / span > < span class = "plain" > (< / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > text< / span > < span class = "plain" > , < / span > < span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > happy< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This paragraph is used only if PLATFORM_WINDOWS is defined.< / p >
2019-02-09 12:33:40 +00:00
< p class = "endnote" > The function Platform::notification is used in 1/pp (< a href = "1-pp.html#SP13" > § 13< / a > , < a href = "1-pp.html#SP14" > § 14< / a > ).< / p >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP10" > < / a > < b > § 10. Concurrency. < / b > The following predeclarations come from the Windows SDK.
< / p >
< pre class = "display" >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > __stdcall< / span > < span class = "plain" > < / span > < span class = "functiontext" > CreateThread< / span > < span class = "plain" > (< / span > < span class = "reserved" > void< / span > < span class = "plain" > * < / span > < span class = "identifier" > attrs< / span > < span class = "plain" > , < / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > stack< / span > < span class = "plain" > ,< / span >
< span class = "reserved" > void< / span > < span class = "plain" > * < / span > < span class = "identifier" > func< / span > < span class = "plain" > , < / span > < span class = "reserved" > void< / span > < span class = "plain" > * < / span > < span class = "identifier" > param< / span > < span class = "plain" > , < / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > flags< / span > < span class = "plain" > , < / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > * < / span > < span class = "identifier" > id< / span > < span class = "plain" > );< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Thread_Attrs< / span > < span class = "plain" > {};< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Thread_Start< / span > < span class = "plain" > { < / span > < span class = "reserved" > void< / span > < span class = "plain" > *(*< / span > < span class = "identifier" > fn< / span > < span class = "plain" > )(< / span > < span class = "reserved" > void< / span > < span class = "plain" > *); < / span > < span class = "reserved" > void< / span > < span class = "plain" > * < / span > < span class = "identifier" > arg< / span > < span class = "plain" > ; };< / span >
< span class = "reserved" > typedef< / span > < span class = "plain" > < / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > foundation_thread< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > typedef< / span > < span class = "plain" > < / span > < span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Thread_Attrs< / span > < span class = "plain" > < / span > < span class = "identifier" > foundation_thread_attributes< / span > < span class = "plain" > ;< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This paragraph is used only if PLATFORM_WINDOWS is defined.< / p >
< p class = "endnote" > The function CreateThread is used in < a href = "#SP11" > § 11< / a > .< / p >
< p class = "inwebparagraph" > < a id = "SP11" > < / a > < b > § 11. < / b > < / p >
< pre class = "display" >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > __stdcall< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::Win32_Thread_Func< / span > < span class = "plain" > (< / span > < span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > param< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Thread_Start< / span > < span class = "plain" > * < / span > < span class = "identifier" > start< / span > < span class = "plain" > = (< / span > < span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Thread_Start< / span > < span class = "plain" > *)< / span > < span class = "identifier" > param< / span > < span class = "plain" > ;< / span >
< span class = "plain" > (< / span > < span class = "identifier" > start< / span > < span class = "plain" > -> < / span > < span class = "identifier" > fn< / span > < span class = "plain" > )(< / span > < span class = "identifier" > start< / span > < span class = "plain" > -> < / span > < span class = "identifier" > arg< / span > < span class = "plain" > );< / span >
< span class = "identifier" > free< / span > < span class = "plain" > (< / span > < span class = "identifier" > start< / span > < span class = "plain" > );< / span >
< span class = "reserved" > return< / span > < span class = "plain" > 0;< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::create_thread< / span > < span class = "plain" > (< / span > < span class = "identifier" > foundation_thread< / span > < span class = "plain" > *< / span > < span class = "identifier" > pt< / span > < span class = "plain" > , < / span > < span class = "reserved" > const< / span > < span class = "plain" > < / span > < span class = "identifier" > foundation_thread_attributes< / span > < span class = "plain" > *< / span > < span class = "identifier" > pa< / span > < span class = "plain" > ,< / span >
< span class = "reserved" > void< / span > < span class = "plain" > *(*< / span > < span class = "identifier" > fn< / span > < span class = "plain" > )(< / span > < span class = "reserved" > void< / span > < span class = "plain" > *), < / span > < span class = "reserved" > void< / span > < span class = "plain" > *< / span > < span class = "identifier" > arg< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Thread_Start< / span > < span class = "plain" > * < / span > < span class = "identifier" > start< / span > < span class = "plain" > = (< / span > < span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Thread_Start< / span > < span class = "plain" > *) < / span > < span class = "identifier" > malloc< / span > < span class = "plain" > (< / span > < span class = "reserved" > sizeof< / span > < span class = "plain" > (< / span > < span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Thread_Start< / span > < span class = "plain" > ));< / span >
< span class = "identifier" > start< / span > < span class = "plain" > -> < / span > < span class = "identifier" > fn< / span > < span class = "plain" > = < / span > < span class = "identifier" > fn< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > start< / span > < span class = "plain" > -> < / span > < span class = "identifier" > arg< / span > < span class = "plain" > = < / span > < span class = "identifier" > arg< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > unsigned< / span > < span class = "plain" > < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > thread< / span > < span class = "plain" > = < / span > < span class = "functiontext" > CreateThread< / span > < span class = "plain" > (0,0,< / span > < span class = "functiontext" > Platform::Win32_Thread_Func< / span > < span class = "plain" > ,< / span > < span class = "identifier" > start< / span > < span class = "plain" > ,0,0);< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > thread< / span > < span class = "plain" > == 0) {< / span >
< span class = "identifier" > free< / span > < span class = "plain" > (< / span > < span class = "identifier" > start< / span > < span class = "plain" > );< / span >
< span class = "reserved" > return< / span > < span class = "plain" > 1;< / span >
< span class = "plain" > } < / span > < span class = "reserved" > else< / span > < span class = "plain" > {< / span >
< span class = "plain" > *< / span > < span class = "identifier" > pt< / span > < span class = "plain" > = < / span > < span class = "identifier" > thread< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > 0;< / span >
< span class = "plain" > }< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::join_thread< / span > < span class = "plain" > (< / span > < span class = "identifier" > pthread_t< / span > < span class = "plain" > < / span > < span class = "identifier" > pt< / span > < span class = "plain" > , < / span > < span class = "reserved" > void< / span > < span class = "plain" > ** < / span > < span class = "identifier" > rv< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > return< / span > < span class = "plain" > (< / span > < span class = "functiontext" > WaitForSingleObject< / span > < span class = "plain" > (< / span > < span class = "identifier" > pt< / span > < span class = "plain" > ,-1) == 0) ? 0 : 1;< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::init_thread< / span > < span class = "plain" > (< / span > < span class = "identifier" > pthread_attr_t< / span > < span class = "plain" > * < / span > < span class = "identifier" > pa< / span > < span class = "plain" > , < / span > < span class = "identifier" > size_t< / span > < span class = "plain" > < / span > < span class = "identifier" > size< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > }< / span >
< span class = "identifier" > size_t< / span > < span class = "plain" > < / span > < span class = "functiontext" > Platform::get_thread_stack_size< / span > < span class = "plain" > (< / span > < span class = "identifier" > pthread_attr_t< / span > < span class = "plain" > * < / span > < span class = "identifier" > pa< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > return< / span > < span class = "plain" > 0;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This paragraph is used only if PLATFORM_WINDOWS is defined.< / p >
< p class = "endnote" > The function Platform::Win32_Thread_Func appears nowhere else.< / p >
2019-02-09 12:33:40 +00:00
< p class = "endnote" > The function Platform::create_thread is used in 1/pp (< a href = "1-pp.html#SP16" > § 16< / a > ).< / p >
2019-02-04 22:26:45 +00:00
2019-02-09 12:33:40 +00:00
< p class = "endnote" > The function Platform::join_thread is used in 1/pp (< a href = "1-pp.html#SP16" > § 16< / a > ).< / p >
2019-02-04 22:26:45 +00:00
2019-02-09 12:33:40 +00:00
< p class = "endnote" > The function Platform::init_thread is used in 1/pp (< a href = "1-pp.html#SP16" > § 16< / a > ).< / p >
2019-02-04 22:26:45 +00:00
2019-02-09 12:33:40 +00:00
< p class = "endnote" > The function Platform::get_thread_stack_size is used in 1/pp (< a href = "1-pp.html#SP16" > § 16< / a > ).< / p >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP12" > < / a > < b > § 12. Mutexes. < / b > < / p >
< pre class = "definitions" >
< span class = "definitionkeyword" > define< / span > < span class = "identifier" > CREATE_MUTEX< / span > < span class = "plain" > (< / span > < span class = "identifier" > name< / span > < span class = "plain" > )< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Critical_Section< / span > < span class = "plain" > < / span > < span class = "identifier" > name< / span > < span class = "plain" > { (< / span > < span class = "reserved" > void< / span > < span class = "plain" > *)-1, -1, 0, 0, 0, 0 };< / span >
< span class = "definitionkeyword" > define< / span > < span class = "identifier" > LOCK_MUTEX< / span > < span class = "plain" > (< / span > < span class = "identifier" > name< / span > < span class = "plain" > ) < / span > < span class = "identifier" > EnterCriticalSection< / span > < span class = "plain" > (& < / span > < span class = "identifier" > name< / span > < span class = "plain" > );< / span >
< span class = "definitionkeyword" > define< / span > < span class = "identifier" > UNLOCK_MUTEX< / span > < span class = "plain" > (< / span > < span class = "identifier" > name< / span > < span class = "plain" > ) < / span > < span class = "identifier" > LeaveCriticalSection< / span > < span class = "plain" > (& < / span > < span class = "identifier" > name< / span > < span class = "plain" > );< / span >
< / pre >
< pre class = "display" >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Critical_Section< / span > < span class = "plain" > {< / span >
< span class = "reserved" > void< / span > < span class = "plain" > * < / span > < span class = "identifier" > v1< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v2< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v3< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v4< / span > < span class = "plain" > ; < / span > < span class = "reserved" > long< / span > < span class = "plain" > < / span > < span class = "identifier" > v5< / span > < span class = "plain" > ; < / span > < span class = "reserved" > void< / span > < span class = "plain" > * < / span > < span class = "identifier" > v6< / span > < span class = "plain" > ; };< / span >
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "identifier" > __stdcall< / span > < span class = "plain" > < / span > < span class = "identifier" > EnterCriticalSection< / span > < span class = "plain" > (< / span > < span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Critical_Section< / span > < span class = "plain" > * < / span > < span class = "identifier" > cs< / span > < span class = "plain" > );< / span >
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "identifier" > __stdcall< / span > < span class = "plain" > < / span > < span class = "identifier" > LeaveCriticalSection< / span > < span class = "plain" > (< / span > < span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "identifier" > Win32_Critical_Section< / span > < span class = "plain" > * < / span > < span class = "identifier" > cs< / span > < span class = "plain" > );< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This paragraph is used only if PLATFORM_WINDOWS is defined.< / p >
2019-02-09 12:33:40 +00:00
<!-- End of weave: 236 lines from a web of 9267 -->
2019-02-04 22:26:45 +00:00
< / body >
< / html >