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; }