<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
Hi Matthieu,</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
Thanks for the question! </div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
ABT_mutex -> Yes, it's internally just a pointer (more specifically, a handle), so you can copy it.<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
ABT_mutex_memory -> No, it saves it states in this memory (directly used as ABTI_mutex), so if you copy it, you basically corrupt the ABT_mutex structure.</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<a href="https://github.com/pmodels/argobots/blob/main/src/include/abt.h.in#L1114-L1115">https://github.com/pmodels/argobots/blob/main/src/include/abt.h.in#L1114-L1115</a><br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
The same thing goes to ABT_cond_memory: do not move <span style="background-color:rgb(255, 255, 255);display:inline !important">ABT_cond_memory around.</span></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<span style="margin:0px;font-size:12pt"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important">// Example (THE FOLLOWING IS FORBIDDEN)</span></span>
<div style="margin:0px;font-size:12pt"><span style="margin:0px">ABT_mutex_memory m1 = ABT_MUTEX_INITIALIZER;</span></div>
<div style="margin:0px;font-size:12pt"><span style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important">ABT_mutex_lock(ABT_MUTEX_MEMORY_GET_HANDLE(&m1));<br>
</span></span></div>
<div style="margin:0px;font-size:12pt"><span style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important">ABT_mutex_memory m2;</span></span></div>
<div style="margin:0px;font-size:12pt"><span style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important">memcpy(&m2, &m1, sizeof(<span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important">ABT_mutex_memory</span>));</span><br>
</span></div>
<div style="margin:0px;font-size:12pt"><span style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important"><span style="margin:0px"><span style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important">//
 m2 is locked since m1 is locked. The mutex "entity" is copied, so even if you unlock m2, m1 is not unlocked.</span><br>
</span></span></span></span></span></div>
<div style="margin:0px;font-size:12pt"><span style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important"><span style="margin:0px"><span style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important">//
 It can cause something even worse since this mutex entity may store the waiters or even a pointer to its own memory.</span></span></span></span></span></span></div>
<div style="margin:0px;font-size:12pt"><span style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important"><span style="margin:0px"><span style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important">//
 Do not use <span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important">ABT_mutex_memory<span style="margin:0px"> in this way.</span></span></span></span></span></span></span></span></div>
<div style="margin:0px;font-size:12pt"><span style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important"><span style="margin:0px"><span style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255);display:inline !important">ABT_mutex_lock(ABT_MUTEX_MEMORY_GET_HANDLE(&m2));</span></span></span></span></span></div>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
In your case, reallocation on resizing std::vector can break the mutex data (even if ABT_mutex_memory is somehow
<span style="background-color:rgb(255, 255, 255);display:inline !important">moved </span>"uniquely" ).</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
Please dynamically allocate each ABT_mutex_memory individually <span style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt;">(</span><span style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt;">std::vector<ABT_mutex_memory
 *></span><span style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt;">).</span></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<span style="color:rgb(0,0,0); font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt"><span style="background-color:rgb(255,255,255); display:inline!important">Thanks,</span></span></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<span style="color:rgb(0,0,0); font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt"><span style="background-color:rgb(255,255,255); display:inline!important">Shintaro</span></span></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<span style="color:rgb(0,0,0); font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt"><span style="background-color:rgb(255,255,255); display:inline!important"><br>
</span></span></div>
<div id="appendonsend"></div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Dorier, Matthieu via discuss <discuss@lists.argobots.org><br>
<b>Sent:</b> Tuesday, June 15, 2021 7:04 AM<br>
<b>To:</b> discuss@argobots.org <discuss@argobots.org><br>
<b>Cc:</b> Dorier, Matthieu <mdorier@anl.gov><br>
<b>Subject:</b> [argobots-discuss] Can I move a static mutex around in memory?</font>
<div> </div>
</div>
<div lang="EN-GB" style="word-wrap:break-word">
<div class="x_WordSection1">
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span lang="EN-US" style="font-size:11.0pt">Hi,</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span lang="EN-US" style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span lang="EN-US" style="font-size:11.0pt">I would like to understand statically initialized mutex and condition variables better, in particular: can I move them around in memory (assuming all the ULTs in my code have a consistent way of locating them)?</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span lang="EN-US" style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span lang="EN-US" style="font-size:11.0pt">This would come up in C++ containers, for instance:</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span lang="EN-US" style="font-size:11.0pt">std::vector<</span><span style="font-size:11.0pt">ABT_mutex_memory>
</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span style="font-size:11.0pt">If I increase the size of the vector, reallocation may take place, and the existing mutexes will be moved somewhere else in memory. Assuming all the ULTs are accessing them by their index in the vector rather than by an ABT_mutex
 opaque pointer, then this should be fine as long as I am allowed to move ABT_mutex_memory around (regardless of their state). Is that the case?</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span style="font-size:11.0pt">Same question for condition variables?</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span style="font-size:11.0pt">Thanks,</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span style="font-size:11.0pt">Matthieu</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin: 0cm; font-size: 12pt; font-family: Calibri, sans-serif;">
<span lang="EN-US" style="font-size:11.0pt"> </span></p>
</div>
</div>
</body>
</html>