[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH RFC 49/59] libxl: Implement libxl_cpupool_info and Scheduler.FromString()



From: George Dunlap <george.dunlap@xxxxxxxxxx>

Unify the libxl_cpupoolinfo -> CpupoolInfo translation in a function.

Also make bitmapCToGo pass-by-value rather than pass-by-reference,
since it only has two elements and doesn't need to be modified.

Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxx>
---
 libxl.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 54 insertions(+), 10 deletions(-)

diff --git a/libxl.go b/libxl.go
index 8f16b1d..dfe4f40 100644
--- a/libxl.go
+++ b/libxl.go
@@ -234,7 +234,7 @@ func (Ctx *Context) DomainUnpause(Id Domid) (err error) {
  */
 
 // Return a Go bitmap which is a copy of the referred C bitmap.
-func bitmapCToGo(cbm *C.libxl_bitmap) (gbm Bitmap) {
+func bitmapCToGo(cbm C.libxl_bitmap) (gbm Bitmap) {
        // Alloc a Go slice for the bytes
        size := int(cbm.size)
        gbm.bitmap = make([]C.uint8_t, size)
@@ -338,7 +338,6 @@ func (a Bitmap) And(b Bitmap) (c Bitmap) {
 }
 
 // const char *libxl_scheduler_to_string(libxl_scheduler p);
-// int libxl_scheduler_from_string(const char *s, libxl_scheduler *e);
 func (s Scheduler) String() (string) {
        cs := C.libxl_scheduler_to_string(C.libxl_scheduler(s))
        // No need to free const return value
@@ -346,6 +345,32 @@ func (s Scheduler) String() (string) {
        return C.GoString(cs)
 }
 
+// int libxl_scheduler_from_string(const char *s, libxl_scheduler *e);
+func (s *Scheduler) FromString(gstr string) (err error) {
+       cstr := C.CString(gstr)
+       defer C.free(unsafe.Pointer(cstr))
+
+       var cs C.libxl_scheduler
+       ret := C.libxl_scheduler_from_string(cstr, &cs)
+       if ret != 0 {
+               err = fmt.Errorf("libxl_scheduler_from_string: %d\n", ret)
+               return
+       }
+
+       *s = Scheduler(cs)
+       return
+}
+
+func translateCpupoolInfoCToGo(cci C.libxl_cpupoolinfo) (gci CpupoolInfo) {
+       gci.Poolid = uint32(cci.poolid)
+       gci.PoolName = C.GoString(cci.pool_name)
+       gci.Scheduler = Scheduler(cci.sched)
+       gci.DomainCount = int(cci.n_dom)
+       gci.Cpumap = bitmapCToGo(cci.cpumap)
+
+       return
+}
+
 func SchedulerFromString(name string) (s Scheduler, err error) {
        cname := C.CString(name)
        defer C.free(unsafe.Pointer(cname))
@@ -385,20 +410,37 @@ func (Ctx *Context) ListCpupool() (list []CpupoolInfo) {
        cpupoolListSlice := (*[1 << 
30]C.libxl_cpupoolinfo)(unsafe.Pointer(c_cpupool_list))[:nbPool:nbPool]
 
        for i := range cpupoolListSlice {
-               var info CpupoolInfo
+               info := translateCpupoolInfoCToGo(cpupoolListSlice[i])
                
-               info.Poolid = uint32(cpupoolListSlice[i].poolid)
-               info.PoolName = C.GoString(cpupoolListSlice[i].pool_name)
-               info.Scheduler = Scheduler(cpupoolListSlice[i].sched)
-               info.DomainCount = int(cpupoolListSlice[i].n_dom)
-               info.Cpumap = bitmapCToGo(&cpupoolListSlice[i].cpumap)
-
                list = append(list, info)
        }
 
        return
 }
 
+// int libxl_cpupool_info(libxl_ctx *ctx, libxl_cpupoolinfo *info, uint32_t 
poolid);
+func (Ctx *Context) CpupoolInfo(Poolid uint32) (pool CpupoolInfo) {
+       err := Ctx.CheckOpen()
+       if err != nil {
+               return
+       }
+
+       var c_cpupool C.libxl_cpupoolinfo
+       
+       ret := C.libxl_cpupool_info(Ctx.ctx, &c_cpupool, C.uint32_t(Poolid))
+       if ret != 0 {
+               err = fmt.Errorf("libxl_cpupool_info failed: %d", ret)
+               return
+       }
+       defer C.libxl_cpupoolinfo_dispose(&c_cpupool)
+
+       pool = translateCpupoolInfoCToGo(c_cpupool)
+
+       return
+}
+
+
+
 // int libxl_cpupool_create(libxl_ctx *ctx, const char *name,
 //                          libxl_scheduler sched,
 //                          libxl_bitmap cpumap, libxl_uuid *uuid,
@@ -532,7 +574,6 @@ func (Ctx *Context) CpupoolCpuremoveCpumap(Poolid uint32, 
Cpumap Bitmap) (err er
 // int libxl_cpupool_cpuadd_node(libxl_ctx *ctx, uint32_t poolid, int node, 
int *cpus);
 // int libxl_cpupool_cpuremove_node(libxl_ctx *ctx, uint32_t poolid, int node, 
int *cpus);
 // int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t 
domid);
-// int libxl_cpupool_info(libxl_ctx *ctx, libxl_cpupoolinfo *info, uint32_t 
poolid);
 
 //
 // Utility functions
@@ -615,5 +656,8 @@ func XlTest(Args []string) {
                fmt.Printf("Pool id: %d\n", Poolid)
        }
 
+       pool = Ctx.CpupoolInfo(0)
+       fmt.Printf("Cpupool 0 info: %v\n", pool)
+       
        Ctx.Close()
 }
-- 
2.7.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.