@@ -366,20 +366,17 @@ static PyObject *Consumer_poll (Handle *self, PyObject *args,
366366 static char * kws [] = { "timeout" , NULL };
367367 rd_kafka_message_t * rkm ;
368368 PyObject * msgobj ;
369+ CallState cs ;
369370
370371 if (!PyArg_ParseTupleAndKeywords (args , kwargs , "|d" , kws , & tmout ))
371372 return NULL ;
372373
373- self -> callback_crashed = 0 ;
374- self -> thread_state = PyEval_SaveThread ();
374+ CallState_begin (self , & cs );
375375
376376 rkm = rd_kafka_consumer_poll (self -> rk , tmout >= 0 ?
377377 (int )(tmout * 1000.0f ) : -1 );
378378
379- PyEval_RestoreThread (self -> thread_state );
380- self -> thread_state = NULL ;
381-
382- if (self -> callback_crashed )
379+ if (!CallState_end (self , & cs ))
383380 return NULL ;
384381
385382 if (!rkm )
@@ -393,9 +390,15 @@ static PyObject *Consumer_poll (Handle *self, PyObject *args,
393390
394391
395392static PyObject * Consumer_close (Handle * self , PyObject * ignore ) {
396- self -> thread_state = PyEval_SaveThread ();
393+ CallState cs ;
394+
395+ CallState_begin (self , & cs );
396+
397397 rd_kafka_consumer_close (self -> rk );
398- PyEval_RestoreThread (self -> thread_state );
398+
399+ if (!CallState_end (self , & cs ))
400+ return NULL ;
401+
399402 Py_RETURN_NONE ;
400403}
401404
@@ -593,8 +596,9 @@ static void Consumer_rebalance_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
593596 rd_kafka_topic_partition_list_t * c_parts ,
594597 void * opaque ) {
595598 Handle * self = opaque ;
599+ CallState * cs ;
596600
597- PyEval_RestoreThread (self -> thread_state );
601+ cs = CallState_get (self );
598602
599603 self -> u .Consumer .rebalance_assigned = 0 ;
600604
@@ -615,8 +619,8 @@ static void Consumer_rebalance_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
615619 if (!args ) {
616620 cfl_PyErr_Format (RD_KAFKA_RESP_ERR__FAIL ,
617621 "Unable to build callback args" );
618- self -> thread_state = PyEval_SaveThread ( );
619- self -> callback_crashed ++ ;
622+ CallState_crash ( cs );
623+ CallState_resume ( cs ) ;
620624 return ;
621625 }
622626
@@ -630,7 +634,7 @@ static void Consumer_rebalance_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
630634 if (result )
631635 Py_DECREF (result );
632636 else {
633- self -> callback_crashed ++ ;
637+ CallState_crash ( cs ) ;
634638 rd_kafka_yield (rk );
635639 }
636640 }
@@ -646,7 +650,7 @@ static void Consumer_rebalance_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
646650 rd_kafka_assign (rk , NULL );
647651 }
648652
649- self -> thread_state = PyEval_SaveThread ( );
653+ CallState_resume ( cs );
650654}
651655
652656
@@ -655,11 +659,12 @@ static void Consumer_offset_commit_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
655659 void * opaque ) {
656660 Handle * self = opaque ;
657661 PyObject * parts , * k_err , * args , * result ;
662+ CallState * cs ;
658663
659664 if (!self -> u .Consumer .on_commit )
660665 return ;
661666
662- PyEval_RestoreThread (self -> thread_state );
667+ cs = CallState_get (self );
663668
664669 /* Insantiate error object */
665670 k_err = KafkaError_new_or_None (err , NULL );
@@ -675,8 +680,8 @@ static void Consumer_offset_commit_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
675680 if (!args ) {
676681 cfl_PyErr_Format (RD_KAFKA_RESP_ERR__FAIL ,
677682 "Unable to build callback args" );
678- self -> thread_state = PyEval_SaveThread ( );
679- self -> callback_crashed ++ ;
683+ CallState_crash ( cs );
684+ CallState_resume ( cs ) ;
680685 return ;
681686 }
682687
@@ -687,11 +692,11 @@ static void Consumer_offset_commit_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
687692 if (result )
688693 Py_DECREF (result );
689694 else {
690- self -> callback_crashed ++ ;
695+ CallState_crash ( cs ) ;
691696 rd_kafka_yield (rk );
692697 }
693698
694- self -> thread_state = PyEval_SaveThread ( );
699+ CallState_resume ( cs );
695700}
696701
697702
0 commit comments