@@ -66,28 +66,31 @@ InferResponse::SaveToSharedMemory(
6666  response_shm->has_error  = false ;
6767  response_shm->is_error_set  = false ;
6868
69-   Tensor* output_tensors_shm;
70-   off_t  output_tensors_offset;
71-   shm_pool->Map (
72-       (char **)&output_tensors_shm, sizeof (Tensor) * output_tensor_length,
73-       output_tensors_offset);
74-   response_shm->outputs  = output_tensors_offset;
75-   response_shm->outputs_size  = output_tensor_length;
76- 
77-   size_t  j = 0 ;
78-   for  (auto & output_tensor : output_tensors_) {
79-     Tensor* output_tensor_shm = &output_tensors_shm[j];
80-     output_tensor->SaveToSharedMemory (shm_pool, output_tensor_shm, copy);
81-     j++;
82-   }
83- 
69+   //  Only save the output tensors to shared memory when the inference response
70+   //  doesn't have error.
8471  if  (this ->HasError ()) {
8572    response_shm->has_error  = true ;
8673    off_t  error_offset;
8774    SaveStringToSharedMemory (
8875        shm_pool, error_offset, this ->Error ()->Message ().c_str ());
8976    response_shm->is_error_set  = true ;
9077    response_shm->error  = error_offset;
78+     response_shm->outputs_size  = 0 ;
79+   } else  {
80+     Tensor* output_tensors_shm;
81+     off_t  output_tensors_offset;
82+     shm_pool->Map (
83+         (char **)&output_tensors_shm, sizeof (Tensor) * output_tensor_length,
84+         output_tensors_offset);
85+     response_shm->outputs  = output_tensors_offset;
86+     response_shm->outputs_size  = output_tensor_length;
87+ 
88+     size_t  j = 0 ;
89+     for  (auto & output_tensor : output_tensors_) {
90+       Tensor* output_tensor_shm = &output_tensors_shm[j];
91+       output_tensor->SaveToSharedMemory (shm_pool, output_tensor_shm, copy);
92+       j++;
93+     }
9194  }
9295}
9396
@@ -100,6 +103,9 @@ InferResponse::LoadFromSharedMemory(
100103  uint32_t  requested_output_count = response->outputs_size ;
101104
102105  std::shared_ptr<PbError> pb_error;
106+   std::vector<std::shared_ptr<PbTensor>> py_output_tensors;
107+ 
108+   //  If the error field is set, do not load output tensors from shared memory.
103109  if  (response->has_error ) {
104110    pb_error = std::make_shared<PbError>(" "  );
105111
@@ -108,20 +114,19 @@ InferResponse::LoadFromSharedMemory(
108114      LoadStringFromSharedMemory (shm_pool, response->error , error_string);
109115      pb_error = std::make_shared<PbError>(error_string);
110116    }
111-   }
112- 
113-   std::vector<std::shared_ptr<PbTensor>> py_output_tensors;
114-   for  (size_t  idx = 0 ; idx < requested_output_count; ++idx) {
115-     std::shared_ptr<PbTensor> pb_tensor = PbTensor::LoadFromSharedMemory (
116-         shm_pool, response->outputs  + sizeof (Tensor) * idx);
117-     py_output_tensors.emplace_back (std::move (pb_tensor));
117+   } else  {
118+     for  (size_t  idx = 0 ; idx < requested_output_count; ++idx) {
119+       std::shared_ptr<PbTensor> pb_tensor = PbTensor::LoadFromSharedMemory (
120+           shm_pool, response->outputs  + sizeof (Tensor) * idx);
121+       py_output_tensors.emplace_back (std::move (pb_tensor));
122+     }
118123  }
119124
120125  std::unique_ptr<InferResponse> infer_response =
121126      std::make_unique<InferResponse>(py_output_tensors, pb_error);
122127  if  (response->is_error_set )
123128    infer_response->is_message_set_  = true ;
124-    
129+ 
125130  return  infer_response;
126131}
127132
0 commit comments