@@ -243,25 +243,30 @@ void parse_eval_safe(void *data) {
243
243
nano_parse_eval_res = R_ParseEvalString ((const char * ) data , R_GlobalEnv );
244
244
}
245
245
246
- void inproc_server ( const char * url ) {
246
+ SEXP rnng_rest_server ( SEXP url ) {
247
247
248
+ const char * addr [2 ] = {CHAR (STRING_ELT (url , 0 )), "inproc://n-a-n-o-serv" };
249
+ nng_thread * thr ;
248
250
nng_socket s ;
249
251
nng_msg * msg ;
250
252
int xc ;
251
253
252
- if ((xc = nng_rep0_open (& s )) || (xc = nng_listen (s , url , NULL , 0 )))
254
+ if ((xc = nng_thread_create (& thr , rest_start , (void * ) addr )))
255
+ ERROR_OUT (xc );
256
+
257
+ if ((xc = nng_rep0_open (& s )) ||
258
+ (xc = nng_listen (s , addr [1 ], NULL , 0 )))
253
259
fatal ("unable to set up inproc" , xc );
254
260
255
261
for (;;) {
262
+
256
263
if ((xc = nng_recvmsg (s , & msg , 0 )))
257
264
fatal ("inproc recvmsg" , xc );
258
265
259
- const char * body = nng_msg_body (msg );
260
- nano_buf buf ;
261
-
262
266
nano_parse_eval_res = R_BlankScalarString ;
263
- R_ToplevelExec (parse_eval_safe , (void * ) body );
267
+ R_ToplevelExec (parse_eval_safe , (void * ) nng_msg_body ( msg ) );
264
268
269
+ nano_buf buf ;
265
270
if (TYPEOF (nano_parse_eval_res ) == STRSXP ) {
266
271
const char * string = NANO_STRING (nano_parse_eval_res );
267
272
buf .buf = (unsigned char * ) string ;
@@ -274,20 +279,9 @@ void inproc_server(const char* url) {
274
279
if ((xc = nng_sendmsg (s , msg , 0 )))
275
280
fatal ("inproc sendmsg" , xc );
276
281
277
- }
282
+ R_CheckUserInterrupt ();
278
283
279
- }
280
-
281
- SEXP rnng_rest_server (SEXP url ) {
282
-
283
- const char * addr [2 ] = {CHAR (STRING_ELT (url , 0 )), "inproc://n-a-n-o-serv" };
284
- nng_thread * thr ;
285
- int xc ;
286
-
287
- if ((xc = nng_thread_create (& thr , rest_start , (void * ) addr )))
288
- ERROR_OUT (xc );
289
-
290
- inproc_server (addr [1 ]);
284
+ }
291
285
292
286
nng_thread_destroy (thr );
293
287
return R_NilValue ;
0 commit comments