Commit 16526c7c authored by Raymond Knopp's avatar Raymond Knopp

debugging and testing of SLSS with USRP

parent 06ff737c
......@@ -2345,5 +2345,12 @@ void generate_sldch(PHY_VARS_UE *ue,SLDCH_t *sldch,int frame_tx,int subframe_tx)
*/
void generate_slsch(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,SLSCH_t *slss,int frame_tx,int subframe_tx);
int generate_slbch(int32_t **txdataF,
short amp,
LTE_DL_FRAME_PARMS *frame_parms,
int subframe,
uint8_t *slmib);
/**@}*/
#endif
......@@ -45,7 +45,6 @@
int generate_slbch(int32_t **txdataF,
short amp,
LTE_DL_FRAME_PARMS *frame_parms,
unsigned short symbol,
int subframe,
uint8_t *slmib) {
......@@ -83,8 +82,8 @@ int generate_slbch(int32_t **txdataF,
a = (amp*SQRT_18_OVER_32_Q15)>>(15-2);
int Nsymb=14;
for (symb=0;symb<10;symb++) {
k = frame_parms->ofdm_symbol_size-36;
for (symb=0;symb<10;symb++) {
k = (frame_parms->ofdm_symbol_size<<1)-72;
txptr = (int16_t*)&txdataF[0][subframe*Nsymb*frame_parms->ofdm_symbol_size+(symb*frame_parms->ofdm_symbol_size)];
// first half (negative frequencies)
for (int i=0;i<72;i++) {
......
......@@ -495,6 +495,9 @@ void sldch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,int npr
NULL,
0);
ue->generate_ul_signal[subframe_tx][0] = 0;
}
void check_and_generate_psdch(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
......
......@@ -74,6 +74,10 @@ int generate_slpss(int32_t **txdataF,
a = (amp*SQRT_18_OVER_32_Q15)>>(15-2);
//printf("[PSS] amp=%d, a=%d\n",amp,a);
LOG_I(PHY,"Generating PSS in subframe %d, symbol %d, amp %d (%d) => %p\n",
subframe,symbol,a,amp,
&((short*)txdataF[0])[subframe*frame_parms->samples_per_tti]);
// The PSS occupies the inner 6 RBs, which start at
k = frame_parms->ofdm_symbol_size-3*12+5;
......@@ -94,5 +98,6 @@ int generate_slpss(int32_t **txdataF,
}
return(0);
}
......@@ -493,6 +493,8 @@ void pscch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,uint32_
0);
ue->pscch_generated = 1+slot;
ue->generate_ul_signal[subframe_tx][0] = 0;
}
......@@ -615,6 +617,8 @@ void slsch_codingmodulation(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_tx,in
ljmod10);
ue->pssch_generated = 1;
ue->generate_ul_signal[subframe_tx][0] = 0;
}
void check_and_generate_pssch(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_tx,int subframe_tx) {
......
......@@ -43,9 +43,9 @@ void check_and_generate_slss(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
int tx_amp;
LOG_I(PHY,"check_and_generate_slss: frame_tx %d, subframe_tx %d : slss->SL_offsetIndicator %d, slss->slmib_length %d\n",
frame_tx,subframe_tx,slss->SL_OffsetIndicator, slss->slmib_length);
if ((((10*frame_tx) + subframe_tx)%40) != slss->SL_OffsetIndicator) return;
if (slss->slmib_length == 0) return;
......@@ -54,7 +54,7 @@ void check_and_generate_slss(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
ue->frame_parms.Nid_SL = slss->slss_id;
// 6 PRBs => ceil(10*log10(6)) = 8
ue->tx_power_dBm[subframe_tx] = 8;
ue->tx_power_dBm[subframe_tx] = -6;
ue->tx_total_RE[subframe_tx] = 72;
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
......@@ -72,6 +72,7 @@ void check_and_generate_slss(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
ue->frame_parms.ofdm_symbol_size*ue->frame_parms.symbols_per_tti*sizeof(int32_t));
}
// PSS
generate_slpss(ue->common_vars.txdataF,
tx_amp,
......@@ -88,11 +89,23 @@ void check_and_generate_slss(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
generate_slbch(ue->common_vars.txdataF,
tx_amp,
&ue->frame_parms,
2,
subframe_tx);
subframe_tx,
ue->slss->slmib);
generate_slsss(ue->common_vars.txdataF,
subframe_tx,
tx_amp,
&ue->frame_parms,
11);
generate_slsss(ue->common_vars.txdataF,
subframe_tx,
tx_amp,
&ue->frame_parms,
12);
ue->sl_chan = PSBCH;
generate_drs_pusch(ue,
NULL,
0,
......@@ -103,5 +116,12 @@ void check_and_generate_slss(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
0,
NULL,
0);
ue->generate_ul_signal[subframe_tx][0] = 1;
LOG_D(PHY,"ULSCH (after slss) : signal F energy %d dB (txdataF %p)\n",dB_fixed(signal_energy(&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size],14*ue->frame_parms.ofdm_symbol_size)),&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size]);
// write_output("txdataF_pre.m","txF_pre",&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size],14*ue->frame_parms.ofdm_symbol_size,1,1);
}
#endif
......@@ -55,13 +55,13 @@ int generate_slsss(int32_t **txdataF,
Nid1 = frame_parms->Nid_SL%168;
AssertFatal((frame_parms->Ncp == NORMAL && (symbol==4 || symbol==5)) ||
(frame_parms->Ncp == EXTENDED && (symbol==3 || symbol==4)),
AssertFatal((frame_parms->Ncp == NORMAL && (symbol==11 || symbol==12)) ||
(frame_parms->Ncp == EXTENDED && (symbol==10 || symbol==11)),
"Symbol %d not possible for SLSSS\n",
symbol);
if (((symbol == 4) && frame_parms->Ncp == NORMAL) ||
((symbol == 3) && frame_parms->Ncp == EXTENDED))
if (((symbol == 11) && frame_parms->Ncp == NORMAL) ||
((symbol == 10) && frame_parms->Ncp == EXTENDED))
d = &d0_sss[62*(Nid2 + (Nid1*3))];
else
d = &d5_sss[62*(Nid2 + (Nid1*3))];
......@@ -277,8 +277,8 @@ int slpss_sss_extract(PHY_VARS_UE *phy_vars_ue,
int16_t phase_re[7] = {16383, 25101, 30791, 32767, 30791, 25101, 16383};
int16_t phase_im[7] = {-28378, -21063, -11208, 0, 11207, 21062, 28377};
int16_t phaseSL_re[7] = {16383, 25101, 30791, 32767, 30791, 25101, 16383};
int16_t phaseSL_im[7] = {-28378, -21063, -11208, 0, 11207, 21062, 28377};
int rx_slsss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *phase_max,int Nid2,int subframe_rx)
......@@ -374,8 +374,8 @@ int rx_slsss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *phase_max,int Nid2,int
// This is the inner product using one particular value of each unknown parameter
for (i=0; i<62; i++) {
metric +=
(int16_t)(((d0[i]*((((phase_re[phase]*(int32_t)sss0[i<<1])>>19)-((phase_im[phase]*(int32_t)sss0[1+(i<<1)])>>19)))))) +
(int16_t)(((d5[i]*((((phase_re[phase]*(int32_t)sss1[i<<1])>>19)-((phase_im[phase]*(int32_t)sss1[1+(i<<1)])>>19))))));
(int16_t)(((d0[i]*((((phaseSL_re[phase]*(int32_t)sss0[i<<1])>>19)-((phaseSL_im[phase]*(int32_t)sss0[1+(i<<1)])>>19)))))) +
(int16_t)(((d5[i]*((((phaseSL_re[phase]*(int32_t)sss1[i<<1])>>19)-((phaseSL_im[phase]*(int32_t)sss1[1+(i<<1)])>>19))))));
}
// if the current metric is better than the last save it
......
......@@ -1316,7 +1316,7 @@ typedef struct {
int16_t *slsch_ulsch_llr;
int16_t *sldch_dlsch_llr;
int16_t *sldch_ulsch_llr;
SLSCH_t *slss;
SLSS_t *slss;
SLSCH_t slss_rx;
SLSCH_t *slsch;
SLSCH_t slsch_rx;
......@@ -1331,6 +1331,10 @@ typedef struct {
uint32_t slsch_rxcnt[4];
SLDCH_t *sldch;
int sldch_sdu_active;
pthread_mutex_t slss_mutex;
pthread_mutex_t sldch_mutex;
pthread_mutex_t slsch_mutex;
//Paging parameters
uint32_t IMSImod1024;
uint32_t PF;
......@@ -1359,7 +1363,7 @@ typedef struct {
uint32_t high_speed_flag;
uint32_t perfect_ce;
int16_t ch_est_alpha;
int generate_ul_signal[NUMBER_OF_CONNECTED_eNB_MAX];
int generate_ul_signal[10][NUMBER_OF_CONNECTED_eNB_MAX];
UE_SCAN_INFO_t scan_info[NB_BANDS_MAX];
......
......@@ -1193,14 +1193,12 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue,
}
void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empty_subframe) {
void ulsch_common_procedures(PHY_VARS_UE *ue, int frame_tx, int subframe_tx, uint8_t empty_subframe) {
int aa;
LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
int nsymb;
int subframe_tx = proc->subframe_tx;
int frame_tx = proc->frame_tx;
int ulsch_start;
int overflow=0;
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
......@@ -1232,6 +1230,8 @@ void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empt
ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-ue->N_TA_offset; //-ue->timing_advance;
#endif //else EXMIMO
//#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
if (empty_subframe)
{
......@@ -1268,14 +1268,15 @@ void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empt
//#endif
// if ((frame_tx%100) == 0)
LOG_D(PHY,"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d\n",
ue->Mod_id,frame_tx,subframe_tx,
ulsch_start,
ue->rx_offset,
ue->hw_timing_advance,
ue->timing_advance,
ue->N_TA_offset);
LOG_I(PHY,"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d, empty subframe %d\n",
ue->Mod_id,frame_tx,subframe_tx,
ulsch_start,
ue->rx_offset,
ue->hw_timing_advance,
ue->timing_advance,
ue->N_TA_offset,
empty_subframe);
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
if (frame_parms->Ncp == 1)
......@@ -1324,13 +1325,13 @@ void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empt
for (k=ulsch_start,l=0; k<cmin(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_tti); k++,l++) {
((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4;
((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4;
((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l];
((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1];
}
for (k=0; k<overflow; k++,l++) {
((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4;
((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4;
((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l];
((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1];
}
#if defined(EXMIMO)
// handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on
......@@ -1344,6 +1345,9 @@ void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empt
}
#endif
#endif
LOG_D(PHY,"ULSCH : signal energy %d dB (txdataF %p)\n",dB_fixed(signal_energy(&ue->common_vars.txdata[0][ulsch_start],frame_parms->samples_per_tti)),&ue->common_vars.txdataF[0][subframe_tx*nsymb*frame_parms->ofdm_symbol_size]);
// write_output("txBuff.m","txSignal",&ue->common_vars.txdata[aa][ulsch_start],frame_parms->samples_per_tti,1,1);
// exit(-1);
/*
only for debug
LOG_I(PHY,"ul-signal [subframe: %d, ulsch_start %d, TA: %d, rxOffset: %d, timing_advance: %d, hw_timing_advance: %d]\n",subframe_tx, ulsch_start, ue->N_TA_offset, ue->rx_offset, ue->timing_advance, ue->hw_timing_advance);
......@@ -1593,7 +1597,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
}
if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
ue->generate_ul_signal[eNB_id] = 1;
ue->generate_ul_signal[subframe_tx][eNB_id] = 1;
// deactivate service request
// ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
......@@ -1894,7 +1898,7 @@ void ue_srs_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8
if(isSrsTxOccasion)
{
ue->generate_ul_signal[eNB_id] = 1;
ue->generate_ul_signal[subframe_tx][eNB_id] = 1;
if (ue->mac_enabled==1)
{
srs_power_cntl(ue,proc,eNB_id, (uint8_t*)(&nb_rb_srs), abstraction_flag);
......@@ -2172,7 +2176,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
// Part - IV
// Generate PUCCH signal
ue->generate_ul_signal[eNB_id] = 1;
ue->generate_ul_signal[subframe_tx][eNB_id] = 1;
switch (format) {
case pucch_format1:
......@@ -2339,28 +2343,62 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
}
// synchronization variables for slss/sldch/slsch
void phy_procedures_UE_SL_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc) {
int subframe_tx = proc->subframe_tx;
int frame_tx = proc->frame_tx;
SLSS_t *slss;
SLDCH_t *sldch;
SLSCH_t *slsch;
AssertFatal(frame_tx>=0 && frame_tx < 1024, "frame_tx %d is not in 0...1023\n");
AssertFatal(subframe_tx>=0 && subframe_tx < 10, "frame_tx %d is not in 0...1023\n");
LOG_I(PHY,"****** start Sidelink TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, subframe_tx);
LOG_D(PHY,"****** start Sidelink TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, subframe_tx);
if (ue->SLonly == 1) {
ue->tx_power_dBm[subframe_tx]=-127;
ue->generate_ul_signal[subframe_tx][0] = 0;
for (int aa=0; aa<ue->frame_parms.nb_antennas_tx; aa++) {
memset(&ue->common_vars.txdataF[aa][subframe_tx*ue->frame_parms.ofdm_symbol_size*ue->frame_parms.symbols_per_tti],
0,
ue->frame_parms.ofdm_symbol_size*ue->frame_parms.symbols_per_tti*sizeof(int32_t));
}
}
// check for SLBCH/SLSS
AssertFatal(0==pthread_mutex_lock(&ue->slss_mutex),"");
if ((ue->slss = ue_get_slss(ue->Mod_id,ue->CC_id,frame_tx,subframe_tx)) != NULL) check_and_generate_slss(ue,frame_tx,subframe_tx);
AssertFatal(0==pthread_mutex_unlock(&ue->slss_mutex),"");
// check for SLDCH
if ((sldch = ue_get_sldch(ue->Mod_id,ue->CC_id,frame_tx,subframe_tx)) != NULL) generate_sldch(ue,sldch,frame_tx,subframe_tx);
AssertFatal(0==pthread_mutex_lock(&ue->sldch_mutex),"");
if ((ue->sldch = ue_get_sldch(ue->Mod_id,ue->CC_id,frame_tx,subframe_tx)) != NULL) generate_sldch(ue,ue->sldch,frame_tx,subframe_tx);
AssertFatal(0==pthread_mutex_unlock(&ue->sldch_mutex),"");
LOG_D(PHY,"ULSCH (after sldch) : signal F energy %d dB (txdataF %p)\n",dB_fixed(signal_energy(&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size],14*ue->frame_parms.ofdm_symbol_size)),&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size]);
// check for SLSCH
if ((slsch = ue_get_slsch(ue->Mod_id,ue->CC_id,frame_tx,subframe_tx)) != NULL) generate_slsch(ue,proc,slsch,frame_tx,subframe_tx);
AssertFatal(0==pthread_mutex_lock(&ue->slsch_mutex),"");
if ((ue->slsch = ue_get_slsch(ue->Mod_id,ue->CC_id,frame_tx,subframe_tx)) != NULL) generate_slsch(ue,proc,ue->slsch,frame_tx,subframe_tx);
AssertFatal(0==pthread_mutex_unlock(&ue->slsch_mutex),"");
LOG_D(PHY,"ULSCH (after slsch) : signal F energy %d dB (txdataF %p)\n",dB_fixed(signal_energy(&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size],14*ue->frame_parms.ofdm_symbol_size)),&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size]);
LOG_D(PHY,"****** end Sidelink TX-Chain for AbsSubframe %d.%d (ul %d) ******\n", frame_tx, subframe_tx,
ue->generate_ul_signal[subframe_tx][0]);
if (ue->SLonly == 1) {
LOG_D(PHY,"ULSCH : signal F energy %d dB (txdataF %p)\n",dB_fixed(signal_energy(&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size],14*ue->frame_parms.ofdm_symbol_size)),&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size]);
ulsch_common_procedures(ue,frame_tx,subframe_tx, (ue->generate_ul_signal[subframe_tx][0] == 0));
}
}
void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) {
......@@ -2383,7 +2421,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui
T(T_UE_PHY_UL_TICK, T_INT(ue->Mod_id), T_INT(frame_tx%1024), T_INT(subframe_tx));
#endif
ue->generate_ul_signal[eNB_id] = 0;
ue->generate_ul_signal[subframe_tx][eNB_id] = 0;
#if UE_TIMING_TRACE
start_meas(&ue->phy_proc_tx);
#endif
......@@ -2420,8 +2458,9 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui
ulsch_common_procedures(ue,proc, (ue->generate_ul_signal[eNB_id] == 0));
ulsch_common_procedures(ue,frame_tx,subframe_tx, (ue->generate_ul_signal[subframe_tx][eNB_id] == 0));
if ((ue->UE_mode[eNB_id] == PRACH) &&
(ue->frame_parms.prach_config_common.prach_Config_enabled==1)) {
......
......@@ -3142,8 +3142,7 @@ SLSS_t *ue_get_slss(module_id_t Mod_id,int CC_id,frame_t frame_tx,sub_frame_t su
UE_MAC_INST *ue = &UE_mac_inst[Mod_id];
SLSS_t *slss = &UE_mac_inst[Mod_id].slss;
LOG_D(MAC,"frame_tx %d, subframe %d,slss->SL_OffsetIndicator %d\n",
frame_tx,subframe_tx,slss->SL_OffsetIndicator);
if ((((10*frame_tx) + subframe_tx)%40) != slss->SL_OffsetIndicator) slss->slmib_length=0;
else slss->slmib_length = mac_rrc_data_req_ue(Mod_id,
CC_id,
......@@ -3152,7 +3151,9 @@ SLSS_t *ue_get_slss(module_id_t Mod_id,int CC_id,frame_t frame_tx,sub_frame_t su
slss->slmib,
0,
0); // call RRC get check for SL-MIB
LOG_I(MAC,"frame_tx %d, subframe %d,slss->SL_OffsetIndicator %d, mib length %d, slmib %p\n",
frame_tx,subframe_tx,slss->SL_OffsetIndicator,slss->slmib_length, slss->slmib);
return(slss);
}
......
......@@ -249,6 +249,7 @@ void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correcti
init_UE_threads(inst);
UE = PHY_vars_UE_g[inst][0];
if (oaisim_flag == 0) {
ret = openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]);
......@@ -1540,7 +1541,12 @@ void init_UE_threads(int inst) {
}
if (UE->SLonly==0) pthread_create(&UE->proc.pthread_synch,NULL,UE_thread_synch,(void*)UE);
if (UE->sidelink_active==1) pthread_create(&UE->proc.pthread_synchSL,NULL,UE_thread_synchSL,(void*)UE);
if (UE->sidelink_active==1) {
pthread_mutex_init(&UE->slss_mutex,NULL);
pthread_mutex_init(&UE->sldch_mutex,NULL);
pthread_mutex_init(&UE->slsch_mutex,NULL);
pthread_create(&UE->proc.pthread_synchSL,NULL,UE_thread_synchSL,(void*)UE);
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment