@@ -1134,15 +1134,30 @@ find_buffer(char_u *name, int err)
11341134 return buf ;
11351135}
11361136
1137+ static void
1138+ set_callback (
1139+ char_u * * cbp ,
1140+ partial_T * * pp ,
1141+ char_u * callback ,
1142+ partial_T * partial )
1143+ {
1144+ free_callback (* cbp , * pp );
1145+ if (callback != NULL && * callback != NUL )
1146+ * cbp = vim_strsave (callback );
1147+ else
1148+ * cbp = NULL ;
1149+ * pp = partial ;
1150+ if (* pp != NULL )
1151+ ++ (* pp )-> pt_refcount ;
1152+ }
1153+
11371154/*
11381155 * Set various properties from an "opt" argument.
11391156 */
11401157 void
11411158channel_set_options (channel_T * channel , jobopt_T * opt )
11421159{
11431160 int part ;
1144- char_u * * cbp ;
1145- partial_T * * pp ;
11461161
11471162 if (opt -> jo_set & JO_MODE )
11481163 for (part = PART_SOCK ; part <= PART_IN ; ++ part )
@@ -1165,61 +1180,19 @@ channel_set_options(channel_T *channel, jobopt_T *opt)
11651180 channel -> ch_part [PART_IN ].ch_block_write = 1 ;
11661181
11671182 if (opt -> jo_set & JO_CALLBACK )
1168- {
1169- cbp = & channel -> ch_callback ;
1170- pp = & channel -> ch_partial ;
1171- vim_free (* cbp );
1172- partial_unref (* pp );
1173- if (opt -> jo_callback != NULL && * opt -> jo_callback != NUL )
1174- * cbp = vim_strsave (opt -> jo_callback );
1175- else
1176- * cbp = NULL ;
1177- * pp = opt -> jo_partial ;
1178- if (* pp != NULL )
1179- ++ (* pp )-> pt_refcount ;
1180- }
1183+ set_callback (& channel -> ch_callback , & channel -> ch_partial ,
1184+ opt -> jo_callback , opt -> jo_partial );
11811185 if (opt -> jo_set & JO_OUT_CALLBACK )
1182- {
1183- cbp = & channel -> ch_part [PART_OUT ].ch_callback ;
1184- pp = & channel -> ch_part [PART_OUT ].ch_partial ;
1185- vim_free (* cbp );
1186- partial_unref (* pp );
1187- if (opt -> jo_out_cb != NULL && * opt -> jo_out_cb != NUL )
1188- * cbp = vim_strsave (opt -> jo_out_cb );
1189- else
1190- * cbp = NULL ;
1191- * pp = opt -> jo_out_partial ;
1192- if (* pp != NULL )
1193- ++ (* pp )-> pt_refcount ;
1194- }
1186+ set_callback (& channel -> ch_part [PART_OUT ].ch_callback ,
1187+ & channel -> ch_part [PART_OUT ].ch_partial ,
1188+ opt -> jo_out_cb , opt -> jo_out_partial );
11951189 if (opt -> jo_set & JO_ERR_CALLBACK )
1196- {
1197- cbp = & channel -> ch_part [PART_ERR ].ch_callback ;
1198- pp = & channel -> ch_part [PART_ERR ].ch_partial ;
1199- vim_free (* cbp );
1200- partial_unref (* pp );
1201- if (opt -> jo_err_cb != NULL && * opt -> jo_err_cb != NUL )
1202- * cbp = vim_strsave (opt -> jo_err_cb );
1203- else
1204- * cbp = NULL ;
1205- * pp = opt -> jo_err_partial ;
1206- if (* pp != NULL )
1207- ++ (* pp )-> pt_refcount ;
1208- }
1190+ set_callback (& channel -> ch_part [PART_ERR ].ch_callback ,
1191+ & channel -> ch_part [PART_ERR ].ch_partial ,
1192+ opt -> jo_err_cb , opt -> jo_err_partial );
12091193 if (opt -> jo_set & JO_CLOSE_CALLBACK )
1210- {
1211- cbp = & channel -> ch_close_cb ;
1212- pp = & channel -> ch_close_partial ;
1213- vim_free (* cbp );
1214- partial_unref (* pp );
1215- if (opt -> jo_close_cb != NULL && * opt -> jo_close_cb != NUL )
1216- * cbp = vim_strsave (opt -> jo_close_cb );
1217- else
1218- * cbp = NULL ;
1219- * pp = opt -> jo_close_partial ;
1220- if (* pp != NULL )
1221- ++ (* pp )-> pt_refcount ;
1222- }
1194+ set_callback (& channel -> ch_close_cb , & channel -> ch_close_partial ,
1195+ opt -> jo_close_cb , opt -> jo_close_partial );
12231196
12241197 if ((opt -> jo_set & JO_OUT_IO ) && opt -> jo_io [PART_OUT ] == JIO_BUFFER )
12251198 {
@@ -2249,8 +2222,7 @@ invoke_one_time_callback(
22492222 * invokes ch_close() the list will be cleared. */
22502223 remove_cb_node (cbhead , item );
22512224 invoke_callback (channel , item -> cq_callback , item -> cq_partial , argv );
2252- vim_free (item -> cq_callback );
2253- partial_unref (item -> cq_partial );
2225+ free_callback (item -> cq_callback , item -> cq_partial );
22542226 vim_free (item );
22552227}
22562228
@@ -2746,9 +2718,8 @@ channel_close(channel_T *channel, int invoke_close_cb)
27462718 }
27472719
27482720 /* the callback is only called once */
2749- vim_free (channel -> ch_close_cb );
2721+ free_callback (channel -> ch_close_cb , channel -> ch_close_partial );
27502722 channel -> ch_close_cb = NULL ;
2751- partial_unref (channel -> ch_close_partial );
27522723 channel -> ch_close_partial = NULL ;
27532724
27542725 -- channel -> ch_refcount ;
@@ -2784,8 +2755,7 @@ channel_clear_one(channel_T *channel, int part)
27842755 cbq_T * node = cb_head -> cq_next ;
27852756
27862757 remove_cb_node (cb_head , node );
2787- vim_free (node -> cq_callback );
2788- partial_unref (node -> cq_partial );
2758+ free_callback (node -> cq_callback , node -> cq_partial );
27892759 vim_free (node );
27902760 }
27912761
@@ -2795,9 +2765,9 @@ channel_clear_one(channel_T *channel, int part)
27952765 remove_json_node (json_head , json_head -> jq_next );
27962766 }
27972767
2798- vim_free (channel -> ch_part [part ].ch_callback );
2768+ free_callback (channel -> ch_part [part ].ch_callback ,
2769+ channel -> ch_part [part ].ch_partial );
27992770 channel -> ch_part [part ].ch_callback = NULL ;
2800- partial_unref (channel -> ch_part [part ].ch_partial );
28012771 channel -> ch_part [part ].ch_partial = NULL ;
28022772}
28032773
@@ -2814,13 +2784,11 @@ channel_clear(channel_T *channel)
28142784 channel_clear_one (channel , PART_OUT );
28152785 channel_clear_one (channel , PART_ERR );
28162786 /* there is no callback or queue for PART_IN */
2817- vim_free (channel -> ch_callback );
2787+ free_callback (channel -> ch_callback , channel -> ch_partial );
28182788 channel -> ch_callback = NULL ;
2819- partial_unref (channel -> ch_partial );
28202789 channel -> ch_partial = NULL ;
2821- vim_free (channel -> ch_close_cb );
2790+ free_callback (channel -> ch_close_cb , channel -> ch_close_partial );
28222791 channel -> ch_close_cb = NULL ;
2823- partial_unref (channel -> ch_close_partial );
28242792 channel -> ch_close_partial = NULL ;
28252793}
28262794
@@ -4344,8 +4312,7 @@ job_free_contents(job_T *job)
43444312 mch_clear_job (job );
43454313
43464314 vim_free (job -> jv_stoponexit );
4347- vim_free (job -> jv_exit_cb );
4348- partial_unref (job -> jv_exit_partial );
4315+ free_callback (job -> jv_exit_cb , job -> jv_exit_partial );
43494316}
43504317
43514318 static void
@@ -4510,8 +4477,7 @@ job_set_options(job_T *job, jobopt_T *opt)
45104477 }
45114478 if (opt -> jo_set & JO_EXIT_CB )
45124479 {
4513- vim_free (job -> jv_exit_cb );
4514- partial_unref (job -> jv_exit_partial );
4480+ free_callback (job -> jv_exit_cb , job -> jv_exit_partial );
45154481 if (opt -> jo_exit_cb == NULL || * opt -> jo_exit_cb == NUL )
45164482 {
45174483 job -> jv_exit_cb = NULL ;
0 commit comments