* [PATCH RFC v3 2/8] golang/xenlight: Add error constants and standard handling
2017-03-09 18:56 [PATCH RFC v3 1/8] golang/xenlight: Create stub package Ronald Rojas
@ 2017-03-09 18:56 ` Ronald Rojas
2017-03-09 18:56 ` [PATCH RFC v3 3/8] golang/xenlight: Add host-related functionality Ronald Rojas
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Ronald Rojas @ 2017-03-09 18:56 UTC (permalink / raw)
Cc: Ronald Rojas, wei.liu2, ian.jackson, george.dunlap, xen-devel
Create error type Errorxl for throwing proper xenlight
errors.
Update Ctx functions to throw Errorxl errors.
Signed-off-by: Ronald Rojas <ronladred@gmail.com>
---
CC: xen-devel@lists.xen.org
CC: george.dunlap@citrix.com
CC: ian.jackson@eu.citrix.com
CC: wei.liu2@citrix.com
---
---
tools/golang/xenlight/xenlight.go | 78 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 76 insertions(+), 2 deletions(-)
diff --git a/tools/golang/xenlight/xenlight.go b/tools/golang/xenlight/xenlight.go
index b025961..a99d9d3 100644
--- a/tools/golang/xenlight/xenlight.go
+++ b/tools/golang/xenlight/xenlight.go
@@ -37,8 +37,71 @@ import (
)
/*
+ * Errors
+ */
+
+type Error int
+
+const (
+ ErrorNonspecific = Error(-C.ERROR_NONSPECIFIC)
+ ErrorVersion = Error(-C.ERROR_VERSION)
+ ErrorFail = Error(-C.ERROR_FAIL)
+ ErrorNi = Error(-C.ERROR_NI)
+ ErrorNomem = Error(-C.ERROR_NOMEM)
+ ErrorInval = Error(-C.ERROR_INVAL)
+ ErrorBadfail = Error(-C.ERROR_BADFAIL)
+ ErrorGuestTimedout = Error(-C.ERROR_GUEST_TIMEDOUT)
+ ErrorTimedout = Error(-C.ERROR_TIMEDOUT)
+ ErrorNoparavirt = Error(-C.ERROR_NOPARAVIRT)
+ ErrorNotReady = Error(-C.ERROR_NOT_READY)
+ ErrorOseventRegFail = Error(-C.ERROR_OSEVENT_REG_FAIL)
+ ErrorBufferfull = Error(-C.ERROR_BUFFERFULL)
+ ErrorUnknownChild = Error(-C.ERROR_UNKNOWN_CHILD)
+ ErrorLockFail = Error(-C.ERROR_LOCK_FAIL)
+ ErrorJsonConfigEmpty = Error(-C.ERROR_JSON_CONFIG_EMPTY)
+ ErrorDeviceExists = Error(-C.ERROR_DEVICE_EXISTS)
+ ErrorCheckpointDevopsDoesNotMatch = Error(-C.ERROR_CHECKPOINT_DEVOPS_DOES_NOT_MATCH)
+ ErrorCheckpointDeviceNotSupported = Error(-C.ERROR_CHECKPOINT_DEVICE_NOT_SUPPORTED)
+ ErrorVnumaConfigInvalid = Error(-C.ERROR_VNUMA_CONFIG_INVALID)
+ ErrorDomainNotfound = Error(-C.ERROR_DOMAIN_NOTFOUND)
+ ErrorAborted = Error(-C.ERROR_ABORTED)
+ ErrorNotfound = Error(-C.ERROR_NOTFOUND)
+ ErrorDomainDestroyed = Error(-C.ERROR_DOMAIN_DESTROYED)
+ ErrorFeatureRemoved = Error(-C.ERROR_FEATURE_REMOVED)
+)
+
+var errors = [...]string{
+ ErrorNonspecific: "Non-specific error",
+ ErrorVersion: "Wrong version",
+ ErrorFail: "Failed",
+ ErrorNi: "Not Implemented",
+ ErrorNomem: "No memory",
+ ErrorInval: "Invalid argument",
+ ErrorBadfail: "Bad Fail",
+ ErrorGuestTimedout: "Guest timed out",
+ ErrorTimedout: "Timed out",
+ ErrorNoparavirt: "No Paravirtualization",
+ ErrorNotReady: "Not ready",
+ ErrorOseventRegFail: "OS event registration failed",
+ ErrorBufferfull: "Buffer full",
+ ErrorUnknownChild: "Unknown child",
+ ErrorLockFail: "Lock failed",
+ ErrorJsonConfigEmpty: "JSON config empty",
+ ErrorDeviceExists: "Device exists",
+ ErrorCheckpointDevopsDoesNotMatch: "Checkpoint devops does not match",
+ ErrorCheckpointDeviceNotSupported: "Checkpoint device not supported",
+ ErrorVnumaConfigInvalid: "VNUMA config invalid",
+ ErrorDomainNotfound: "Domain not found",
+ ErrorAborted: "Aborted",
+ ErrorNotfound: "Not found",
+ ErrorDomainDestroyed: "Domain destroyed",
+ ErrorFeatureRemoved: "Feature removed",
+}
+
+/*
* Types: Builtins
*/
+
type Context struct {
ctx *C.libxl_ctx
}
@@ -50,6 +113,17 @@ var Ctx Context
var logger *C.xentoollog_logger_stdiostream
+func (e Error) Error() string {
+ if 0 < int(e) && int(e) < len(errors) {
+ s := errors[e]
+ if s != "" {
+ return s
+ }
+ }
+ return fmt.Sprintf("libxl error: %d", -e)
+
+}
+
func (Ctx *Context) IsOpen() bool {
return Ctx.ctx != nil
}
@@ -64,7 +138,7 @@ func (Ctx *Context) Open() (err error) {
0, unsafe.Pointer(logger))
if ret != 0 {
- err = fmt.Errorf("Error: %d", -ret)
+ err = Error(-ret)
}
return
}
@@ -74,7 +148,7 @@ func (Ctx *Context) Close() (err error) {
Ctx.ctx = nil
if ret != 0 {
- err = fmt.Errorf("Error: %d", -ret)
+ err = Error(-ret)
}
C.xtl_logger_destroy(unsafe.Pointer(logger))
return
--
2.7.3
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH RFC v3 5/8] golang/xenlight: Add tests host related functionality functions
2017-03-09 18:56 [PATCH RFC v3 1/8] golang/xenlight: Create stub package Ronald Rojas
` (2 preceding siblings ...)
2017-03-09 18:56 ` [PATCH RFC v3 4/8] golang/xenlight: Implement libxl_domain_info and libxl_domain_unpause Ronald Rojas
@ 2017-03-09 18:56 ` Ronald Rojas
2017-03-09 18:56 ` [PATCH RFC v3 6/8] golang/xenlight: Implement libxl_bitmap and helper operations Ronald Rojas
4 siblings, 0 replies; 6+ messages in thread
From: Ronald Rojas @ 2017-03-09 18:56 UTC (permalink / raw)
Cc: Ronald Rojas, wei.liu2, ian.jackson, George Dunlap, xen-devel
Create tests for the following functions:
- GetVersionInfo
- GetPhysinfo
- GetDominfo
- GetMaxCpus
- GetOnlineCpus
- GetMaxNodes
- GetFreeMemory
Signed-off-by: Ronald Rojas <ronladred@gmail.com>
Signed-off-by: George Dunlap <george.dunlap@citrix.com>
---
changes since last version
- created CFLAGS and LDLIBS variables to build test C
files with required dependencies.
- created create_context and destroy_context function
for tests to create/destroy libxl_ctx and xenlogger
- Formating changes
- Removed stale comments
- Removed redundant error checks in Golang tests
CC: xen-devel@lists.xen.org
CC: george.dunlap@citrix.com
CC: ian.jackson@eu.citrix.com
CC: wei.liu2@citrix.com
---
---
tools/golang/xenlight/test/xeninfo/Makefile | 41 +++++++++++++++++++++++
tools/golang/xenlight/test/xeninfo/dominfo.c | 33 ++++++++++++++++++
tools/golang/xenlight/test/xeninfo/dominfo.go | 31 +++++++++++++++++
tools/golang/xenlight/test/xeninfo/freememory.c | 26 ++++++++++++++
tools/golang/xenlight/test/xeninfo/freememory.go | 25 ++++++++++++++
tools/golang/xenlight/test/xeninfo/maxcpu.c | 18 ++++++++++
tools/golang/xenlight/test/xeninfo/maxcpu.go | 24 +++++++++++++
tools/golang/xenlight/test/xeninfo/maxnodes.c | 15 +++++++++
tools/golang/xenlight/test/xeninfo/maxnodes.go | 24 +++++++++++++
tools/golang/xenlight/test/xeninfo/onlinecpu.c | 18 ++++++++++
tools/golang/xenlight/test/xeninfo/onlinecpu.go | 24 +++++++++++++
tools/golang/xenlight/test/xeninfo/physinfo.c | 32 ++++++++++++++++++
tools/golang/xenlight/test/xeninfo/physinfo.go | 32 ++++++++++++++++++
tools/golang/xenlight/test/xeninfo/print.h | 22 ++++++++++++
tools/golang/xenlight/test/xeninfo/versioninfo.c | 22 ++++++++++++
tools/golang/xenlight/test/xeninfo/versioninfo.go | 28 ++++++++++++++++
tools/golang/xenlight/test/xeninfo/xenlight.go | 1 +
17 files changed, 416 insertions(+)
create mode 100644 tools/golang/xenlight/test/xeninfo/Makefile
create mode 100644 tools/golang/xenlight/test/xeninfo/dominfo.c
create mode 100644 tools/golang/xenlight/test/xeninfo/dominfo.go
create mode 100644 tools/golang/xenlight/test/xeninfo/freememory.c
create mode 100644 tools/golang/xenlight/test/xeninfo/freememory.go
create mode 100644 tools/golang/xenlight/test/xeninfo/maxcpu.c
create mode 100644 tools/golang/xenlight/test/xeninfo/maxcpu.go
create mode 100644 tools/golang/xenlight/test/xeninfo/maxnodes.c
create mode 100644 tools/golang/xenlight/test/xeninfo/maxnodes.go
create mode 100644 tools/golang/xenlight/test/xeninfo/onlinecpu.c
create mode 100644 tools/golang/xenlight/test/xeninfo/onlinecpu.go
create mode 100644 tools/golang/xenlight/test/xeninfo/physinfo.c
create mode 100644 tools/golang/xenlight/test/xeninfo/physinfo.go
create mode 100644 tools/golang/xenlight/test/xeninfo/print.h
create mode 100644 tools/golang/xenlight/test/xeninfo/versioninfo.c
create mode 100644 tools/golang/xenlight/test/xeninfo/versioninfo.go
create mode 120000 tools/golang/xenlight/test/xeninfo/xenlight.go
diff --git a/tools/golang/xenlight/test/xeninfo/Makefile b/tools/golang/xenlight/test/xeninfo/Makefile
new file mode 100644
index 0000000..aae5544
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/Makefile
@@ -0,0 +1,41 @@
+XEN_ROOT = $(CURDIR)/../../../../..
+include $(XEN_ROOT)/tools/Rules.mk
+
+GO ?= go
+
+TESTS = dominfo freememory maxcpu onlinecpu physinfo versioninfo
+CBINARIES = $(TESTS:%=%-c)
+GOBINARIES = $(TESTS:%=%-go)
+
+CFLAGS += -Werror
+CFLAGS += $(CFLAGS_libxentoollog)
+CFLAGS += $(CFLAGS_libxenlight)
+
+LDLIBS += $(LDLIBS_libxentoollog)
+LDLIBS += $(LDLIBS_libxenlight)
+
+all: build
+
+test: clean build
+ for test in $(TESTS) ; do \
+ ./$$test-c >> c.output ; \
+ ./$$test-go >> go.output ; \
+ if cmp -s "c.output" "go.output"; then\
+ echo "$$test PASSED";\
+ else \
+ echo "$$test FAILED";\
+ fi ; \
+ done
+
+build: $(CBINARIES) $(GOBINARIES)
+
+%-c: %.c
+ gcc $(CFLAGS) -o $@ $< $(LDLIBS)
+
+%-go: %.go
+ GOPATH=$(XEN_ROOT)/tools/golang $(GO) build -o $@ $<
+
+clean:
+ rm -f *-c
+ rm -f *-go
+ rm -f *.output
diff --git a/tools/golang/xenlight/test/xeninfo/dominfo.c b/tools/golang/xenlight/test/xeninfo/dominfo.c
new file mode 100644
index 0000000..2c63583
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/dominfo.c
@@ -0,0 +1,33 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <libxl.h>
+#include "print.h"
+
+int main(void){
+
+ libxl_ctx *context;
+ libxl_dominfo info;
+ int err;
+ long cpu_time;
+ context = create_context();
+ libxl_dominfo_init(&info);
+ err = libxl_domain_info(context, &info, 0);
+ if (err != 0)
+ return err;
+
+ printf("%d\n%d\n", info.domid, info.ssidref);
+ printf("%s\n%s\n%s\n%s\n%s\n%s\n", bool_to_string(info.running),
+ bool_to_string(info.blocked), bool_to_string(info.paused),
+ bool_to_string(info.shutdown), bool_to_string(info.dying),
+ bool_to_string(info.never_stop));
+ cpu_time = info.cpu_time / ((long) 1<<35);
+ printf("%d\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%d\n%d\n%d\n",
+ info.shutdown_reason,
+ info.outstanding_memkb, info.current_memkb, info.shared_memkb,
+ info.paged_memkb, info.max_memkb, cpu_time, info.vcpu_max_id,
+ info.vcpu_online, info.cpupool);
+ printf("%d\n", info.domain_type);
+
+ destroy_context(context);
+
+}
diff --git a/tools/golang/xenlight/test/xeninfo/dominfo.go b/tools/golang/xenlight/test/xeninfo/dominfo.go
new file mode 100644
index 0000000..bb9257b
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/dominfo.go
@@ -0,0 +1,31 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "xenproject.org/xenlight"
+)
+
+func main() {
+ ctx := xenlight.Ctx
+ err := ctx.Open()
+ if err != nil {
+ os.Exit(-1)
+ }
+ defer ctx.Close()
+ info, err := ctx.DomainInfo(0)
+ if err != nil {
+ os.Exit(-1)
+ }
+
+ fmt.Printf("%d\n%d\n", info.Domid, info.Ssidref)
+ //fmt.Printf("%s\n", info.SsidLabel)
+ fmt.Printf("%t\n%t\n%t\n%t\n%t\n%t\n", info.Running,
+ info.Blocked, info.Paused, info.Shutdown, info.Dying, info.NeverStop)
+ cpuTime := info.CpuTime / (1 << 35)
+ fmt.Printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n", info.ShutdownReason, info.OutstandingMemkb,
+ info.CurrentMemkb, info.SharedMemkb, info.PagedMemkb, info.MaxMemkb, cpuTime,
+ info.VcpuMaxId, info.VcpuOnline, info.Cpupool)
+ fmt.Printf("%d\n", info.DomainType)
+
+}
diff --git a/tools/golang/xenlight/test/xeninfo/freememory.c b/tools/golang/xenlight/test/xeninfo/freememory.c
new file mode 100644
index 0000000..0fcaa1f
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/freememory.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <libxl.h>
+#include "print.h"
+
+int main(void){
+
+ libxl_ctx *context;
+ uint64_t free_memory;
+ int err;
+
+ context = create_context();
+
+ err = libxl_get_free_memory(context, &free_memory);
+ if (err < 0)
+ {
+ printf("%d\n", err);
+ }
+ else
+ {
+ printf("%lu\n", free_memory);
+ }
+ destroy_context(context);
+
+}
+
diff --git a/tools/golang/xenlight/test/xeninfo/freememory.go b/tools/golang/xenlight/test/xeninfo/freememory.go
new file mode 100644
index 0000000..2fcaf58
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/freememory.go
@@ -0,0 +1,25 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "xenproject.org/xenlight"
+)
+
+func main() {
+ ctx := xenlight.Ctx
+ err := ctx.Open()
+ if err != nil {
+ os.Exit(-1)
+ }
+
+ defer ctx.Close()
+
+ free_memory, err := ctx.GetFreeMemory()
+ if err != nil {
+ fmt.Printf("%d\n", err)
+ } else {
+ fmt.Printf("%d\n", free_memory)
+ }
+
+}
diff --git a/tools/golang/xenlight/test/xeninfo/maxcpu.c b/tools/golang/xenlight/test/xeninfo/maxcpu.c
new file mode 100644
index 0000000..a57bdb2
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/maxcpu.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <libxl.h>
+#include "print.h"
+
+int main(void){
+
+ libxl_ctx *context;
+ int max_cpus;
+
+ context = create_context();
+ max_cpus = libxl_get_max_cpus(context);
+ printf("%d\n", max_cpus);
+
+ destroy_context(context);
+
+}
+
diff --git a/tools/golang/xenlight/test/xeninfo/maxcpu.go b/tools/golang/xenlight/test/xeninfo/maxcpu.go
new file mode 100644
index 0000000..92cd93d
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/maxcpu.go
@@ -0,0 +1,24 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "xenproject.org/xenlight"
+)
+
+func main() {
+ ctx := xenlight.Ctx
+ err := ctx.Open()
+ if err != nil {
+ os.Exit(-1)
+ }
+ defer ctx.Close()
+
+ max_cpus, err := ctx.GetMaxCpus()
+ if err != nil {
+ fmt.Printf("%d\n", err)
+ } else {
+ fmt.Printf("%d\n", max_cpus)
+ }
+
+}
diff --git a/tools/golang/xenlight/test/xeninfo/maxnodes.c b/tools/golang/xenlight/test/xeninfo/maxnodes.c
new file mode 100644
index 0000000..e072c3e
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/maxnodes.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <libxl.h>
+
+int main(){
+
+ libxl_ctx *context;
+ context = create_context();
+
+ int max_nodes = libxl_get_max_nodes(context);
+ printf("%d\n", max_nodes);
+
+ destroy_context(context);
+}
+
diff --git a/tools/golang/xenlight/test/xeninfo/maxnodes.go b/tools/golang/xenlight/test/xeninfo/maxnodes.go
new file mode 100644
index 0000000..da9b495
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/maxnodes.go
@@ -0,0 +1,24 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "xenproject.org/xenlight"
+)
+
+func main() {
+ ctx := xenlight.Ctx
+ err := ctx.Open()
+ if err != nil {
+ os.Exit(-1)
+ }
+ defer ctx.Close()
+
+ max_nodes, err := ctx.GetMaxNodes()
+ if err != nil {
+ fmt.Printf("%d\n", err)
+ } else {
+ fmt.Printf("%d\n", max_nodes)
+ }
+
+}
diff --git a/tools/golang/xenlight/test/xeninfo/onlinecpu.c b/tools/golang/xenlight/test/xeninfo/onlinecpu.c
new file mode 100644
index 0000000..46939d6
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/onlinecpu.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <libxl.h>
+#include "print.h"
+
+int main(void){
+
+ libxl_ctx *context;
+ int online_cpus;
+ context = create_context();
+
+ online_cpus = libxl_get_online_cpus(context);
+ printf("%d\n", online_cpus);
+
+ destroy_context(context);
+
+}
+
diff --git a/tools/golang/xenlight/test/xeninfo/onlinecpu.go b/tools/golang/xenlight/test/xeninfo/onlinecpu.go
new file mode 100644
index 0000000..b6d1da7
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/onlinecpu.go
@@ -0,0 +1,24 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "xenproject.org/xenlight"
+)
+
+func main() {
+ ctx := xenlight.Ctx
+ err := ctx.Open()
+ if err != nil {
+ os.Exit(-1)
+ }
+ defer ctx.Close()
+
+ online_cpus, err := ctx.GetOnlineCpus()
+ if err != nil {
+ fmt.Printf("%d\n", err)
+ } else {
+ fmt.Printf("%d\n", online_cpus)
+ }
+
+}
diff --git a/tools/golang/xenlight/test/xeninfo/physinfo.c b/tools/golang/xenlight/test/xeninfo/physinfo.c
new file mode 100644
index 0000000..541a730
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/physinfo.c
@@ -0,0 +1,32 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <libxl.h>
+#include "print.h"
+
+int main(void){
+
+ libxl_ctx *context;
+ libxl_physinfo info;
+ int err;
+ int i;
+ context = create_context();
+ libxl_physinfo_init(&info);
+ err= libxl_get_physinfo(context,&info);
+ if(err != 0){
+ return err;
+ }
+
+ printf("%d\n%d\n%d\n%d\n%d\n", info.threads_per_core, info.cores_per_socket, info.max_cpu_id, info.nr_cpus, info.cpu_khz);
+ printf("%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n", info.total_pages, info.free_pages, info.scrub_pages, info.outstanding_pages, info.sharing_freed_pages, info.sharing_used_frames);
+ printf("%u\n",info.nr_nodes);
+ printf("%s\n%s\n", bool_to_string(info.cap_hvm), bool_to_string(info.cap_hvm_directio));
+
+ for(i = 0; i < 8; i++){
+ printf("%u\n", info.hw_cap[i]);
+ }
+
+ libxl_physinfo_init(&info);
+ destroy_context(context);
+
+}
+
diff --git a/tools/golang/xenlight/test/xeninfo/physinfo.go b/tools/golang/xenlight/test/xeninfo/physinfo.go
new file mode 100644
index 0000000..cf7bdd4
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/physinfo.go
@@ -0,0 +1,32 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "xenproject.org/xenlight"
+)
+
+func main() {
+ ctx := xenlight.Ctx
+ err := ctx.Open()
+ if err != nil {
+ os.Exit(-1)
+ }
+ defer ctx.Close()
+ info, err := ctx.GetPhysinfo()
+ if err != nil {
+ os.Exit(-1)
+ }
+
+ fmt.Printf("%d\n%d\n%d\n%d\n%d\n", info.ThreadsPerCore, info.CoresPerSocket,
+ info.MaxCpuId, info.NrCpus, info.CpuKhz)
+ fmt.Printf("%d\n%d\n%d\n%d\n%d\n%d\n", info.TotalPages, info.FreePages,
+ info.ScrubPages, info.OutstandingPages, info.SharingFreedPages,
+ info.SharingUsedFrames)
+ fmt.Printf("%d\n", info.NrNodes)
+ fmt.Printf("%t\n%t\n", info.CapHvm, info.CapHvmDirectio)
+
+ for i := 0; i < 8; i++ {
+ fmt.Printf("%d\n", info.HwCap[i])
+ }
+}
diff --git a/tools/golang/xenlight/test/xeninfo/print.h b/tools/golang/xenlight/test/xeninfo/print.h
new file mode 100644
index 0000000..dd6c987
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/print.h
@@ -0,0 +1,22 @@
+xentoollog_logger_stdiostream *logger;
+
+static inline char *bool_to_string(bool a){
+ return (a ? "true" : "false");
+}
+
+static inline libxl_ctx *create_context(void){
+ libxl_ctx *context;
+ logger = xtl_createlogger_stdiostream(stderr,
+ XTL_ERROR, 0);
+ libxl_ctx_alloc(&context, LIBXL_VERSION, 0 , (xentoollog_logger*)logger);
+ return context;
+}
+
+static inline int destroy_context(libxl_ctx *context){
+ int err = libxl_ctx_free(context);
+ if (err != 0)
+ return err;
+ xtl_logger_destroy((xentoollog_logger*)logger);
+ return err;
+
+}
diff --git a/tools/golang/xenlight/test/xeninfo/versioninfo.c b/tools/golang/xenlight/test/xeninfo/versioninfo.c
new file mode 100644
index 0000000..113bcea
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/versioninfo.c
@@ -0,0 +1,22 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <libxl.h>
+#include "print.h"
+
+int main(void){
+
+ libxl_ctx *context;
+ const libxl_version_info * info;
+ context = create_context();
+ info = libxl_get_version_info(context);
+
+ printf("%d\n%d\n", info->xen_version_major, info->xen_version_minor);
+ printf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n", info->xen_version_extra, info->compiler,
+ info->compile_by, info->compile_domain, info->compile_date,
+ info->capabilities, info->changeset);
+ printf("%lu\n%d\n", info->virt_start, info->pagesize);
+ printf("%s\n%s\n", info->commandline, info->build_id);
+
+ destroy_context(context);
+
+}
diff --git a/tools/golang/xenlight/test/xeninfo/versioninfo.go b/tools/golang/xenlight/test/xeninfo/versioninfo.go
new file mode 100644
index 0000000..5545472
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/versioninfo.go
@@ -0,0 +1,28 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "xenproject.org/xenlight"
+)
+
+func main() {
+ ctx := xenlight.Ctx
+ err := ctx.Open()
+ if err != nil {
+ os.Exit(-1)
+ }
+ defer ctx.Close()
+ info, err := ctx.GetVersionInfo()
+ if err != nil {
+ os.Exit(-1)
+ }
+
+ fmt.Printf("%d\n%d\n", info.XenVersionMajor, info.XenVersionMinor)
+ fmt.Printf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n", info.XenVersionExtra, info.Compiler,
+ info.CompileBy, info.CompileDomain, info.CompileDate, info.Capabilities,
+ info.Changeset)
+ fmt.Printf("%d\n%d\n", info.VirtStart, info.Pagesize)
+ fmt.Printf("%s\n%s\n", info.Commandline, info.BuildId)
+
+}
diff --git a/tools/golang/xenlight/test/xeninfo/xenlight.go b/tools/golang/xenlight/test/xeninfo/xenlight.go
new file mode 120000
index 0000000..693da7b
--- /dev/null
+++ b/tools/golang/xenlight/test/xeninfo/xenlight.go
@@ -0,0 +1 @@
+../../xenlight.go/usr/local/go/src/xenproject.org/xenlight/xenlight.go
\ No newline at end of file
--
2.7.3
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH RFC v3 6/8] golang/xenlight: Implement libxl_bitmap and helper operations
2017-03-09 18:56 [PATCH RFC v3 1/8] golang/xenlight: Create stub package Ronald Rojas
` (3 preceding siblings ...)
2017-03-09 18:56 ` [PATCH RFC v3 5/8] golang/xenlight: Add tests host related functionality functions Ronald Rojas
@ 2017-03-09 18:56 ` Ronald Rojas
4 siblings, 0 replies; 6+ messages in thread
From: Ronald Rojas @ 2017-03-09 18:56 UTC (permalink / raw)
Cc: Ronald Rojas, wei.liu2, ian.jackson, George Dunlap, xen-devel
Implement Bitmap type, along with helper functions.
The Bitmap type is implemented interllay in a way which makes it
easy to copy into and out of the C libxl_bitmap type.
Signed-off-by: George Dunlap <george.dunlap@citrix.com>
Signed-off-by: Ronald Rojas <ronladred@gmail.com>
---
CC: xen-devel@lists.xen.org
CC: george.dunlap@citrix.com
CC: ian.jackson@eu.citrix.com
CC: wei.liu2@citrix.com
---
---
tools/golang/xenlight/xenlight.go | 167 ++++++++++++++++++++++++++++++++++++++
1 file changed, 167 insertions(+)
diff --git a/tools/golang/xenlight/xenlight.go b/tools/golang/xenlight/xenlight.go
index 34c3050..eb2b3cf 100644
--- a/tools/golang/xenlight/xenlight.go
+++ b/tools/golang/xenlight/xenlight.go
@@ -129,6 +129,20 @@ func (chwcap C.libxl_hwcap) toGo() (ghwcap Hwcap) {
return
}
+// typedef struct {
+// uint32_t size; /* number of bytes in map */
+// uint8_t *map;
+// } libxl_bitmap;
+
+// Implement the Go bitmap type such that the underlying data can
+// easily be copied in and out. NB that we still have to do copies
+// both directions, because cgo runtime restrictions forbid passing to
+// a C function a pointer to a Go-allocated structure which contains a
+// pointer.
+type Bitmap struct {
+ bitmap []C.uint8_t
+}
+
/*
* Types: IDL
*
@@ -298,6 +312,159 @@ func (cdi *C.libxl_dominfo) toGo() (di *Dominfo) {
}
/*
+ * Bitmap operations
+ */
+
+// Return a Go bitmap which is a copy of the referred C bitmap.
+func (cbm C.libxl_bitmap) toGo() (gbm Bitmap) {
+ // Alloc a Go slice for the bytes
+ size := int(cbm.size)
+ gbm.bitmap = make([]C.uint8_t, size)
+
+ // Make a slice pointing to the C array
+ mapslice := (*[1 << 30]C.uint8_t)(unsafe.Pointer(cbm._map))[:size:size]
+
+ // And copy the C array into the Go array
+ copy(gbm.bitmap, mapslice)
+
+ return
+}
+
+// Must be C.libxl_bitmap_dispose'd of afterwards
+func (gbm Bitmap) toC() (cbm C.libxl_bitmap) {
+ C.libxl_bitmap_init(&cbm)
+
+ size := len(gbm.bitmap)
+ cbm._map = (*C.uint8_t)(C.malloc(C.size_t(size)))
+ cbm.size = C.uint32_t(size)
+ if cbm._map == nil {
+ panic("C.calloc failed!")
+ }
+
+ // Make a slice pointing to the C array
+ mapslice := (*[1 << 30]C.uint8_t)(unsafe.Pointer(cbm._map))[:size:size]
+
+ // And copy the Go array into the C array
+ copy(mapslice, gbm.bitmap)
+
+ return
+}
+
+func (bm *Bitmap) Test(bit int) bool {
+ ubit := uint(bit)
+ if bit > bm.Max() || bm.bitmap == nil {
+ return false
+ }
+
+ return (bm.bitmap[bit/8] & (1 << (ubit & 7))) != 0
+}
+
+func (bm *Bitmap) Set(bit int) {
+ ibit := bit / 8
+ if ibit+1 > len(bm.bitmap) {
+ bm.bitmap = append(bm.bitmap, make([]C.uint8_t, ibit+1-len(bm.bitmap))...)
+ }
+
+ bm.bitmap[ibit] |= 1 << (uint(bit) & 7)
+}
+
+func (bm *Bitmap) SetRange(start int, end int) {
+ for i := start; i <= end; i++ {
+ bm.Set(i)
+ }
+}
+
+func (bm *Bitmap) Clear(bit int) {
+ ubit := uint(bit)
+ if bit > bm.Max() || bm.bitmap == nil {
+ return
+ }
+
+ bm.bitmap[bit/8] &= ^(1 << (ubit & 7))
+}
+
+func (bm *Bitmap) ClearRange(start int, end int) {
+ for i := start; i <= end; i++ {
+ bm.Clear(i)
+ }
+}
+
+func (bm *Bitmap) Max() int {
+ return len(bm.bitmap)*8 - 1
+}
+
+func (bm *Bitmap) IsEmpty() bool {
+ for i := 0; i < len(bm.bitmap); i++ {
+ if bm.bitmap[i] != 0 {
+ return false
+ }
+ }
+ return true
+}
+
+func (a Bitmap) And(b Bitmap) (c Bitmap) {
+ var max, min int
+ if len(a.bitmap) > len(b.bitmap) {
+ max = len(a.bitmap)
+ min = len(b.bitmap)
+ } else {
+ max = len(b.bitmap)
+ min = len(a.bitmap)
+ }
+ c.bitmap = make([]C.uint8_t, max)
+
+ for i := 0; i < min; i++ {
+ c.bitmap[i] = a.bitmap[i] & b.bitmap[i]
+ }
+ return
+}
+
+func (bm Bitmap) String() (s string) {
+ lastOnline := false
+ crange := false
+ printed := false
+ var i int
+ /// --x-xxxxx-x -> 2,4-8,10
+ /// --x-xxxxxxx -> 2,4-10
+ for i = 0; i <= bm.Max(); i++ {
+ if bm.Test(i) {
+ if !lastOnline {
+ // Switching offline -> online, print this cpu
+ if printed {
+ s += ","
+ }
+ s += fmt.Sprintf("%d", i)
+ printed = true
+ } else if !crange {
+ // last was online, but we're not in a range; print -
+ crange = true
+ s += "-"
+ } else {
+ // last was online, we're in a range, nothing else to do
+ }
+ lastOnline = true
+ } else {
+ if lastOnline {
+ // Switching online->offline; do we need to end a range?
+ if crange {
+ s += fmt.Sprintf("%d", i-1)
+ }
+ }
+ lastOnline = false
+ crange = false
+ }
+ }
+ if lastOnline {
+ // Switching online->offline; do we need to end a range?
+ if crange {
+ s += fmt.Sprintf("%d", i-1)
+ }
+ }
+
+ return
+}
+
+/*
* Context
*/
var Ctx Context
--
2.7.3
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
^ permalink raw reply related [flat|nested] 6+ messages in thread