mirror of https://github.com/BOINC/boinc.git
Mgr: Fix 2 async GUI RPCs, also hoping to fix memory leak.
svn path=/trunk/boinc/; revision=16091
This commit is contained in:
parent
30aecfc6f8
commit
7a9468edbb
|
@ -7842,3 +7842,17 @@ David 29 Sept 2008
|
|||
lib/
|
||||
common_defs.h
|
||||
procinfo_unix.cpp
|
||||
|
||||
Charlie 29 Sep 2008
|
||||
Mgr: Fix async GUI RPC handling of RPC_GET_PROJECT_STATUS1 and
|
||||
RPC_GET_SIMPLE_GUI_INFO2, both of which must replace project
|
||||
structs in the state struct in place. We hope this will
|
||||
also fix a memory leak.
|
||||
Mgr: Fix XCode project for browser.C files renamed to browser.cpp.
|
||||
|
||||
clientgui/
|
||||
AsyncRPC.cpp,.h
|
||||
MainDocument.cpp,.h
|
||||
mac_build/
|
||||
boinc.xcodeproj/
|
||||
project.pbxproj
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "MainDocument.h"
|
||||
#include "AsyncRPC.h"
|
||||
#include "BOINCBaseFrame.h"
|
||||
#include "error_numbers.h"
|
||||
|
||||
|
||||
// Delay in milliseconds before showing AsyncRPCDlg
|
||||
|
@ -195,26 +196,13 @@ int RPCThread::ProcessRPCRequest() {
|
|||
retval = (m_Doc->rpcClient).get_simple_gui_info(*(SIMPLE_GUI_INFO*)(current_request->arg1));
|
||||
break;
|
||||
case RPC_GET_SIMPLE_GUI_INFO2:
|
||||
retval = (m_Doc->rpcClient).get_simple_gui_info(
|
||||
*(CC_STATE*)(current_request->arg1),
|
||||
*(RESULTS*)(current_request->arg2)
|
||||
);
|
||||
// RPC_GET_SIMPLE_GUI_INFO2 is equivalent to doing both
|
||||
// RPC_GET_PROJECT_STATUS1 and RPC_GET_RESULTS
|
||||
retval = (m_Doc->rpcClient).get_project_status(*(PROJECTS*)(current_request->arg1));
|
||||
retval = (m_Doc->rpcClient).get_results(*(RESULTS*)(current_request->arg3));
|
||||
break;
|
||||
case RPC_GET_PROJECT_STATUS1:
|
||||
if (current_request->exchangeBuf) {
|
||||
|
||||
((CC_STATE*)(current_request->arg1))->projects.clear();
|
||||
|
||||
int n = (int)((CC_STATE*)(current_request->exchangeBuf))->projects.size();
|
||||
for (int i=0; i<n; i++) {
|
||||
PROJECT* p = new PROJECT();
|
||||
// get_project_status RPC needs master_url and will fill in everything else
|
||||
p->master_url = ((CC_STATE*)(current_request->exchangeBuf))->projects[i]->master_url;
|
||||
((CC_STATE*)(current_request->arg1))->projects.push_back(p);
|
||||
}
|
||||
|
||||
}
|
||||
retval = (m_Doc->rpcClient).get_project_status(*(CC_STATE*)(current_request->arg1));
|
||||
retval = (m_Doc->rpcClient).get_project_status(*(PROJECTS*)(current_request->arg1));
|
||||
break;
|
||||
case RPC_GET_PROJECT_STATUS2:
|
||||
retval = (m_Doc->rpcClient).get_project_status(*(PROJECTS*)(current_request->arg1));
|
||||
|
@ -595,13 +583,12 @@ void CMainDocument::HandleCompletedRPC() {
|
|||
|
||||
retval = current_rpc_request.retval;
|
||||
|
||||
if (current_rpc_request.completionTime) {
|
||||
*(current_rpc_request.completionTime) = wxDateTime::Now();
|
||||
if (current_rpc_request.rpcType == RPC_TYPE_ASYNC_WITH_REFRESH_AFTER) {
|
||||
if (!retval) {
|
||||
m_bNeedRefresh = true;
|
||||
}
|
||||
}
|
||||
if (current_rpc_request.resultPtr) {
|
||||
*(current_rpc_request.resultPtr) = retval;
|
||||
}
|
||||
|
||||
|
||||
// Post-processing
|
||||
if (! retval) {
|
||||
switch (current_rpc_request.which_rpc) {
|
||||
|
@ -634,22 +621,18 @@ void CMainDocument::HandleCompletedRPC() {
|
|||
}
|
||||
break;
|
||||
case RPC_GET_SIMPLE_GUI_INFO2:
|
||||
if (current_rpc_request.exchangeBuf && !retval) {
|
||||
CC_STATE* arg1 = (CC_STATE*)current_rpc_request.arg1;
|
||||
CC_STATE* exchangeBuf = (CC_STATE*)current_rpc_request.exchangeBuf;
|
||||
arg1->projects.swap(exchangeBuf->projects);
|
||||
if (!retval) {
|
||||
retval = CopyProjectsToStateFile(*(PROJECTS*)(current_rpc_request.arg1), *(CC_STATE*)(current_rpc_request.arg2));
|
||||
}
|
||||
if (current_rpc_request.arg3) {
|
||||
RESULTS* arg2 = (RESULTS*)current_rpc_request.arg2;
|
||||
if (current_rpc_request.exchangeBuf && !retval) {
|
||||
RESULTS* arg3 = (RESULTS*)current_rpc_request.arg3;
|
||||
arg2->results.swap(arg3->results);
|
||||
RESULTS* exchangeBuf = (RESULTS*)current_rpc_request.exchangeBuf;
|
||||
arg3->results.swap(exchangeBuf->results);
|
||||
}
|
||||
break;
|
||||
case RPC_GET_PROJECT_STATUS1:
|
||||
if (current_rpc_request.exchangeBuf && !retval) {
|
||||
CC_STATE* arg1 = (CC_STATE*)current_rpc_request.arg1;
|
||||
CC_STATE* exchangeBuf = (CC_STATE*)current_rpc_request.exchangeBuf;
|
||||
arg1->projects.swap(exchangeBuf->projects);
|
||||
if (!retval) {
|
||||
retval = CopyProjectsToStateFile(*(PROJECTS*)(current_rpc_request.arg1), *(CC_STATE*)(current_rpc_request.arg2));
|
||||
}
|
||||
break;
|
||||
case RPC_GET_ALL_PROJECTS_LIST:
|
||||
|
@ -716,12 +699,13 @@ void CMainDocument::HandleCompletedRPC() {
|
|||
}
|
||||
}
|
||||
|
||||
if (current_rpc_request.rpcType == RPC_TYPE_ASYNC_WITH_REFRESH_AFTER) {
|
||||
if (!retval) {
|
||||
m_bNeedRefresh = true;
|
||||
}
|
||||
if (current_rpc_request.completionTime) {
|
||||
*(current_rpc_request.completionTime) = wxDateTime::Now();
|
||||
}
|
||||
|
||||
if (current_rpc_request.resultPtr) {
|
||||
*(current_rpc_request.resultPtr) = retval;
|
||||
}
|
||||
|
||||
// We must call ProcessEvent() rather than AddPendingEvent() here to
|
||||
// guarantee integrity of data when other events are handled (such as
|
||||
// Abort, Suspend/Resume, Show Graphics, Update, Detach, Reset, No
|
||||
|
@ -776,6 +760,45 @@ void CMainDocument::HandleCompletedRPC() {
|
|||
}
|
||||
|
||||
|
||||
int CMainDocument::CopyProjectsToStateFile(PROJECTS& p, CC_STATE& state) {
|
||||
int retval = noErr;
|
||||
SET_LOCALE sl;
|
||||
unsigned int i;
|
||||
PROJECT* state_project = NULL;
|
||||
|
||||
// flag for delete
|
||||
for (i=0; i<state.projects.size(); i++) {
|
||||
state_project = state.projects[i];
|
||||
state_project->flag_for_delete = true;
|
||||
}
|
||||
|
||||
for (i=0; i<p.projects.size(); i++) {
|
||||
state_project = state.lookup_project(p.projects[i]->master_url);
|
||||
if (state_project && (p.projects[i]->master_url == state_project->master_url)) {
|
||||
// Because the CC_STATE contains several pointers to each element of the
|
||||
// CC_STATE::projects vector, we must update these elements in place.
|
||||
state_project->copy(*(p.projects[i]));
|
||||
state_project->flag_for_delete = false;
|
||||
} else {
|
||||
retval = ERR_NOT_FOUND;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Anything need to be deleted?
|
||||
if (!retval) {
|
||||
for (i=0; i<state.projects.size(); i++) {
|
||||
state_project = state.projects[i];
|
||||
if (state_project->flag_for_delete) {
|
||||
retval = ERR_FILE_MISSING;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
IMPLEMENT_CLASS(AsyncRPCDlg, wxDialog)
|
||||
|
||||
AsyncRPCDlg::AsyncRPCDlg() : wxDialog( NULL, wxID_ANY, wxT(""), wxDefaultPosition ) {
|
||||
|
|
|
@ -170,10 +170,10 @@ public:
|
|||
{ return RPC_Wait(RPC_GET_FILE_TRANSFERS, (void*)&arg1); }
|
||||
int get_simple_gui_info(SIMPLE_GUI_INFO& arg1)
|
||||
{ return RPC_Wait(RPC_GET_SIMPLE_GUI_INFO1, (void*)&arg1); }
|
||||
int get_simple_gui_info(CC_STATE& ccbuf, RESULTS& rbuf)
|
||||
{ return RPC_Wait(RPC_GET_SIMPLE_GUI_INFO2, (void*)&ccbuf, (void*)&rbuf); }
|
||||
int get_project_status(CC_STATE& arg1)
|
||||
{ return RPC_Wait(RPC_GET_PROJECT_STATUS1, (void*)&arg1); }
|
||||
int get_simple_gui_info(PROJECTS& arg1, CC_STATE& ccbuf, RESULTS& rbuf)
|
||||
{ return RPC_Wait(RPC_GET_SIMPLE_GUI_INFO2, (void*)&arg1, (void*)&ccbuf, (void*)&rbuf); }
|
||||
int get_project_status(PROJECTS& arg1, CC_STATE& arg2)
|
||||
{ return RPC_Wait(RPC_GET_PROJECT_STATUS1, (void*)&arg1, (void*)&arg2); }
|
||||
int get_project_status(PROJECTS& arg1)
|
||||
{ return RPC_Wait(RPC_GET_PROJECT_STATUS2, (void*)&arg1); }
|
||||
int get_all_projects_list(ALL_PROJECTS_LIST& arg1)
|
||||
|
|
|
@ -808,8 +808,8 @@ void CMainDocument::RunPeriodicRPCs() {
|
|||
if (ts.GetSeconds() > 0) {
|
||||
request.clear();
|
||||
request.which_rpc = RPC_GET_PROJECT_STATUS1;
|
||||
request.arg1 = &async_state_buf;
|
||||
request.exchangeBuf = &state;
|
||||
request.arg1 = &async_projects_update_buf;
|
||||
request.arg2 = &state;
|
||||
request.rpcType = RPC_TYPE_ASYNC_WITH_REFRESH_AFTER;
|
||||
request.completionTime = &m_dtProjecStatusTimestamp;
|
||||
request.resultPtr = &m_iGet_project_status1_rpc_result;
|
||||
|
@ -905,16 +905,15 @@ void CMainDocument::RunPeriodicRPCs() {
|
|||
}
|
||||
|
||||
// *********** GET_SIMPLE_GUI_INFO2 **************
|
||||
|
||||
if (currentTabView & VW_SGUI) {
|
||||
wxTimeSpan ts(dtNow - m_dtCachedSimpleGUITimestamp);
|
||||
if (ts.GetSeconds() > 0) {
|
||||
request.clear();
|
||||
request.which_rpc = RPC_GET_SIMPLE_GUI_INFO2;
|
||||
request.arg1 = &async_state_buf;
|
||||
request.exchangeBuf = &state;
|
||||
request.arg2 = &async_results_buf;
|
||||
request.arg3 = &results;
|
||||
request.arg1 = &async_projects_update_buf;
|
||||
request.arg2 = &state;
|
||||
request.arg3 = &async_results_buf;
|
||||
request.exchangeBuf = &results;
|
||||
request.rpcType = RPC_TYPE_ASYNC_WITH_REFRESH_AFTER;
|
||||
request.completionTime = &m_dtCachedSimpleGUITimestamp;
|
||||
request.resultPtr = &m_iGet_simple_gui2_rpc_result;
|
||||
|
@ -1066,7 +1065,7 @@ int CMainDocument::CachedProjectStatusUpdate(bool bForce) {
|
|||
|
||||
if (bForce) {
|
||||
m_dtProjecStatusTimestamp = wxDateTime::Now();
|
||||
m_iGet_project_status1_rpc_result = rpc.get_project_status(state);
|
||||
m_iGet_project_status1_rpc_result = rpc.get_project_status(async_projects_update_buf, state);
|
||||
}
|
||||
|
||||
if (m_iGet_project_status1_rpc_result) {
|
||||
|
@ -1939,7 +1938,7 @@ int CMainDocument::CachedSimpleGUIUpdate(bool bForce) {
|
|||
|
||||
if (bForce) {
|
||||
m_dtCachedSimpleGUITimestamp = wxDateTime::Now();
|
||||
m_iGet_simple_gui2_rpc_result = rpc.get_simple_gui_info(state, results);
|
||||
m_iGet_simple_gui2_rpc_result = rpc.get_simple_gui_info(async_projects_update_buf, state, results);
|
||||
}
|
||||
|
||||
if (m_iGet_simple_gui2_rpc_result) {
|
||||
|
|
|
@ -156,6 +156,8 @@ public:
|
|||
CBOINCClientManager* m_pClientManager;
|
||||
AsyncRPC rpc;
|
||||
RPC_CLIENT rpcClient;
|
||||
PROJECTS async_projects_update_buf;
|
||||
|
||||
CC_STATE state;
|
||||
CC_STATE async_state_buf;
|
||||
int m_iGet_state_rpc_result;
|
||||
|
@ -184,6 +186,7 @@ public:
|
|||
bool m_bNeedRefresh;
|
||||
|
||||
private:
|
||||
int CopyProjectsToStateFile(PROJECTS& p, CC_STATE& state);
|
||||
ASYNC_RPC_REQUEST current_rpc_request;
|
||||
AsyncRPCDlg* m_RPCWaitDlg;
|
||||
std::vector<ASYNC_RPC_REQUEST> RPC_requests;
|
||||
|
|
|
@ -164,7 +164,7 @@
|
|||
DD4C561A0AD389A2009E23C6 /* sg_ImageButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD4C560E0AD389A2009E23C6 /* sg_ImageButton.cpp */; };
|
||||
DD4C561C0AD389A2009E23C6 /* sg_ProgressBar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD4C56100AD389A2009E23C6 /* sg_ProgressBar.cpp */; };
|
||||
DD4C561E0AD389A2009E23C6 /* sg_SGUIListControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD4C56120AD389A2009E23C6 /* sg_SGUIListControl.cpp */; };
|
||||
DD4E704C0BCDAC360010A522 /* browser.C in Sources */ = {isa = PBXBuildFile; fileRef = DD4E70490BCDAC360010A522 /* browser.C */; };
|
||||
DD4E704C0BCDAC360010A522 /* browser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD4E70490BCDAC360010A522 /* browser.cpp */; };
|
||||
DD4EC65A08A0A7AF009AA08F /* gui_rpc_client_ops.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD73E34E08A0694000656EB1 /* gui_rpc_client_ops.cpp */; };
|
||||
DD4EC65B08A0A83F009AA08F /* gui_rpc_client_print.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD73E34F08A0694100656EB1 /* gui_rpc_client_print.cpp */; };
|
||||
DD51DC8F0A4943A300BD24E6 /* check_security.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD6617870A3FFD8C00FFEBEB /* check_security.cpp */; };
|
||||
|
@ -631,7 +631,7 @@
|
|||
DD4C56110AD389A2009E23C6 /* sg_ProgressBar.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = sg_ProgressBar.h; path = ../clientgui/sg_ProgressBar.h; sourceTree = SOURCE_ROOT; };
|
||||
DD4C56120AD389A2009E23C6 /* sg_SGUIListControl.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = sg_SGUIListControl.cpp; path = ../clientgui/sg_SGUIListControl.cpp; sourceTree = SOURCE_ROOT; };
|
||||
DD4C56130AD389A2009E23C6 /* sg_SGUIListControl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = sg_SGUIListControl.h; path = ../clientgui/sg_SGUIListControl.h; sourceTree = SOURCE_ROOT; };
|
||||
DD4E70490BCDAC360010A522 /* browser.C */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = browser.C; path = ../clientgui/browser.C; sourceTree = SOURCE_ROOT; };
|
||||
DD4E70490BCDAC360010A522 /* browser.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = browser.cpp; sourceTree = "<group>"; };
|
||||
DD4E704A0BCDAC360010A522 /* browser.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = browser.h; path = ../clientgui/browser.h; sourceTree = SOURCE_ROOT; };
|
||||
DD4EC60F08A0A083009AA08F /* texture.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = texture.cpp; sourceTree = "<group>"; };
|
||||
DD4EC61008A0A083009AA08F /* texture.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = texture.h; path = ../api/texture.h; sourceTree = SOURCE_ROOT; };
|
||||
|
@ -1184,7 +1184,7 @@
|
|||
DD81C40607C5D1020098A04D /* BOINCTaskCtrl.cpp */,
|
||||
DD81C43807C5D2240098A04D /* BOINCTaskCtrl.h */,
|
||||
DD58C43608F3347D00C1DF66 /* BOINCWizards.h */,
|
||||
DD4E70490BCDAC360010A522 /* browser.C */,
|
||||
DD4E70490BCDAC360010A522 /* browser.cpp */,
|
||||
DD4E704A0BCDAC360010A522 /* browser.h */,
|
||||
DDCE78220A70BD29008218B6 /* common */,
|
||||
DD58C43708F3347D00C1DF66 /* CompletionErrorPage.cpp */,
|
||||
|
@ -2284,7 +2284,7 @@
|
|||
DD7DD7C90B8BFD4800B11279 /* ViewMessages.cpp in Sources */,
|
||||
DD7BF7E60B8E7B6C00A009F7 /* str_util.cpp in Sources */,
|
||||
DD205A1A0BAF596E0008D473 /* ProjectListCtrl.cpp in Sources */,
|
||||
DD4E704C0BCDAC360010A522 /* browser.C in Sources */,
|
||||
DD4E704C0BCDAC360010A522 /* browser.cpp in Sources */,
|
||||
DDA6BD210BD4551F008F7921 /* mac_backtrace.cpp in Sources */,
|
||||
DDA6BD230BD4551F008F7921 /* QBacktrace.c in Sources */,
|
||||
DDA6BD250BD4551F008F7921 /* QCrashReport.c in Sources */,
|
||||
|
|
Loading…
Reference in New Issue