<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">W dniu 2013-11-26 13:26, Johny pisze:<br>
    </div>
    <blockquote cite="mid:52949383.1050507@wp.pl" type="cite">
      <meta http-equiv="content-type" content="text/html;
        charset=ISO-8859-1">
      Hello.<br>
      <br>
      I've found some bug with newest release of Torque 4.2.6.<br>
      <br>
      When compiled with options:<br>
      ./configure --with-default-server=### --with-rcp=/usr/bin/scp
      --enable-cpuset --enable-nvidia-gpus --enable-blcr
      --enable-geometry-requests --enable-unixsockets=no<br>
      <br>
      ...if just won't start (mom client), hanging during reading files
      /sys/devices/system/nodes/.../cpulist.<br>
      <br>
      The problem is in function:<br>
      /scr/resmom/linux/numa_node.cpp -&gt; void
      numa_node::parse_cpu_string()<br>
      There is a loop, parsing subsequent parts of string (this is line
      of text read from files mentioned above):<br>
      <br>
      LINE 121:<br>
      &nbsp; while (*ptr != '\0')<br>
      &nbsp;&nbsp;&nbsp; {<br>
      &nbsp;&nbsp;&nbsp; prev = strtol(ptr, &amp;ptr, 10);<br>
      <br>
      &nbsp;&nbsp;&nbsp; if (*ptr == '-')<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr++;<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curr = strtol(ptr, &amp;ptr, 10);<br>
      <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (prev &lt;= curr)<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
      #ifdef PENABLE_LINUX26_CPUSETS<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((MOMConfigUseSMT == 1) ||<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (is_physical_core(prev) == true))<br>
      #endif<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;cpu_indices.push_back(prev);<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;cpu_avail.push_back(true);<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;total_cpus++;<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;available_cpus++;<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
      <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prev++;<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
      <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (*ptr == ',')<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr++;<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
      &nbsp;&nbsp;&nbsp; else if ((*ptr == ',') ||<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*ptr == '\0'))<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
      #ifdef PENABLE_LINUX26_CPUSETS<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((MOMConfigUseSMT == 1) ||<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (is_physical_core(prev) == true))<br>
      #endif<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;cpu_indices.push_back(prev);<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;cpu_avail.push_back(true);<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;total_cpus++;<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;available_cpus++;<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
      <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr++;<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
      &nbsp;&nbsp;&nbsp; }<br>
      <br>
      This loop omits character '\0' ending the string: it enters second
      "if" (because *ptr == '\0') and then increments pointer which
      leads to pointer overflow.<br>
      Then... in subsequent iterations it just does nothing (because
      there are usually some rubbish data after '\0' and "strtol" cannot
      parse them so the pointer remains the same).<br>
      <div id="gt-res-content" class="almost_half_cell">
        <div dir="ltr" style="zoom:1"><span id="result_box"
            class="short_text" lang="en"><span class="hps"><br>
              To resolve this problem I've just added one line.<br>
              <br>
              Previous version:<br>
              161: }<br>
              162:<br>
              163:ptr++;<br>
              <br>
              I've hanged to:<br>
              161: }<br>
              162:<br>
              163: if(*ptr == '\n') break;<br>
              164: ptr++;<br>
              <br>
              Now, when it enters second if (when *ptr == '\0'), it
              saves data about the core and exits the loop.<br>
              Maybe there is more elegant way to do this but this is
              simple and just works (tested).<br>
              <br>
              Regards,<br>
              Peter.<br>
              <br>
            </span></span></div>
      </div>
      <br>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
torqueusers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:torqueusers@supercluster.org">torqueusers@supercluster.org</a>
<a class="moz-txt-link-freetext" href="http://www.supercluster.org/mailman/listinfo/torqueusers">http://www.supercluster.org/mailman/listinfo/torqueusers</a>
</pre>
    </blockquote>
    <br>
    My mistake.There of course should be: <br>
    <span id="result_box" class="short_text" lang="en"><span class="hps">I've
        hanged to:<br>
        161: }<br>
        162:<br>
        163: if(*ptr == '\0') break;<br>
        164: ptr++;<br>
        <br>
        Sorry, to much work today :(<br>
        <br>
        Regards,<br>
        Peter<br>
      </span></span>
  </body>
</html>