Fixed crash in online user search (triggered when pressing ESC while the
search is being executed).
This commit is contained in:
parent
f549b729df
commit
586641120c
@ -366,7 +366,7 @@ namespace Online
|
|||||||
* search term.
|
* search term.
|
||||||
* \param search_string the string to search for.
|
* \param search_string the string to search for.
|
||||||
*/
|
*/
|
||||||
const XMLRequest*
|
XMLRequest*
|
||||||
CurrentUser::requestUserSearch(const core::stringw &search_string) const
|
CurrentUser::requestUserSearch(const core::stringw &search_string) const
|
||||||
{
|
{
|
||||||
assert(m_state == US_SIGNED_IN);
|
assert(m_state == US_SIGNED_IN);
|
||||||
|
@ -196,7 +196,7 @@ namespace Online
|
|||||||
const irr::core::stringw &new_password,
|
const irr::core::stringw &new_password,
|
||||||
const irr::core::stringw &new_password_ver) const;
|
const irr::core::stringw &new_password_ver) const;
|
||||||
|
|
||||||
const XMLRequest * requestUserSearch(const irr::core::stringw & search_string) const;
|
XMLRequest * requestUserSearch(const irr::core::stringw & search_string) const;
|
||||||
|
|
||||||
void onSTKQuit() const;
|
void onSTKQuit() const;
|
||||||
void onAchieving(uint32_t achievement_id) const;
|
void onAchieving(uint32_t achievement_id) const;
|
||||||
|
@ -66,15 +66,17 @@ namespace Online
|
|||||||
LEAK_CHECK()
|
LEAK_CHECK()
|
||||||
|
|
||||||
/** Type of the request. Has 0 as default value. */
|
/** Type of the request. Has 0 as default value. */
|
||||||
const int m_type;
|
const int m_type;
|
||||||
|
|
||||||
/** True if the memory for this Request should be managed by
|
/** True if the memory for this Request should be managed by
|
||||||
* http connector (i.e. this object is freed once the request
|
* http connector (i.e. this object is freed once the request
|
||||||
* is handled). Otherwise the memory is not freed, so it must
|
* is handled). Otherwise the memory is not freed, so it must
|
||||||
* be freed by the calling function. */
|
* be freed by the calling function. */
|
||||||
const bool m_manage_memory;
|
bool m_manage_memory;
|
||||||
|
|
||||||
/** The priority of this request. The higher the value the more
|
/** The priority of this request. The higher the value the more
|
||||||
important this request is. */
|
important this request is. */
|
||||||
const int m_priority;
|
const int m_priority;
|
||||||
|
|
||||||
/** The different state of the requst:
|
/** The different state of the requst:
|
||||||
* - S_PREPARING:\n The request is created and can be configured, it
|
* - S_PREPARING:\n The request is created and can be configured, it
|
||||||
@ -140,6 +142,11 @@ namespace Online
|
|||||||
* by network_http (i.e. freed once the request is handled). */
|
* by network_http (i.e. freed once the request is handled). */
|
||||||
bool manageMemory() const { return m_manage_memory; }
|
bool manageMemory() const { return m_manage_memory; }
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
/** Sets the memory management flag of this request. This function
|
||||||
|
* must only be called by the main thread, since it is only tested by
|
||||||
|
* the main thread. */
|
||||||
|
void setManageMemory(bool m) { m_manage_memory = m; }
|
||||||
|
// --------------------------------------------------------------------
|
||||||
/** Returns the priority of this request. */
|
/** Returns the priority of this request. */
|
||||||
int getPriority() const { return m_priority; }
|
int getPriority() const { return m_priority; }
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
@ -263,7 +263,7 @@ namespace Online
|
|||||||
else
|
else
|
||||||
request->setDone();
|
request->setDone();
|
||||||
}
|
}
|
||||||
}
|
} // handleResultQueue
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
/** Should be called every frame and takes care of processing the result
|
/** Should be called every frame and takes care of processing the result
|
||||||
|
@ -88,8 +88,46 @@ void OnlineUserSearch::init()
|
|||||||
*/
|
*/
|
||||||
void OnlineUserSearch::tearDown()
|
void OnlineUserSearch::tearDown()
|
||||||
{
|
{
|
||||||
delete m_search_request;
|
// The search request can be in one of three states:
|
||||||
m_search_request = NULL;
|
// 1. It does not exist, nothing more to do.
|
||||||
|
// 2. It has been executed by the request manager, had its callback done
|
||||||
|
// and waits for this widget to collect the results. In this case, the
|
||||||
|
// requests state is 'isDone', and the memory of this object need to be
|
||||||
|
// freed here.
|
||||||
|
// 3. It is being executed by the request manager thread. In this case the
|
||||||
|
// request can not be freed (since the request manager might still
|
||||||
|
// write to it). In this case we set the flag that the request manager
|
||||||
|
// should manage the memory for the request, i.e. the request will be
|
||||||
|
// deleted once it is in the request manager's ready queue.
|
||||||
|
// Note that there is no race condition here: setting a request to be
|
||||||
|
// 'done', and checking if its memory need to be freed is done by the
|
||||||
|
// main thread (i.e. the same thread that executes this function ). So it
|
||||||
|
// is not possible that the thread stage changes to be 'isDone' while
|
||||||
|
// this function executes, or that the request is checked if it should
|
||||||
|
// be freed.
|
||||||
|
|
||||||
|
if (m_search_request)
|
||||||
|
{
|
||||||
|
// Check if the request is ready (but its result have not been
|
||||||
|
// received here ... otherwise it would have been deleted).
|
||||||
|
if (m_search_request->isDone())
|
||||||
|
{
|
||||||
|
delete m_search_request;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// This request is currently being handled by the request manager.
|
||||||
|
// We can set the memory management flag, since the separate
|
||||||
|
// request manager thread does not read or write this flag.
|
||||||
|
// The actual deletion of the request is done by the main
|
||||||
|
// thread, so there is no risk that the request is deleted
|
||||||
|
// between the next two calls!!
|
||||||
|
m_search_request->setManageMemory(true);
|
||||||
|
|
||||||
|
// Set cancel flag to speed up cancellation of this request
|
||||||
|
m_search_request->cancel();
|
||||||
|
}
|
||||||
|
} // if m_search_request
|
||||||
} // tearDown
|
} // tearDown
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ private:
|
|||||||
Online::Profile::IDList m_users;
|
Online::Profile::IDList m_users;
|
||||||
|
|
||||||
/** The online request to search for users. */
|
/** The online request to search for users. */
|
||||||
const Online::XMLRequest * m_search_request;
|
Online::XMLRequest *m_search_request;
|
||||||
|
|
||||||
void parseResult(const XMLNode * input);
|
void parseResult(const XMLNode * input);
|
||||||
void showList();
|
void showList();
|
||||||
|
Loading…
Reference in New Issue
Block a user