@@ -366,20 +366,17 @@ static PyObject *Consumer_poll (Handle *self, PyObject *args,
366
366
static char * kws [] = { "timeout" , NULL };
367
367
rd_kafka_message_t * rkm ;
368
368
PyObject * msgobj ;
369
+ CallState cs ;
369
370
370
371
if (!PyArg_ParseTupleAndKeywords (args , kwargs , "|d" , kws , & tmout ))
371
372
return NULL ;
372
373
373
- self -> callback_crashed = 0 ;
374
- self -> thread_state = PyEval_SaveThread ();
374
+ CallState_begin (self , & cs );
375
375
376
376
rkm = rd_kafka_consumer_poll (self -> rk , tmout >= 0 ?
377
377
(int )(tmout * 1000.0f ) : -1 );
378
378
379
- PyEval_RestoreThread (self -> thread_state );
380
- self -> thread_state = NULL ;
381
-
382
- if (self -> callback_crashed )
379
+ if (!CallState_end (self , & cs ))
383
380
return NULL ;
384
381
385
382
if (!rkm )
@@ -393,9 +390,15 @@ static PyObject *Consumer_poll (Handle *self, PyObject *args,
393
390
394
391
395
392
static PyObject * Consumer_close (Handle * self , PyObject * ignore ) {
396
- self -> thread_state = PyEval_SaveThread ();
393
+ CallState cs ;
394
+
395
+ CallState_begin (self , & cs );
396
+
397
397
rd_kafka_consumer_close (self -> rk );
398
- PyEval_RestoreThread (self -> thread_state );
398
+
399
+ if (!CallState_end (self , & cs ))
400
+ return NULL ;
401
+
399
402
Py_RETURN_NONE ;
400
403
}
401
404
@@ -593,8 +596,9 @@ static void Consumer_rebalance_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
593
596
rd_kafka_topic_partition_list_t * c_parts ,
594
597
void * opaque ) {
595
598
Handle * self = opaque ;
599
+ CallState * cs ;
596
600
597
- PyEval_RestoreThread (self -> thread_state );
601
+ cs = CallState_get (self );
598
602
599
603
self -> u .Consumer .rebalance_assigned = 0 ;
600
604
@@ -615,8 +619,8 @@ static void Consumer_rebalance_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
615
619
if (!args ) {
616
620
cfl_PyErr_Format (RD_KAFKA_RESP_ERR__FAIL ,
617
621
"Unable to build callback args" );
618
- self -> thread_state = PyEval_SaveThread ( );
619
- self -> callback_crashed ++ ;
622
+ CallState_crash ( cs );
623
+ CallState_resume ( cs ) ;
620
624
return ;
621
625
}
622
626
@@ -630,7 +634,7 @@ static void Consumer_rebalance_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
630
634
if (result )
631
635
Py_DECREF (result );
632
636
else {
633
- self -> callback_crashed ++ ;
637
+ CallState_crash ( cs ) ;
634
638
rd_kafka_yield (rk );
635
639
}
636
640
}
@@ -646,7 +650,7 @@ static void Consumer_rebalance_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
646
650
rd_kafka_assign (rk , NULL );
647
651
}
648
652
649
- self -> thread_state = PyEval_SaveThread ( );
653
+ CallState_resume ( cs );
650
654
}
651
655
652
656
@@ -655,11 +659,12 @@ static void Consumer_offset_commit_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
655
659
void * opaque ) {
656
660
Handle * self = opaque ;
657
661
PyObject * parts , * k_err , * args , * result ;
662
+ CallState * cs ;
658
663
659
664
if (!self -> u .Consumer .on_commit )
660
665
return ;
661
666
662
- PyEval_RestoreThread (self -> thread_state );
667
+ cs = CallState_get (self );
663
668
664
669
/* Insantiate error object */
665
670
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,
675
680
if (!args ) {
676
681
cfl_PyErr_Format (RD_KAFKA_RESP_ERR__FAIL ,
677
682
"Unable to build callback args" );
678
- self -> thread_state = PyEval_SaveThread ( );
679
- self -> callback_crashed ++ ;
683
+ CallState_crash ( cs );
684
+ CallState_resume ( cs ) ;
680
685
return ;
681
686
}
682
687
@@ -687,11 +692,11 @@ static void Consumer_offset_commit_cb (rd_kafka_t *rk, rd_kafka_resp_err_t err,
687
692
if (result )
688
693
Py_DECREF (result );
689
694
else {
690
- self -> callback_crashed ++ ;
695
+ CallState_crash ( cs ) ;
691
696
rd_kafka_yield (rk );
692
697
}
693
698
694
- self -> thread_state = PyEval_SaveThread ( );
699
+ CallState_resume ( cs );
695
700
}
696
701
697
702
0 commit comments