@@ -322,20 +322,6 @@ static void request_finalizer(SEXP xptr) {
322322
323323}
324324
325- static void request_sock_finalizer (SEXP xptr ) {
326-
327- if (R_ExternalPtrAddr (xptr ) == NULL ) return ;
328- nano_aio * xp = (nano_aio * ) R_ExternalPtrAddr (xptr );
329- nano_aio * saio = (nano_aio * ) xp -> next ;
330- nng_aio_free (saio -> aio );
331- nng_aio_free (xp -> aio );
332- if (xp -> data != NULL )
333- nng_msg_free ((nng_msg * ) xp -> data );
334- R_Free (saio );
335- R_Free (xp );
336-
337- }
338-
339325static void cv_finalizer (SEXP xptr ) {
340326
341327 if (R_ExternalPtrAddr (xptr ) == NULL ) return ;
@@ -1225,84 +1211,9 @@ SEXP rnng_ncurl_session_close(SEXP session) {
12251211
12261212// request ---------------------------------------------------------------------
12271213
1228- SEXP rnng_request_sock (const SEXP con , const SEXP data , const SEXP sendmode ,
1214+ SEXP rnng_request_impl (const SEXP con , const SEXP data , const SEXP sendmode ,
12291215 const SEXP recvmode , const SEXP timeout , const SEXP clo , nano_cv * ncv ) {
12301216
1231- const nng_duration dur = timeout == R_NilValue ? NNG_DURATION_DEFAULT : (nng_duration ) Rf_asInteger (timeout );
1232- const int mod = nano_matcharg (recvmode );
1233- const int signal = ncv != NULL ;
1234- nng_socket * sock = (nng_socket * ) R_ExternalPtrAddr (con );
1235- SEXP aio , env , fun ;
1236- nano_buf buf ;
1237- nano_aio * saio , * raio ;
1238- nng_msg * msg ;
1239- int xc ;
1240-
1241- switch (nano_encodes (sendmode )) {
1242- case 1 :
1243- nano_serialize (& buf , data ); break ;
1244- case 2 :
1245- nano_encode (& buf , data ); break ;
1246- default :
1247- nano_serialize_next (& buf , data ); break ;
1248- }
1249-
1250- saio = R_Calloc (1 , nano_aio );
1251- saio -> next = ncv ;
1252-
1253- if ((xc = nng_msg_alloc (& msg , 0 )))
1254- goto exitlevel1 ;
1255-
1256- if ((xc = nng_msg_append (msg , buf .buf , buf .cur )) ||
1257- (xc = nng_aio_alloc (& saio -> aio , sendaio_complete , & saio -> aio ))) {
1258- nng_msg_free (msg );
1259- goto exitlevel1 ;
1260- }
1261-
1262- nng_aio_set_msg (saio -> aio , msg );
1263- nng_send_aio (* sock , saio -> aio );
1264-
1265- raio = R_Calloc (1 , nano_aio );
1266- raio -> type = RECVAIO ;
1267- raio -> mode = mod ;
1268- raio -> next = saio ;
1269-
1270- if ((xc = nng_aio_alloc (& raio -> aio , signal ? request_complete_signal : raio_complete , raio )))
1271- goto exitlevel2 ;
1272-
1273- nng_aio_set_timeout (raio -> aio , dur );
1274- nng_recv_aio (* sock , raio -> aio );
1275- NANO_FREE (buf );
1276-
1277- PROTECT (aio = R_MakeExternalPtr (raio , nano_AioSymbol , R_NilValue ));
1278- R_RegisterCFinalizerEx (aio , request_sock_finalizer , TRUE);
1279-
1280- PROTECT (env = Rf_allocSExp (ENVSXP ));
1281- NANO_CLASS (env , "recvAio" );
1282- Rf_defineVar (nano_AioSymbol , aio , env );
1283-
1284- PROTECT (fun = Rf_allocSExp (CLOSXP ));
1285- SET_FORMALS (fun , nano_aioFormals );
1286- SET_BODY (fun , signal ? CADDDR (nano_aioFuncs ) : CADR (nano_aioFuncs ));
1287- SET_CLOENV (fun , clo );
1288- R_MakeActiveBinding (nano_DataSymbol , fun , env );
1289-
1290- UNPROTECT (3 );
1291- return env ;
1292-
1293- exitlevel2 :
1294- R_Free (raio );
1295- nng_aio_free (saio -> aio );
1296- exitlevel1 :
1297- R_Free (saio );
1298- NANO_FREE (buf );
1299- return mk_error_data (xc );
1300-
1301- }
1302-
1303- SEXP rnng_request_ctx (const SEXP con , const SEXP data , const SEXP sendmode ,
1304- const SEXP recvmode , const SEXP timeout , const SEXP clo , nano_cv * ncv ) {
1305-
13061217 const nng_duration dur = timeout == R_NilValue ? NNG_DURATION_DEFAULT : (nng_duration ) Rf_asInteger (timeout );
13071218 const int mod = nano_matcharg (recvmode );
13081219 const int signal = ncv != NULL ;
@@ -1380,31 +1291,22 @@ SEXP rnng_request_ctx(const SEXP con, const SEXP data, const SEXP sendmode,
13801291
13811292SEXP rnng_request (SEXP con , SEXP data , SEXP sendmode , SEXP recvmode , SEXP timeout , SEXP clo ) {
13821293
1383- const SEXP ptrtag = R_ExternalPtrTag (con );
1384- if (ptrtag == nano_ContextSymbol ) {
1385- return rnng_request_ctx (con , data , sendmode , recvmode , timeout , clo , NULL );
1386- } else if (ptrtag == nano_SocketSymbol ) {
1387- return rnng_request_sock (con , data , sendmode , recvmode , timeout , clo , NULL );
1388- } else {
1389- error_return ("'con' is not a valid Socket or Context" );
1390- }
1294+ if (R_ExternalPtrTag (con ) != nano_ContextSymbol )
1295+ Rf_error ("'con' is not a valid Context" );
1296+
1297+ return rnng_request_impl (con , data , sendmode , recvmode , timeout , clo , NULL );
13911298
13921299}
13931300
13941301SEXP rnng_request_signal (SEXP con , SEXP data , SEXP cvar , SEXP sendmode , SEXP recvmode , SEXP timeout , SEXP clo ) {
13951302
1303+ if (R_ExternalPtrTag (con ) != nano_ContextSymbol )
1304+ Rf_error ("'con' is not a valid Context" );
13961305 if (R_ExternalPtrTag (cvar ) != nano_CvSymbol )
13971306 Rf_error ("'cv' is not a valid Condition Variable" );
13981307 nano_cv * ncv = (nano_cv * ) R_ExternalPtrAddr (cvar );
13991308
1400- const SEXP ptrtag = R_ExternalPtrTag (con );
1401- if (ptrtag == nano_ContextSymbol ) {
1402- return rnng_request_ctx (con , data , sendmode , recvmode , timeout , clo , ncv );
1403- } else if (ptrtag == nano_SocketSymbol ) {
1404- return rnng_request_sock (con , data , sendmode , recvmode , timeout , clo , ncv );
1405- } else {
1406- error_return ("'con' is not a valid Socket or Context" );
1407- }
1309+ return rnng_request_impl (con , data , sendmode , recvmode , timeout , clo , ncv );
14081310
14091311}
14101312
0 commit comments