@@ -268,7 +268,7 @@ pub struct ModernBertClassifier {
268268}
269269
270270lazy_static:: lazy_static! {
271- static ref MODERNBERT_CLASSIFIER : Arc <Mutex <Option <ModernBertClassifier >>> = Arc :: new( Mutex :: new( None ) ) ;
271+ static ref MODERNBERT_CLASSIFIER : Arc <Mutex <Option <Arc < ModernBertClassifier > >>> = Arc :: new( Mutex :: new( None ) ) ;
272272 static ref MODERNBERT_PII_CLASSIFIER : Arc <Mutex <Option <ModernBertClassifier >>> = Arc :: new( Mutex :: new( None ) ) ;
273273 static ref MODERNBERT_JAILBREAK_CLASSIFIER : Arc <Mutex <Option <ModernBertClassifier >>> = Arc :: new( Mutex :: new( None ) ) ;
274274}
@@ -830,7 +830,7 @@ pub extern "C" fn init_modernbert_classifier(model_id: *const c_char, use_cpu: b
830830 match ModernBertClassifier :: new ( model_id, use_cpu) {
831831 Ok ( classifier) => {
832832 let mut bert_opt = MODERNBERT_CLASSIFIER . lock ( ) . unwrap ( ) ;
833- * bert_opt = Some ( classifier) ;
833+ * bert_opt = Some ( Arc :: new ( classifier) ) ;
834834 true
835835 }
836836 Err ( e) => {
@@ -930,18 +930,23 @@ pub extern "C" fn classify_modernbert_text(text: *const c_char) -> ModernBertCla
930930 }
931931 } ;
932932
933- let bert_opt = MODERNBERT_CLASSIFIER . lock ( ) . unwrap ( ) ;
934- match & * bert_opt {
935- Some ( classifier) => match classifier. classify_text ( text) {
936- Ok ( ( class_idx, confidence) ) => ModernBertClassificationResult {
937- class : class_idx as i32 ,
938- confidence,
939- } ,
940- Err ( e) => {
941- eprintln ! ( "Error classifying text with ModernBERT: {e}" ) ;
942- default_result
933+ let classifier_arc_opt = MODERNBERT_CLASSIFIER . lock ( ) . unwrap ( ) ;
934+ match & * classifier_arc_opt {
935+ Some ( classifier_arc) => {
936+ let classifier = classifier_arc. clone ( ) ;
937+ drop ( classifier_arc_opt) ;
938+
939+ match classifier. classify_text ( text) {
940+ Ok ( ( class_idx, confidence) ) => ModernBertClassificationResult {
941+ class : class_idx as i32 ,
942+ confidence,
943+ } ,
944+ Err ( e) => {
945+ eprintln ! ( "Error classifying text with ModernBERT: {e}" ) ;
946+ default_result
947+ }
943948 }
944- } ,
949+ }
945950 None => {
946951 eprintln ! ( "ModernBERT classifier not initialized" ) ;
947952 default_result
@@ -968,26 +973,31 @@ pub extern "C" fn classify_modernbert_text_with_probabilities(
968973 }
969974 } ;
970975
971- let bert_opt = MODERNBERT_CLASSIFIER . lock ( ) . unwrap ( ) ;
972- match & * bert_opt {
973- Some ( classifier) => match classifier. classify_text_with_probs ( text) {
974- Ok ( ( class_idx, confidence, probabilities) ) => {
975- // Allocate memory for probabilities array
976- let prob_len = probabilities. len ( ) ;
977- let prob_ptr = Box :: into_raw ( probabilities. into_boxed_slice ( ) ) as * mut f32 ;
978-
979- ModernBertClassificationResultWithProbs {
980- class : class_idx as i32 ,
981- confidence,
982- probabilities : prob_ptr,
983- num_classes : prob_len as i32 ,
976+ let classifier_arc_opt = MODERNBERT_CLASSIFIER . lock ( ) . unwrap ( ) ;
977+ match & * classifier_arc_opt {
978+ Some ( classifier_arc) => {
979+ let classifier = classifier_arc. clone ( ) ;
980+ drop ( classifier_arc_opt) ;
981+
982+ match classifier. classify_text_with_probs ( text) {
983+ Ok ( ( class_idx, confidence, probabilities) ) => {
984+ // Allocate memory for probabilities array
985+ let prob_len = probabilities. len ( ) ;
986+ let prob_ptr = Box :: into_raw ( probabilities. into_boxed_slice ( ) ) as * mut f32 ;
987+
988+ ModernBertClassificationResultWithProbs {
989+ class : class_idx as i32 ,
990+ confidence,
991+ probabilities : prob_ptr,
992+ num_classes : prob_len as i32 ,
993+ }
994+ }
995+ Err ( e) => {
996+ eprintln ! ( "Error classifying text with probabilities using ModernBERT: {e}" ) ;
997+ default_result
984998 }
985999 }
986- Err ( e) => {
987- eprintln ! ( "Error classifying text with probabilities using ModernBERT: {e}" ) ;
988- default_result
989- }
990- } ,
1000+ }
9911001 None => {
9921002 eprintln ! ( "ModernBERT classifier not initialized" ) ;
9931003 default_result
0 commit comments