| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
- <head>
- <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
- <meta http-equiv="X-UA-Compatible" content="IE=11"/>
- <meta name="generator" content="Doxygen 1.12.0"/>
- <meta name="viewport" content="width=device-width, initial-scale=1"/>
- <title>Jolt Physics: JobSystem Class Reference</title>
- <link href="tabs.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="jquery.js"></script>
- <script type="text/javascript" src="dynsections.js"></script>
- <script type="text/javascript" src="clipboard.js"></script>
- <link href="navtree.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="navtreedata.js"></script>
- <script type="text/javascript" src="navtree.js"></script>
- <script type="text/javascript" src="resize.js"></script>
- <script type="text/javascript" src="cookie.js"></script>
- <link href="search/search.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="search/searchdata.js"></script>
- <script type="text/javascript" src="search/search.js"></script>
- <script type="text/x-mathjax-config">
- MathJax.Hub.Config({
- extensions: ["tex2jax.js"],
- jax: ["input/TeX","output/HTML-CSS"],
- });
- </script>
- <script type="text/javascript" async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js"></script>
- <link href="doxygen.css" rel="stylesheet" type="text/css" />
- </head>
- <body>
- <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
- <div id="titlearea">
- <table cellspacing="0" cellpadding="0">
- <tbody>
- <tr id="projectrow">
- <td id="projectlogo"><img alt="Logo" src="LogoSmall.png"/></td>
- <td id="projectalign">
- <div id="projectname">Jolt Physics
- </div>
- <div id="projectbrief">A multi core friendly Game Physics Engine</div>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- <!-- end header part -->
- <!-- Generated by Doxygen 1.12.0 -->
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
- var searchBox = new SearchBox("searchBox", "search/",'.html');
- /* @license-end */
- </script>
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
- $(function() { codefold.init(0); });
- /* @license-end */
- </script>
- <script type="text/javascript" src="menudata.js"></script>
- <script type="text/javascript" src="menu.js"></script>
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
- $(function() {
- initMenu('',true,false,'search.php','Search',true);
- $(function() { init_search(); });
- });
- /* @license-end */
- </script>
- <div id="main-nav"></div>
- </div><!-- top -->
- <div id="side-nav" class="ui-resizable side-nav-resizable">
- <div id="nav-tree">
- <div id="nav-tree-contents">
- <div id="nav-sync" class="sync"></div>
- </div>
- </div>
- <div id="splitbar" style="-moz-user-select:none;"
- class="ui-resizable-handle">
- </div>
- </div>
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
- $(function(){initNavTree('class_job_system.html',''); initResizable(true); });
- /* @license-end */
- </script>
- <div id="doc-content">
- <!-- window showing the filter options -->
- <div id="MSearchSelectWindow"
- onmouseover="return searchBox.OnSearchSelectShow()"
- onmouseout="return searchBox.OnSearchSelectHide()"
- onkeydown="return searchBox.OnSearchSelectKey(event)">
- </div>
- <!-- iframe showing the search results (closed by default) -->
- <div id="MSearchResultsWindow">
- <div id="MSearchResults">
- <div class="SRPage">
- <div id="SRIndex">
- <div id="SRResults"></div>
- <div class="SRStatus" id="Loading">Loading...</div>
- <div class="SRStatus" id="Searching">Searching...</div>
- <div class="SRStatus" id="NoMatches">No Matches</div>
- </div>
- </div>
- </div>
- </div>
- <div class="header">
- <div class="summary">
- <a href="#nested-classes">Classes</a> |
- <a href="#pub-types">Public Types</a> |
- <a href="#pub-methods">Public Member Functions</a> |
- <a href="#pro-methods">Protected Member Functions</a> |
- <a href="class_job_system-members.html">List of all members</a> </div>
- <div class="headertitle"><div class="title">JobSystem Class Reference<span class="mlabels"><span class="mlabel">abstract</span></span></div></div>
- </div><!--header-->
- <div class="contents">
- <p><code>#include <<a class="el" href="_job_system_8h_source.html">JobSystem.h</a>></code></p>
- <div class="dynheader">
- Inheritance diagram for JobSystem:</div>
- <div class="dyncontent">
- <div class="center">
- <img src="class_job_system.png" usemap="#JobSystem_map" alt=""/>
- <map id="JobSystem_map" name="JobSystem_map">
- <area href="class_non_copyable.html" title="Class that makes another class non-copyable. Usage: Inherit from NonCopyable." alt="NonCopyable" shape="rect" coords="86,0,248,24"/>
- <area href="class_job_system_single_threaded.html" title="Implementation of a JobSystem without threads, runs jobs as soon as they are added." alt="JobSystemSingleThreaded" shape="rect" coords="0,112,162,136"/>
- <area href="class_job_system_with_barrier.html" alt="JobSystemWithBarrier" shape="rect" coords="172,112,334,136"/>
- <area href="class_job_system_thread_pool.html" alt="JobSystemThreadPool" shape="rect" coords="172,168,334,192"/>
- </map>
- </div></div>
- <table class="memberdecls">
- <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
- Classes</h2></td></tr>
- <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="class_job_system_1_1_barrier.html">Barrier</a></td></tr>
- <tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">A job barrier keeps track of a number of jobs and allows waiting until they are all completed. <a href="class_job_system_1_1_barrier.html#details">More...</a><br /></td></tr>
- <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
- <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="class_job_system_1_1_job.html">Job</a></td></tr>
- <tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">A class that contains information for a single unit of work. <a href="class_job_system_1_1_job.html#details">More...</a><br /></td></tr>
- <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
- <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="class_job_system_1_1_job_handle.html">JobHandle</a></td></tr>
- <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
- </table><table class="memberdecls">
- <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-types" name="pub-types"></a>
- Public Types</h2></td></tr>
- <tr class="memitem:ae31ef61a509934f03d4705aec19c61f5" id="r_ae31ef61a509934f03d4705aec19c61f5"><td class="memItemLeft" align="right" valign="top">using </td><td class="memItemRight" valign="bottom"><a class="el" href="#ae31ef61a509934f03d4705aec19c61f5">JobFunction</a> = function<void()></td></tr>
- <tr class="memdesc:ae31ef61a509934f03d4705aec19c61f5"><td class="mdescLeft"> </td><td class="mdescRight">Main function of the job. <br /></td></tr>
- <tr class="separator:ae31ef61a509934f03d4705aec19c61f5"><td class="memSeparator" colspan="2"> </td></tr>
- </table><table class="memberdecls">
- <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
- Public Member Functions</h2></td></tr>
- <tr class="memitem:aaaf28c0a93f2d52eb2c936807f9e8ec9" id="r_aaaf28c0a93f2d52eb2c936807f9e8ec9"><td class="memItemLeft" align="right" valign="top">virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="#aaaf28c0a93f2d52eb2c936807f9e8ec9">~JobSystem</a> ()=default</td></tr>
- <tr class="memdesc:aaaf28c0a93f2d52eb2c936807f9e8ec9"><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br /></td></tr>
- <tr class="separator:aaaf28c0a93f2d52eb2c936807f9e8ec9"><td class="memSeparator" colspan="2"> </td></tr>
- <tr class="memitem:a5953ad34be5c47e7896b87ac7409b7d7" id="r_a5953ad34be5c47e7896b87ac7409b7d7"><td class="memItemLeft" align="right" valign="top">virtual int </td><td class="memItemRight" valign="bottom"><a class="el" href="#a5953ad34be5c47e7896b87ac7409b7d7">GetMaxConcurrency</a> () const =0</td></tr>
- <tr class="memdesc:a5953ad34be5c47e7896b87ac7409b7d7"><td class="mdescLeft"> </td><td class="mdescRight">Get maximum number of concurrently executing jobs. <br /></td></tr>
- <tr class="separator:a5953ad34be5c47e7896b87ac7409b7d7"><td class="memSeparator" colspan="2"> </td></tr>
- <tr class="memitem:a0766c8acd5ed9ef0e6baf1c2b8f3c38b" id="r_a0766c8acd5ed9ef0e6baf1c2b8f3c38b"><td class="memItemLeft" align="right" valign="top">virtual <a class="el" href="class_job_system_1_1_job_handle.html">JobHandle</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#a0766c8acd5ed9ef0e6baf1c2b8f3c38b">CreateJob</a> (const char *inName, <a class="el" href="_color_8h.html#a3daf1ee578b30da1860ff132c70474b5">ColorArg</a> inColor, const <a class="el" href="#ae31ef61a509934f03d4705aec19c61f5">JobFunction</a> &inJobFunction, <a class="el" href="_core_8h.html#a8f95e75e58492e87412191fabadd8ca8">uint32</a> inNumDependencies=0)=0</td></tr>
- <tr class="separator:a0766c8acd5ed9ef0e6baf1c2b8f3c38b"><td class="memSeparator" colspan="2"> </td></tr>
- <tr class="memitem:a2bd7c3efdc8f934b728ee1787e0bd58e" id="r_a2bd7c3efdc8f934b728ee1787e0bd58e"><td class="memItemLeft" align="right" valign="top">virtual <a class="el" href="class_job_system_1_1_barrier.html">Barrier</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="#a2bd7c3efdc8f934b728ee1787e0bd58e">CreateBarrier</a> ()=0</td></tr>
- <tr class="memdesc:a2bd7c3efdc8f934b728ee1787e0bd58e"><td class="mdescLeft"> </td><td class="mdescRight">Create a new barrier, used to wait on jobs. <br /></td></tr>
- <tr class="separator:a2bd7c3efdc8f934b728ee1787e0bd58e"><td class="memSeparator" colspan="2"> </td></tr>
- <tr class="memitem:a51c615924cf4f8eefb8e3fbe72041373" id="r_a51c615924cf4f8eefb8e3fbe72041373"><td class="memItemLeft" align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="#a51c615924cf4f8eefb8e3fbe72041373">DestroyBarrier</a> (<a class="el" href="class_job_system_1_1_barrier.html">Barrier</a> *inBarrier)=0</td></tr>
- <tr class="memdesc:a51c615924cf4f8eefb8e3fbe72041373"><td class="mdescLeft"> </td><td class="mdescRight">Destroy a barrier when it is no longer used. The barrier should be empty at this point. <br /></td></tr>
- <tr class="separator:a51c615924cf4f8eefb8e3fbe72041373"><td class="memSeparator" colspan="2"> </td></tr>
- <tr class="memitem:a32e93cf0a95e8893978cf1ee92eb41d7" id="r_a32e93cf0a95e8893978cf1ee92eb41d7"><td class="memItemLeft" align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="#a32e93cf0a95e8893978cf1ee92eb41d7">WaitForJobs</a> (<a class="el" href="class_job_system_1_1_barrier.html">Barrier</a> *inBarrier)=0</td></tr>
- <tr class="memdesc:a32e93cf0a95e8893978cf1ee92eb41d7"><td class="mdescLeft"> </td><td class="mdescRight">Wait for a set of jobs to be finished, note that only 1 thread can be waiting on a barrier at a time. <br /></td></tr>
- <tr class="separator:a32e93cf0a95e8893978cf1ee92eb41d7"><td class="memSeparator" colspan="2"> </td></tr>
- <tr class="inherit_header pub_methods_class_non_copyable"><td colspan="2" onclick="javascript:dynsection.toggleInherit('pub_methods_class_non_copyable')"><img src="closed.png" alt="-"/> Public Member Functions inherited from <a class="el" href="class_non_copyable.html">NonCopyable</a></td></tr>
- <tr class="memitem:a809b6e4ade7ae32f6d248f2a3b783d45 inherit pub_methods_class_non_copyable" id="r_a809b6e4ade7ae32f6d248f2a3b783d45"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="class_non_copyable.html#a809b6e4ade7ae32f6d248f2a3b783d45">NonCopyable</a> ()=default</td></tr>
- <tr class="separator:a809b6e4ade7ae32f6d248f2a3b783d45 inherit pub_methods_class_non_copyable"><td class="memSeparator" colspan="2"> </td></tr>
- <tr class="memitem:a501d34ffcc34b30de6d541887a901057 inherit pub_methods_class_non_copyable" id="r_a501d34ffcc34b30de6d541887a901057"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="class_non_copyable.html#a501d34ffcc34b30de6d541887a901057">NonCopyable</a> (const <a class="el" href="class_non_copyable.html">NonCopyable</a> &)=delete</td></tr>
- <tr class="separator:a501d34ffcc34b30de6d541887a901057 inherit pub_methods_class_non_copyable"><td class="memSeparator" colspan="2"> </td></tr>
- <tr class="memitem:aaf9b12dcaae80c9d304df7a941d4e21f inherit pub_methods_class_non_copyable" id="r_aaf9b12dcaae80c9d304df7a941d4e21f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="class_non_copyable.html#aaf9b12dcaae80c9d304df7a941d4e21f">operator=</a> (const <a class="el" href="class_non_copyable.html">NonCopyable</a> &)=delete</td></tr>
- <tr class="separator:aaf9b12dcaae80c9d304df7a941d4e21f inherit pub_methods_class_non_copyable"><td class="memSeparator" colspan="2"> </td></tr>
- </table><table class="memberdecls">
- <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-methods" name="pro-methods"></a>
- Protected Member Functions</h2></td></tr>
- <tr class="memitem:ae6bae9c5725c2009c8e9a2d79f60cb40" id="r_ae6bae9c5725c2009c8e9a2d79f60cb40"><td class="memItemLeft" align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="#ae6bae9c5725c2009c8e9a2d79f60cb40">QueueJob</a> (<a class="el" href="class_job_system_1_1_job.html">Job</a> *inJob)=0</td></tr>
- <tr class="memdesc:ae6bae9c5725c2009c8e9a2d79f60cb40"><td class="mdescLeft"> </td><td class="mdescRight">Adds a job to the job queue. <br /></td></tr>
- <tr class="separator:ae6bae9c5725c2009c8e9a2d79f60cb40"><td class="memSeparator" colspan="2"> </td></tr>
- <tr class="memitem:a5820eef46d040e6ae17e51a828201118" id="r_a5820eef46d040e6ae17e51a828201118"><td class="memItemLeft" align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="#a5820eef46d040e6ae17e51a828201118">QueueJobs</a> (<a class="el" href="class_job_system_1_1_job.html">Job</a> **inJobs, <a class="el" href="_core_8h.html#a69aa29b598b851b0640aa225a9e5d61d">uint</a> inNumJobs)=0</td></tr>
- <tr class="memdesc:a5820eef46d040e6ae17e51a828201118"><td class="mdescLeft"> </td><td class="mdescRight">Adds a number of jobs at once to the job queue. <br /></td></tr>
- <tr class="separator:a5820eef46d040e6ae17e51a828201118"><td class="memSeparator" colspan="2"> </td></tr>
- <tr class="memitem:aa74329d956a01e3f2f219ea22bdc5097" id="r_aa74329d956a01e3f2f219ea22bdc5097"><td class="memItemLeft" align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="#aa74329d956a01e3f2f219ea22bdc5097">FreeJob</a> (<a class="el" href="class_job_system_1_1_job.html">Job</a> *inJob)=0</td></tr>
- <tr class="memdesc:aa74329d956a01e3f2f219ea22bdc5097"><td class="mdescLeft"> </td><td class="mdescRight">Frees a job. <br /></td></tr>
- <tr class="separator:aa74329d956a01e3f2f219ea22bdc5097"><td class="memSeparator" colspan="2"> </td></tr>
- </table>
- <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
- <div class="textblock"><p>A class that allows units of work (Jobs) to be scheduled across multiple threads. It allows dependencies between the jobs so that the jobs form a graph.</p>
- <p>The pattern for using this class is: </p><pre class="fragment">// Create job system
- JobSystem *job_system = new JobSystemThreadPool(...);
- // Create some jobs
- JobHandle second_job = job_system->CreateJob("SecondJob", Color::sRed, []() { ... }, 1); // Create a job with 1 dependency
- JobHandle first_job = job_system->CreateJob("FirstJob", Color::sGreen, [second_job]() { ....; second_job.RemoveDependency(); }, 0); // Job can start immediately, will start second job when it's done
- JobHandle third_job = job_system->CreateJob("ThirdJob", Color::sBlue, []() { ... }, 0); // This job can run immediately as well and can run in parallel to job 1 and 2
- // Add the jobs to the barrier so that we can execute them while we're waiting
- Barrier *barrier = job_system->CreateBarrier();
- barrier->AddJob(first_job);
- barrier->AddJob(second_job);
- barrier->AddJob(third_job);
- job_system->WaitForJobs(barrier);
- // Clean up
- job_system->DestroyBarrier(barrier);
- delete job_system;
- </pre><p>Jobs are guaranteed to be started in the order that their dependency counter becomes zero (in case they're scheduled on a background thread) or in the order they're added to the barrier (when dependency count is zero and when executing on the thread that calls WaitForJobs).</p>
- <p>If you want to implement your own job system, inherit from <a class="el" href="class_job_system.html">JobSystem</a> and implement:</p>
- <ul>
- <li><a class="el" href="#a5953ad34be5c47e7896b87ac7409b7d7" title="Get maximum number of concurrently executing jobs.">JobSystem::GetMaxConcurrency</a> - This should return the maximum number of jobs that can run in parallel.</li>
- <li><a class="el" href="#a0766c8acd5ed9ef0e6baf1c2b8f3c38b">JobSystem::CreateJob</a> - This should create a <a class="el" href="class_job_system_1_1_job.html" title="A class that contains information for a single unit of work.">Job</a> object and return it to the caller.</li>
- <li><a class="el" href="#aa74329d956a01e3f2f219ea22bdc5097" title="Frees a job.">JobSystem::FreeJob</a> - This should free the memory associated with the job object. It is called by the <a class="el" href="class_job_system_1_1_job.html" title="A class that contains information for a single unit of work.">Job</a> destructor when it is Release()-ed for the last time.</li>
- <li><a class="el" href="#ae6bae9c5725c2009c8e9a2d79f60cb40" title="Adds a job to the job queue.">JobSystem::QueueJob</a>/QueueJobs - These should store the job pointer in an internal queue to run immediately (dependencies are tracked internally, this function is called when the job can run). The <a class="el" href="class_job_system_1_1_job.html" title="A class that contains information for a single unit of work.">Job</a> objects are reference counted and are guaranteed to stay alive during the QueueJob(s) call. If you store the job in your own data structure you need to call AddRef() to take a reference. After the job has been executed you need to call Release() to release the reference. Make sure you no longer dereference the job pointer after calling Release().</li>
- </ul>
- <p><a class="el" href="class_job_system_1_1_barrier.html" title="A job barrier keeps track of a number of jobs and allows waiting until they are all completed.">JobSystem::Barrier</a> is used to track the completion of a set of jobs. Jobs will be created by other jobs and added to the barrier while it is being waited on. This means that you cannot create a dependency graph beforehand as the graph changes while jobs are running. Implement the following functions:</p>
- <ul>
- <li><a class="el" href="class_job_system_1_1_barrier.html#afcf8f345a7a19e1399c4899942ed49c4">Barrier::AddJob</a>/AddJobs - Add a job to the barrier, any call to WaitForJobs will now also wait for this job to complete. If you store the job in a data structure in the <a class="el" href="class_job_system_1_1_barrier.html" title="A job barrier keeps track of a number of jobs and allows waiting until they are all completed.">Barrier</a> you need to call AddRef() on the job to keep it alive and Release() after you're done with it.</li>
- <li><a class="el" href="class_job_system_1_1_barrier.html#ab76635eef3bb293a2bceb429192adb2a" title="Called by a Job to mark that it is finished.">Barrier::OnJobFinished</a> - This function is called when a job has finished executing, you can use this to track completion and remove the job from the list of jobs to wait on.</li>
- </ul>
- <p>The functions on <a class="el" href="class_job_system.html">JobSystem</a> that need to be implemented to support barriers are:</p>
- <ul>
- <li><a class="el" href="#a2bd7c3efdc8f934b728ee1787e0bd58e" title="Create a new barrier, used to wait on jobs.">JobSystem::CreateBarrier</a> - Create a new barrier.</li>
- <li><a class="el" href="#a51c615924cf4f8eefb8e3fbe72041373" title="Destroy a barrier when it is no longer used. The barrier should be empty at this point.">JobSystem::DestroyBarrier</a> - Destroy a barrier.</li>
- <li><a class="el" href="#a32e93cf0a95e8893978cf1ee92eb41d7" title="Wait for a set of jobs to be finished, note that only 1 thread can be waiting on a barrier at a time.">JobSystem::WaitForJobs</a> - This is the main function that is used to wait for all jobs that have been added to a <a class="el" href="class_job_system_1_1_barrier.html" title="A job barrier keeps track of a number of jobs and allows waiting until they are all completed.">Barrier</a>. WaitForJobs can execute jobs that have been added to the barrier while waiting. It is not wise to execute other jobs that touch physics structures as this can cause race conditions and deadlocks. Please keep in mind that the barrier is only intended to wait on the completion of the Jolt jobs added to it, if you scheduled any jobs in your engine's job system to execute the Jolt jobs as part of QueueJob/QueueJobs, you might still need to wait for these in this function after the barrier is finished waiting.</li>
- </ul>
- <p>An example implementation is <a class="el" href="class_job_system_thread_pool.html">JobSystemThreadPool</a>. If you don't want to write the <a class="el" href="class_job_system_1_1_barrier.html" title="A job barrier keeps track of a number of jobs and allows waiting until they are all completed.">Barrier</a> class you can also inherit from <a class="el" href="class_job_system_with_barrier.html">JobSystemWithBarrier</a>. </p>
- </div><h2 class="groupheader">Member Typedef Documentation</h2>
- <a id="ae31ef61a509934f03d4705aec19c61f5" name="ae31ef61a509934f03d4705aec19c61f5"></a>
- <h2 class="memtitle"><span class="permalink"><a href="#ae31ef61a509934f03d4705aec19c61f5">◆ </a></span>JobFunction</h2>
- <div class="memitem">
- <div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">using <a class="el" href="#ae31ef61a509934f03d4705aec19c61f5">JobSystem::JobFunction</a> = function<void()></td>
- </tr>
- </table>
- </div><div class="memdoc">
- <p>Main function of the job. </p>
- </div>
- </div>
- <h2 class="groupheader">Constructor & Destructor Documentation</h2>
- <a id="aaaf28c0a93f2d52eb2c936807f9e8ec9" name="aaaf28c0a93f2d52eb2c936807f9e8ec9"></a>
- <h2 class="memtitle"><span class="permalink"><a href="#aaaf28c0a93f2d52eb2c936807f9e8ec9">◆ </a></span>~JobSystem()</h2>
- <div class="memitem">
- <div class="memproto">
- <table class="mlabels">
- <tr>
- <td class="mlabels-left">
- <table class="memname">
- <tr>
- <td class="memname">virtual JobSystem::~JobSystem </td>
- <td>(</td>
- <td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
- <td></td>
- </tr>
- </table>
- </td>
- <td class="mlabels-right">
- <span class="mlabels"><span class="mlabel">virtual</span><span class="mlabel">default</span></span> </td>
- </tr>
- </table>
- </div><div class="memdoc">
- <p>Destructor. </p>
- </div>
- </div>
- <h2 class="groupheader">Member Function Documentation</h2>
- <a id="a2bd7c3efdc8f934b728ee1787e0bd58e" name="a2bd7c3efdc8f934b728ee1787e0bd58e"></a>
- <h2 class="memtitle"><span class="permalink"><a href="#a2bd7c3efdc8f934b728ee1787e0bd58e">◆ </a></span>CreateBarrier()</h2>
- <div class="memitem">
- <div class="memproto">
- <table class="mlabels">
- <tr>
- <td class="mlabels-left">
- <table class="memname">
- <tr>
- <td class="memname">virtual <a class="el" href="class_job_system_1_1_barrier.html">Barrier</a> * JobSystem::CreateBarrier </td>
- <td>(</td>
- <td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
- <td></td>
- </tr>
- </table>
- </td>
- <td class="mlabels-right">
- <span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
- </tr>
- </table>
- </div><div class="memdoc">
- <p>Create a new barrier, used to wait on jobs. </p>
- <p>Implemented in <a class="el" href="class_job_system_single_threaded.html#ade901f3e457e5f60b071388bc6557778">JobSystemSingleThreaded</a>, and <a class="el" href="class_job_system_with_barrier.html#a19401113c3246594dd83bc4563823ec5">JobSystemWithBarrier</a>.</p>
- </div>
- </div>
- <a id="a0766c8acd5ed9ef0e6baf1c2b8f3c38b" name="a0766c8acd5ed9ef0e6baf1c2b8f3c38b"></a>
- <h2 class="memtitle"><span class="permalink"><a href="#a0766c8acd5ed9ef0e6baf1c2b8f3c38b">◆ </a></span>CreateJob()</h2>
- <div class="memitem">
- <div class="memproto">
- <table class="mlabels">
- <tr>
- <td class="mlabels-left">
- <table class="memname">
- <tr>
- <td class="memname">virtual <a class="el" href="class_job_system_1_1_job_handle.html">JobHandle</a> JobSystem::CreateJob </td>
- <td>(</td>
- <td class="paramtype">const char *</td> <td class="paramname"><span class="paramname"><em>inName</em></span>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="_color_8h.html#a3daf1ee578b30da1860ff132c70474b5">ColorArg</a></td> <td class="paramname"><span class="paramname"><em>inColor</em></span>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const <a class="el" href="#ae31ef61a509934f03d4705aec19c61f5">JobFunction</a> &</td> <td class="paramname"><span class="paramname"><em>inJobFunction</em></span>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="_core_8h.html#a8f95e75e58492e87412191fabadd8ca8">uint32</a></td> <td class="paramname"><span class="paramname"><em>inNumDependencies</em></span><span class="paramdefsep"> = </span><span class="paramdefval">0</span> )</td>
- </tr>
- </table>
- </td>
- <td class="mlabels-right">
- <span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
- </tr>
- </table>
- </div><div class="memdoc">
- <p>Create a new job, the job is started immediately if inNumDependencies == 0 otherwise it starts when RemoveDependency causes the dependency counter to reach 0. </p>
- <p>Implemented in <a class="el" href="class_job_system_single_threaded.html#ac183b901c9be0f04f21ff493cb5b2ec7">JobSystemSingleThreaded</a>, and <a class="el" href="class_job_system_thread_pool.html#aa345080efb7aec00011c102b37988fa3">JobSystemThreadPool</a>.</p>
- </div>
- </div>
- <a id="a51c615924cf4f8eefb8e3fbe72041373" name="a51c615924cf4f8eefb8e3fbe72041373"></a>
- <h2 class="memtitle"><span class="permalink"><a href="#a51c615924cf4f8eefb8e3fbe72041373">◆ </a></span>DestroyBarrier()</h2>
- <div class="memitem">
- <div class="memproto">
- <table class="mlabels">
- <tr>
- <td class="mlabels-left">
- <table class="memname">
- <tr>
- <td class="memname">virtual void JobSystem::DestroyBarrier </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="class_job_system_1_1_barrier.html">Barrier</a> *</td> <td class="paramname"><span class="paramname"><em>inBarrier</em></span></td><td>)</td>
- <td></td>
- </tr>
- </table>
- </td>
- <td class="mlabels-right">
- <span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
- </tr>
- </table>
- </div><div class="memdoc">
- <p>Destroy a barrier when it is no longer used. The barrier should be empty at this point. </p>
- <p>Implemented in <a class="el" href="class_job_system_single_threaded.html#a9333b0d4cb69ade4b4045b518c77a120">JobSystemSingleThreaded</a>, and <a class="el" href="class_job_system_with_barrier.html#a4827161974dbd03dff9c84424d75107e">JobSystemWithBarrier</a>.</p>
- </div>
- </div>
- <a id="aa74329d956a01e3f2f219ea22bdc5097" name="aa74329d956a01e3f2f219ea22bdc5097"></a>
- <h2 class="memtitle"><span class="permalink"><a href="#aa74329d956a01e3f2f219ea22bdc5097">◆ </a></span>FreeJob()</h2>
- <div class="memitem">
- <div class="memproto">
- <table class="mlabels">
- <tr>
- <td class="mlabels-left">
- <table class="memname">
- <tr>
- <td class="memname">virtual void JobSystem::FreeJob </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="class_job_system_1_1_job.html">Job</a> *</td> <td class="paramname"><span class="paramname"><em>inJob</em></span></td><td>)</td>
- <td></td>
- </tr>
- </table>
- </td>
- <td class="mlabels-right">
- <span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">pure virtual</span></span> </td>
- </tr>
- </table>
- </div><div class="memdoc">
- <p>Frees a job. </p>
- <p>Implemented in <a class="el" href="class_job_system_single_threaded.html#abb23fc08db8c653059c7ab32e44fd7fd">JobSystemSingleThreaded</a>, and <a class="el" href="class_job_system_thread_pool.html#af916eac26591613c671484a3b60ab047">JobSystemThreadPool</a>.</p>
- </div>
- </div>
- <a id="a5953ad34be5c47e7896b87ac7409b7d7" name="a5953ad34be5c47e7896b87ac7409b7d7"></a>
- <h2 class="memtitle"><span class="permalink"><a href="#a5953ad34be5c47e7896b87ac7409b7d7">◆ </a></span>GetMaxConcurrency()</h2>
- <div class="memitem">
- <div class="memproto">
- <table class="mlabels">
- <tr>
- <td class="mlabels-left">
- <table class="memname">
- <tr>
- <td class="memname">virtual int JobSystem::GetMaxConcurrency </td>
- <td>(</td>
- <td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
- <td> const</td>
- </tr>
- </table>
- </td>
- <td class="mlabels-right">
- <span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
- </tr>
- </table>
- </div><div class="memdoc">
- <p>Get maximum number of concurrently executing jobs. </p>
- <p>Implemented in <a class="el" href="class_job_system_single_threaded.html#a4e99aebfb2308cf3c4bdd8e54bb71799">JobSystemSingleThreaded</a>, and <a class="el" href="class_job_system_thread_pool.html#ad9d1ead2ffc5ab1ec9aa6e06948c98ac">JobSystemThreadPool</a>.</p>
- </div>
- </div>
- <a id="ae6bae9c5725c2009c8e9a2d79f60cb40" name="ae6bae9c5725c2009c8e9a2d79f60cb40"></a>
- <h2 class="memtitle"><span class="permalink"><a href="#ae6bae9c5725c2009c8e9a2d79f60cb40">◆ </a></span>QueueJob()</h2>
- <div class="memitem">
- <div class="memproto">
- <table class="mlabels">
- <tr>
- <td class="mlabels-left">
- <table class="memname">
- <tr>
- <td class="memname">virtual void JobSystem::QueueJob </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="class_job_system_1_1_job.html">Job</a> *</td> <td class="paramname"><span class="paramname"><em>inJob</em></span></td><td>)</td>
- <td></td>
- </tr>
- </table>
- </td>
- <td class="mlabels-right">
- <span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">pure virtual</span></span> </td>
- </tr>
- </table>
- </div><div class="memdoc">
- <p>Adds a job to the job queue. </p>
- <p>Implemented in <a class="el" href="class_job_system_single_threaded.html#ac3eead674dbe8a93398dcbc13b324da5">JobSystemSingleThreaded</a>, and <a class="el" href="class_job_system_thread_pool.html#ab915a93f53fed71c48afb2fdf0d40910">JobSystemThreadPool</a>.</p>
- </div>
- </div>
- <a id="a5820eef46d040e6ae17e51a828201118" name="a5820eef46d040e6ae17e51a828201118"></a>
- <h2 class="memtitle"><span class="permalink"><a href="#a5820eef46d040e6ae17e51a828201118">◆ </a></span>QueueJobs()</h2>
- <div class="memitem">
- <div class="memproto">
- <table class="mlabels">
- <tr>
- <td class="mlabels-left">
- <table class="memname">
- <tr>
- <td class="memname">virtual void JobSystem::QueueJobs </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="class_job_system_1_1_job.html">Job</a> **</td> <td class="paramname"><span class="paramname"><em>inJobs</em></span>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="_core_8h.html#a69aa29b598b851b0640aa225a9e5d61d">uint</a></td> <td class="paramname"><span class="paramname"><em>inNumJobs</em></span> )</td>
- </tr>
- </table>
- </td>
- <td class="mlabels-right">
- <span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">pure virtual</span></span> </td>
- </tr>
- </table>
- </div><div class="memdoc">
- <p>Adds a number of jobs at once to the job queue. </p>
- <p>Implemented in <a class="el" href="class_job_system_single_threaded.html#a1581f359dde3922b6b3f973ec78c73df">JobSystemSingleThreaded</a>, and <a class="el" href="class_job_system_thread_pool.html#a60fe80b85a7711b87c51983d5fb5eb4a">JobSystemThreadPool</a>.</p>
- </div>
- </div>
- <a id="a32e93cf0a95e8893978cf1ee92eb41d7" name="a32e93cf0a95e8893978cf1ee92eb41d7"></a>
- <h2 class="memtitle"><span class="permalink"><a href="#a32e93cf0a95e8893978cf1ee92eb41d7">◆ </a></span>WaitForJobs()</h2>
- <div class="memitem">
- <div class="memproto">
- <table class="mlabels">
- <tr>
- <td class="mlabels-left">
- <table class="memname">
- <tr>
- <td class="memname">virtual void JobSystem::WaitForJobs </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="class_job_system_1_1_barrier.html">Barrier</a> *</td> <td class="paramname"><span class="paramname"><em>inBarrier</em></span></td><td>)</td>
- <td></td>
- </tr>
- </table>
- </td>
- <td class="mlabels-right">
- <span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
- </tr>
- </table>
- </div><div class="memdoc">
- <p>Wait for a set of jobs to be finished, note that only 1 thread can be waiting on a barrier at a time. </p>
- <p>Implemented in <a class="el" href="class_job_system_single_threaded.html#aa491ca6999f7f2285a79b114b696e6ac">JobSystemSingleThreaded</a>, and <a class="el" href="class_job_system_with_barrier.html#af33b27708e9ab2b343a0658cf14efe56">JobSystemWithBarrier</a>.</p>
- </div>
- </div>
- <hr/>The documentation for this class was generated from the following file:<ul>
- <li>Jolt/Core/<a class="el" href="_job_system_8h_source.html">JobSystem.h</a></li>
- </ul>
- </div><!-- contents -->
- </div><!-- doc-content -->
- <!-- start footer part -->
- <div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
- <ul>
- <li class="navelem"><a class="el" href="class_job_system.html">JobSystem</a></li>
- <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
- </ul>
- </div>
- </body>
- </html>
|