docs: public void free()
      {
          if (m_mapTasks != null)
          {
              while (m_mapTasks.size() > 0)
              {
                  for (Task task : m_mapTasks.keySet())
                  {
                      if (task != null)
                      {
                      	int iCount = 0;
                          while (task.isRunning())  // This will also remove this from the list
                          {
                          	if (iCount++ == 10)
                          	{
                                  Util.getLogger().warning("Shutting down a running task");   // Ignore and continue
                          		break;
                          	}
                          	try {
  								Thread.sleep(100);
  							} catch (InterruptedException e) {
  								e.printStackTrace();
  							}
                          }
                          this.removeTask(task);	// Make sure this doesn't free me (if all tasks are freed, app will be freed)
                          task.setApplication(null);
                          task.stopTask();
                      }
                      else
                      {
                          try {
                              RemoteTask remoteTask = m_mapTasks.remove(task);
                              if (remoteTask != null)
                                  remoteTask.freeRemoteSession();
                          } catch (RemoteException ex)    {
                              ex.printStackTrace();
                          }
                      }
                      break;  // YES, This only loops through the FIRST one, because it is removed and I would get a concurrent mod error
                  }
              }
          }
          m_mapTasks = null;
          if (m_PhysicalDatabaseParent instanceof Freeable)
          {
              ((Freeable)m_PhysicalDatabaseParent).free();
              m_PhysicalDatabaseParent = null;
          }
      }