public void testGetItem() {
    {
      PSI psi = st.getStackItem("group1", "item1", "context");
      assertNotNull(psi);
      assertEquals("group1", psi.getGroup());
      assertEquals("item1", psi.getItem());
      assertEquals(m_timer.getTimeMillis(0), psi.getCreationTime());

      psi.close();

      TestItem item = getItem("group1", "item1");
      assertNotNull(item);
      assertEquals(m_timer.getTimeMillis(1) - m_timer.getTimeMillis(0), item.getTotalTime());
      assertEquals(0L, item.getChildsTime());
    }
    int tID = m_timer.currentTimerId();
    {
      PSI psi1 = st.getStackItem("g1", "i1");
      PSI psi2 = st.getStackItem("g1", "i2");
      psi2.close();
      assertEquals(
          m_timer.getTimeMillis(tID + 2) - m_timer.getTimeMillis(tID + 1), psi1.getChildsTime());
      psi1.close();
      assertEquals(
          m_timer.getTimeMillis(tID + 3) - m_timer.getTimeMillis(tID),
          getItem("g1", "i1").getTotalTime());
      assertEquals(
          m_timer.getTimeMillis(tID + 2) - m_timer.getTimeMillis(tID + 1),
          getItem("g1", "i1").getChildsTime());
    }
  }
    public void release(PSI psi) throws EWrongPSI {
      long totalTime;
      boolean bInner;
      synchronized (m_profiler) {
        PSI e = m_stack.pop();
        if (psi.getStackNumber() != e.getStackNumber()) {
          ApiAlgs.getLog(this)
              .error(
                  psi.getGroup() + "." + psi.getItem() + " / " + e.getGroup() + "." + e.getItem());
          while (psi.getStackNumber() < e.getStackNumber()) e = m_stack.pop();
        }

        totalTime = m_timer.get() - psi.getCreationTime();

        if (!m_stack.isEmpty()) {
          PSI parent = m_stack.peek();
          parent.addChildTime(totalTime);
        }
        bInner = stackContainsItem(psi);
      }
      m_profiler.reportItem(psi.getGroup(), psi.getItem(), totalTime, psi.getChildsTime(), bInner);
    }