hi, all:
  I create a vm with six nic, after the vm start, i delete tree nics.
all the three nic delete logic  will  happen in a thread ,  every nic delete 
has the following process:



int vnf_control_del_network(void *arg)

{
。。。。。

call_id = virConnectDomainEventRegisterAny(conn, dom, 
VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED, 
VIR_DOMAIN_EVENT_CALLBACK(vnf_control_del_network_cb), cb_para, 
vnf_control_del_network_cb_free);
flags |= VIR_DOMAIN_AFFECT_CONFIG;
    if (virDomainIsActive(dom) == 1) {
        flags |= VIR_DOMAIN_AFFECT_LIVE;
    }



ret = virDomainDetachDeviceFlags(dom, xml, flags); // detach a nic from vm 
guest os

。。。。
}

void vnf_control_del_network_cb(virConnectPtr conn,        virDomainPtr dom, 
const  char  *dev,void * opaque)   //this callback can't already trigger to run 
,why ?

{
    struct vnf_del_netwk_opaque * arg = (struct vnf_del_netwk_opaque *)opaque;
    ........ do someing;

    if(0 == virConnectDomainEventDeregisterAny(conn, arg->call_id))

      printf("succ to deRegister, conn:%p, call id:%d\n", conn, arg->call_id);
   else
     printf("fail to deRegister, conn:%p, call id:%d\n", conn, arg->call_id)

  

}


void* vnf_worker_proc(void *arg)
{

    vnf_mission_t *mission = NULL;
    pthread_t tid = pthread_self();
   
    vnf_task_ctx_t *task = vnf_task_get_task_info(tid);
    assert(task);
    pthread_detach(tid);
   
    while (1) {
        mission = vnf_mission_queue_get(task);
        if (mission == NULL) {
            sleep(1);
            continue;
        }
        VNF_IMAGE_DBG("tid:%lu, get one mission from  mission queue\n", tid);

        vnf_op_process(&mission->info);  //this cause vnf_control_del_network 
called

        if (mission) {
            vnf_mission_free(mission);
        }

        if(virEventRunDefaultImpl() < 0) {
             VNF_IMAGE_DBG("virEventRunDefaultImpl() called failure\n");
        }
       
    }


    return NULL;

}

Reply via email to