Skip to content

Commit 8396834

Browse files
committed
delay evaluation of chunk exec queue if R is executing code
1 parent c859833 commit 8396834

File tree

6 files changed

+88
-11
lines changed

6 files changed

+88
-11
lines changed

src/cpp/session/modules/rmarkdown/SessionRMarkdown.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ namespace session {
6363

6464
namespace {
6565

66+
enum
67+
{
68+
RExecutionReady = 0,
69+
RExecutionBusy = 1
70+
};
71+
6672
std::string projectBuildDir()
6773
{
6874
return string_utils::utf8ToSystem(
@@ -1186,7 +1192,7 @@ Error getRmdTemplate(const json::JsonRpcRequest& request,
11861192

11871193

11881194
Error prepareForRmdChunkExecution(const json::JsonRpcRequest& request,
1189-
json::JsonRpcResponse*)
1195+
json::JsonRpcResponse* pResponse)
11901196
{
11911197
// read id param
11921198
std::string id;
@@ -1216,6 +1222,13 @@ Error prepareForRmdChunkExecution(const json::JsonRpcRequest& request,
12161222
}
12171223
}
12181224

1225+
// indicate to the client whether R currently has executing code on the
1226+
// stack
1227+
json::Object result;
1228+
result["state"] = r::getGlobalContext()->nextcontext == NULL ?
1229+
RExecutionReady : RExecutionBusy;
1230+
pResponse->setResult(result);
1231+
12191232
return Success();
12201233
}
12211234

src/gwt/src/org/rstudio/studio/client/rmarkdown/model/RMarkdownServerOperations.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void getRmdTemplate(String templatePath,
6565
public String getFileUrl(FileSystemItem file);
6666

6767
void prepareForRmdChunkExecution(String id,
68-
ServerRequestCallback<Void> requestCallback);
68+
ServerRequestCallback<RmdExecutionState> requestCallback);
6969

7070
void getRmdOutputInfo(String target,
7171
ServerRequestCallback<RmdOutputInfo> resultCallback);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* RmdExecutionState.java
3+
*
4+
* Copyright (C) 2009-15 by RStudio, Inc.
5+
*
6+
* Unless you have received this program directly from RStudio pursuant
7+
* to the terms of a commercial license agreement with RStudio, then
8+
* this program is licensed to you under the terms of version 3 of the
9+
* GNU Affero General Public License. This program is distributed WITHOUT
10+
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
11+
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
12+
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
13+
*
14+
*/
15+
package org.rstudio.studio.client.rmarkdown.model;
16+
17+
import com.google.gwt.core.client.JavaScriptObject;
18+
19+
public class RmdExecutionState extends JavaScriptObject
20+
{
21+
protected RmdExecutionState()
22+
{
23+
}
24+
25+
public final native int getState() /*-{
26+
return this.state;
27+
}-*/;
28+
29+
public static final int STATE_READY = 0;
30+
public static final int STATE_BUSY = 1;
31+
}

src/gwt/src/org/rstudio/studio/client/server/remote/RemoteServer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
import org.rstudio.studio.client.rmarkdown.model.RMarkdownContext;
9999
import org.rstudio.studio.client.rmarkdown.model.RmdChunkOptions;
100100
import org.rstudio.studio.client.rmarkdown.model.RmdCreatedTemplate;
101+
import org.rstudio.studio.client.rmarkdown.model.RmdExecutionState;
101102
import org.rstudio.studio.client.rmarkdown.model.RmdOutputInfo;
102103
import org.rstudio.studio.client.rmarkdown.model.RmdTemplateContent;
103104
import org.rstudio.studio.client.rmarkdown.model.RmdYamlData;
@@ -4190,8 +4191,8 @@ public void getRmdTemplate(String templatePath,
41904191

41914192
@Override
41924193
public void prepareForRmdChunkExecution(
4193-
String id,
4194-
ServerRequestCallback<Void> requestCallback)
4194+
String id,
4195+
ServerRequestCallback<RmdExecutionState> requestCallback)
41954196
{
41964197
sendRequest(RPC_SCOPE,
41974198
"prepare_for_rmd_chunk_execution",

src/gwt/src/org/rstudio/studio/client/workbench/views/source/editors/text/TextEditingTargetRMarkdownHelper.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.rstudio.studio.client.rmarkdown.model.RMarkdownServerOperations;
5555
import org.rstudio.studio.client.rmarkdown.model.RmdChosenTemplate;
5656
import org.rstudio.studio.client.rmarkdown.model.RmdCreatedTemplate;
57+
import org.rstudio.studio.client.rmarkdown.model.RmdExecutionState;
5758
import org.rstudio.studio.client.rmarkdown.model.RmdFrontMatter;
5859
import org.rstudio.studio.client.rmarkdown.model.RmdFrontMatterOutputOptions;
5960
import org.rstudio.studio.client.rmarkdown.model.RmdOutputFormat;
@@ -68,7 +69,6 @@
6869
import org.rstudio.studio.client.server.ServerError;
6970
import org.rstudio.studio.client.server.ServerRequestCallback;
7071
import org.rstudio.studio.client.server.Void;
71-
import org.rstudio.studio.client.server.VoidServerRequestCallback;
7272
import org.rstudio.studio.client.workbench.WorkbenchContext;
7373
import org.rstudio.studio.client.workbench.model.Session;
7474
import org.rstudio.studio.client.workbench.prefs.model.UIPrefs;
@@ -330,13 +330,19 @@ public void prepareForRmdChunkExecution(String id,
330330
if (useRMarkdownV2(contents))
331331
{
332332
server_.prepareForRmdChunkExecution(id,
333-
new VoidServerRequestCallback() {
334-
333+
new ServerRequestCallback<RmdExecutionState>()
334+
{
335335
@Override
336-
protected void onCompleted()
336+
public void onResponseReceived(RmdExecutionState state)
337337
{
338338
onExecuteChunk.execute();
339339
}
340+
341+
@Override
342+
public void onError(ServerError error)
343+
{
344+
Debug.logError(error);
345+
}
340346
});
341347
}
342348
else

src/gwt/src/org/rstudio/studio/client/workbench/views/source/editors/text/rmd/TextEditingTargetNotebook.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.rstudio.studio.client.application.events.RestartStatusEvent;
3434
import org.rstudio.studio.client.common.FilePathUtils;
3535
import org.rstudio.studio.client.common.GlobalDisplay;
36+
import org.rstudio.studio.client.common.Value;
3637
import org.rstudio.studio.client.common.dependencies.DependencyManager;
3738
import org.rstudio.studio.client.common.dependencies.model.Dependency;
3839
import org.rstudio.studio.client.rmarkdown.RmdOutput;
@@ -45,6 +46,7 @@
4546
import org.rstudio.studio.client.rmarkdown.model.RmdChunkOptions;
4647
import org.rstudio.studio.client.rmarkdown.model.RmdChunkOutput;
4748
import org.rstudio.studio.client.rmarkdown.model.RmdChunkOutputUnit;
49+
import org.rstudio.studio.client.rmarkdown.model.RmdExecutionState;
4850
import org.rstudio.studio.client.server.ServerError;
4951
import org.rstudio.studio.client.server.ServerRequestCallback;
5052
import org.rstudio.studio.client.server.VoidServerRequestCallback;
@@ -54,6 +56,8 @@
5456
import org.rstudio.studio.client.workbench.prefs.model.UIPrefs;
5557
import org.rstudio.studio.client.workbench.views.console.ConsoleResources;
5658
import org.rstudio.studio.client.workbench.views.console.events.ConsoleHistoryAddedEvent;
59+
import org.rstudio.studio.client.workbench.views.console.events.ConsolePromptEvent;
60+
import org.rstudio.studio.client.workbench.views.console.events.ConsolePromptHandler;
5761
import org.rstudio.studio.client.workbench.views.console.events.ConsoleWriteInputEvent;
5862
import org.rstudio.studio.client.workbench.views.console.events.ConsoleWriteInputHandler;
5963
import org.rstudio.studio.client.workbench.views.console.model.ConsoleServerOperations;
@@ -520,12 +524,34 @@ public void execute()
520524
public void execute()
521525
{
522526
server_.prepareForRmdChunkExecution(docUpdateSentinel_.getId(),
523-
new ServerRequestCallback<Void>()
527+
new ServerRequestCallback<RmdExecutionState>()
524528
{
525529
@Override
526-
public void onResponseReceived(Void v)
530+
public void onResponseReceived(RmdExecutionState state)
527531
{
528-
completeEval.execute();
532+
if (state.getState() == RmdExecutionState.STATE_BUSY)
533+
{
534+
// if R has code on the stack, wait for the next console
535+
// prompt
536+
final Value<HandlerRegistration> handler =
537+
new Value<HandlerRegistration>(null);
538+
handler.setValue(events_.addHandler(
539+
ConsolePromptEvent.TYPE,
540+
new ConsolePromptHandler()
541+
{
542+
@Override
543+
public void onConsolePrompt(
544+
ConsolePromptEvent event)
545+
{
546+
handler.getValue().removeHandler();
547+
completeEval.execute();
548+
}
549+
}));
550+
}
551+
else
552+
{
553+
completeEval.execute();
554+
}
529555
}
530556

531557
@Override

0 commit comments

Comments
 (0)