Skip to content

Commit

Permalink
suit go1.6 cgo check for MPI.Init() and MPI.Init_thread
Browse files Browse the repository at this point in the history
fix yoo#3
  • Loading branch information
renyuneyun committed Mar 1, 2017
1 parent 22bc360 commit d730129
Showing 1 changed file with 24 additions and 12 deletions.
36 changes: 24 additions & 12 deletions MPI/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,22 @@ func Init(argv *[]string) int {
argc := len(*argv)
c_argc := C.int(argc)

c_argv := make([]*C.char, argc)
c_argv := C.malloc(C.size_t(c_argc) * C.size_t(unsafe.Sizeof(uintptr(0))))
c_argv_cast := (*[1<<30 - 1]*C.char)(c_argv)
for index, value := range *argv {
c_argv[index] = C.CString(value)
defer C.free(unsafe.Pointer(c_argv[index]))
c_argv_cast[index] = C.CString(value)
}

err := C.MPI_Init(&c_argc, (***C.char)(unsafe.Pointer(&c_argv)))
goargs := make([]string, c_argc)
for i := 0; i < int(c_argc); i++ {
goargs[i] = C.GoString(c_argv[i])

defer C.free(c_argv)
c_argv_cast = (*[1<<30 - 1]*C.char)(c_argv)

argc = int(c_argc)
goargs := make([]string, argc)
for i := 0; i < argc; i++ {
goargs[i] = C.GoString(c_argv_cast[i])
defer C.free(unsafe.Pointer(c_argv_cast[i]))
}
*argv = goargs
return int(err)
Expand All @@ -54,17 +60,23 @@ func Init_thread(argv *[]string, required int) (int, int) {
argc := len(*argv)
c_argc := C.int(argc)

c_argv := make([]*C.char, argc)
c_argv := C.malloc(C.size_t(c_argc) * C.size_t(unsafe.Sizeof(uintptr(0))))
c_argv_cast := (*[1<<30 - 1]*C.char)(c_argv)
for index, value := range *argv {
c_argv[index] = C.CString(value)
defer C.free(unsafe.Pointer(c_argv[index]))
c_argv_cast[index] = C.CString(value)
}

var provided int
err := C.MPI_Init_thread(&c_argc, (***C.char)(unsafe.Pointer(&c_argv)), C.int(required), (*C.int)(unsafe.Pointer(&provided)))
goargs := make([]string, c_argc)
for i := 0; i < int(c_argc); i++ {
goargs[i] = C.GoString(c_argv[i])

defer C.free(c_argv)
c_argv_cast = (*[1<<30 - 1]*C.char)(c_argv)

argc = int(c_argc)
goargs := make([]string, argc)
for i := 0; i < argc; i++ {
goargs[i] = C.GoString(c_argv_cast[i])
defer C.free(unsafe.Pointer(c_argv_cast[i]))
}
*argv = goargs
return provided, int(err)
Expand Down

0 comments on commit d730129

Please sign in to comment.