<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="margin:0;">hi, all:</div><div style="margin:0;">  I create a vm with six nic, after the vm start, i delete tree nics.</div><div style="margin:0;">all the three nic delete logic  will  happen in a thread ,  every nic delete has the following process:<br></div><div style="margin:0;"><br></div><div style="margin:0;">int vnf_control_del_network(void *arg) <br></div><div style="margin:0;">{</div><div style="margin:0;">¡£¡£¡£¡£¡£<br></div><div style="margin:0;">call_id = virConnectDomainEventRegisterAny(conn, dom, <span style="background-color: rgb(221, 64, 50);">VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED</span>, VIR_DOMAIN_EVENT_CALLBACK(vnf_control_del_network_cb), cb_para, vnf_control_del_network_cb_free);</div><div style="margin:0;">flags |= VIR_DOMAIN_AFFECT_CONFIG;<br>    if (virDomainIsActive(dom) == 1) {<br>        flags |= VIR_DOMAIN_AFFECT_LIVE;<br>    }<br></div><div style="margin:0;"><br></div><div style="margin:0;">ret = virDomainDetachDeviceFlags(dom, xml, flags); // detach a nic from vm guest os<br></div><div style="margin:0;">¡£¡£¡£¡£</div><div style="margin:0;">}<br></div><div style="margin:0;">void vnf_control_del_network_cb(virConnectPtr conn,        virDomainPtr dom, const  char  *dev,void * opaque)   //<span style="background-color: rgb(221, 64, 50);">this callback can't already trigger to run £¬why ?</span><br></div><div style="margin:0;">{</div><div style="margin:0;">    struct vnf_del_netwk_opaque * arg = (struct vnf_del_netwk_opaque *)opaque;</div><div style="margin:0;">    ........ do someing;<br></div><div style="margin:0;">    if(0 == virConnectDomainEventDeregisterAny(conn, arg->call_id)) <br></div><div style="margin:0;">      printf("succ to deRegister, conn:%p, call id:%d\n", conn, arg->call_id);</div><div style="margin:0;">   else</div><div style="margin:0;">     printf("fail to deRegister, conn:%p, call id:%d\n", conn, arg->call_id)<br></div><div style="margin:0;">   <br></div><div style="margin:0;">}</div><div style="margin:0;"><br></div><div style="margin:0;">void* vnf_worker_proc(void *arg)<br>{<br><br>    vnf_mission_t *mission = NULL;<br>    pthread_t tid = pthread_self();<br>    <br>    vnf_task_ctx_t *task = vnf_task_get_task_info(tid);<br>    assert(task);<br>    pthread_detach(tid);<br>    <br>    while (1) {<br>        mission = vnf_mission_queue_get(task);<br>        if (mission == NULL) {<br>            sleep(1);<br>            continue;<br>        }<br>        VNF_IMAGE_DBG("tid:%lu, get one mission from  mission queue\n", tid);<br><br>        vnf_op_process(&mission->info);  //this cause <span style="background-color: rgb(221, 64, 50);">vnf_control_del_network</span> called<br><br>        if (mission) {<br>            vnf_mission_free(mission);<br>        }<br><br>        if(<span style="background-color: rgb(221, 64, 50);">virEventRunDefaultImpl</span>() < 0) {<br>             VNF_IMAGE_DBG("virEventRunDefaultImpl() called failure\n");<br>        }<br>        <br>    }<br><br><br>    return NULL;<br><br>}<br></div></div><br><br><span title="neteasefooter"><p> </p></span>