# HG changeset patch
# User "Vadim Zaliva <lord@crocodile.org>"
# Date 1206752781 25200
# Node ID 98289648fd5e705f3537653d6c6b2f5130a33a76
# Parent  b3dd1c9e90261b32a0fe123ac801c89c921f7e8c
implemented Domain.pin_vcpu method

diff -r b3dd1c9e9026 -r 98289648fd5e ext/libvirt/_libvirt.c
--- a/ext/libvirt/_libvirt.c	Fri Mar 28 11:33:43 2008 -0700
+++ b/ext/libvirt/_libvirt.c	Fri Mar 28 18:06:21 2008 -0700
@@ -777,6 +777,41 @@
 
     r = virDomainSetVcpus(dom, NUM2UINT(nvcpus));
     _E(r < 0, conn(s), "virDomainSetVcpus");
+
+    return r;
+}
+
+/*
+ * Call +virDomainPinVcpu+[http://www.libvirt.org/html/libvirt-libvirt.html#virDomainPinVcpu]
+ */
+VALUE libvirt_dom_pin_vcpu(VALUE s, VALUE vcpu, VALUE cpulist) {
+    virDomainPtr dom = domain_get(s);
+    int r,i,nvcpu,len,maplen;
+    unsigned char *cpumap;
+    virNodeInfo nodeinfo;
+    virConnectPtr c = conn(s);
+    
+    r = virNodeGetInfo(c, &nodeinfo);
+    _E(r < 0, c, "virNodeGetInfo");
+
+    maplen = VIR_CPU_MAPLEN(nodeinfo.cpus);
+    cpumap = malloc(maplen);
+    if(!cpumap)
+        rb_raise(rb_eSystemCallError, "malloc failed");
+        
+    memset(cpumap,0,maplen);
+    
+    nvcpu = NUM2UINT(vcpu);
+    len = RARRAY(cpulist)->len;
+    for(i=0;i<len;i++)
+    {
+        VALUE e=rb_ary_entry(cpulist,i);
+        VIR_USE_CPU(cpumap,NUM2UINT(e));
+    }
+    
+    r = virDomainPinVcpu(dom,nvcpu,cpumap,maplen);
+    free(cpumap);
+    _E(r < 0, c, "virDomainPinVcpu");
 
     return r;
 }
@@ -1616,6 +1651,7 @@
     rb_define_method(c_domain, "memory=", libvirt_dom_memory_set, 1);
     rb_define_method(c_domain, "max_vcpus", libvirt_dom_max_vcpus, 0);
     rb_define_method(c_domain, "vcpus=", libvirt_dom_vcpus_set, 1);
+    rb_define_method(c_domain, "pin_vcpu", libvirt_dom_pin_vcpu, 2);
     rb_define_method(c_domain, "xml_desc", libvirt_dom_xml_desc, 0);
     rb_define_method(c_domain, "undefine", libvirt_dom_undefine, 0);
     rb_define_method(c_domain, "create", libvirt_dom_create, 0);
diff -r b3dd1c9e9026 -r 98289648fd5e tests/tc_connect.rb
--- a/tests/tc_connect.rb	Fri Mar 28 11:33:43 2008 -0700
+++ b/tests/tc_connect.rb	Fri Mar 28 18:06:21 2008 -0700
@@ -109,6 +109,8 @@
         info = dom.info
         assert_equal(2097152/2, info.memory)
         assert_equal(1, info.nr_virt_cpu)
+
+        dom.pin_vcpu(0,[0])
     end
 
     def test_network
