Grpc-XS

 view release on metacpan or  search on metacpan

ext/server.xs  view on Meta::CPAN

SV*
requestCall(Grpc::XS::Server self)
  CODE:
    grpc_call_error error_code;
    grpc_call *call;
    grpc_call_details details;
    grpc_metadata_array metadata;
    grpc_event event;

    grpc_call_details_init(&details);
    grpc_metadata_array_init(&metadata);

    error_code =
        grpc_server_request_call(self->wrapped, &call, &details, &metadata,
                                 completion_queue, completion_queue, NULL);

    if (error_code != GRPC_CALL_OK) {
      warn("request_call failed, error = %d",error_code);
      goto cleanup;
    }

    event = grpc_completion_queue_pluck(completion_queue, NULL,
                                        gpr_inf_future(GPR_CLOCK_REALTIME), NULL);

    if (!event.success) {
      warn("Failed to request a call for some reason");
      goto cleanup;
    }

    HV* result = newHV();

    // add call object instance to hash
    CallCTX* call_ctx = (CallCTX *)malloc( sizeof(CallCTX) );
    call_ctx->wrapped = call;
    SV* call_sv = sv_setref_pv(newSV (0), "Grpc::XS::Call", (void*)call_ctx) ;
    hv_stores(result,"call", call_sv);

    // add time object instance to hash
    TimevalCTX* timeval_ctx = (TimevalCTX *)malloc( sizeof(TimevalCTX) );
    timeval_ctx->wrapped = details.deadline;
    SV* timeval_sv = sv_setref_pv(newSV (0), "Grpc::XS::Timeval", (void*)timeval_ctx);
    hv_stores(result,"absolute_deadline", timeval_sv);

    hv_stores(result,"method",grpc_slice_or_string_to_sv(details.method));
    hv_stores(result,"host",grpc_slice_or_string_to_sv(details.host));

    hv_stores(result,"metadata",
                newRV((SV*)grpc_parse_metadata_array(&metadata)));

  cleanup:
    grpc_call_details_destroy(&details);
    grpc_metadata_array_destroy(&metadata);
    RETVAL = (SV*)newRV_noinc((SV *)result);
  OUTPUT: RETVAL

long
addHttp2Port(Grpc::XS::Server self, SV* addr)
  CODE:
#ifdef GRPC_NO_INSECURE_BUILD
    {
      grpc_server_credentials * insecure_cred = grpc_insecure_server_credentials_create();
      RETVAL = grpc_server_add_http2_port(self->wrapped, SvPV_nolen(addr), insecure_cred);
      grpc_server_credentials_release(insecure_cred);
    }
#else
    RETVAL = grpc_server_add_insecure_http2_port(self->wrapped, SvPV_nolen(addr));
#endif
  OUTPUT: RETVAL

long
addSecureHttp2Port(Grpc::XS::Server self, SV* addr, Grpc::XS::ServerCredentials creds)
  CODE:
    RETVAL =
#ifdef GRPC_NO_INSECURE_BUILD
      grpc_server_add_http2_port(
#else
      grpc_server_add_secure_http2_port(
#endif
        self->wrapped, SvPV_nolen(addr), creds->wrapped);
  OUTPUT: RETVAL

void
start(Grpc::XS::Server self)
  CODE:
    grpc_server_start(self->wrapped);
  OUTPUT:

void
DESTROY(Grpc::XS::Server self)
  CODE:
    if (self->wrapped != NULL) {
      grpc_server_shutdown_and_notify(self->wrapped, completion_queue, NULL);
      grpc_server_cancel_all_calls(self->wrapped);
      grpc_completion_queue_pluck(completion_queue, NULL,
                                  gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
      grpc_server_destroy(self->wrapped);
    }
    Safefree(self);



( run in 0.501 second using v1.01-cache-2.11-cpan-39bf76dae61 )