mirror of
https://github.com/chai2010/advanced-go-programming-book.git
synced 2025-05-24 04:22:22 +00:00
89 lines
1.6 KiB
Plaintext
89 lines
1.6 KiB
Plaintext
' Copyright 2017 <chaishushan{AT}gmail.com>. All rights reserved.
|
|
' Use of this source code is governed by a Apache
|
|
' license that can be found in the LICENSE file.
|
|
|
|
@startuml
|
|
|
|
title qsort
|
|
|
|
participant go
|
|
participant c
|
|
|
|
[--> go: qsort
|
|
activate go
|
|
|
|
go -> go
|
|
activate go #DarkSalmon
|
|
note left
|
|
go_qsort_compare_info.elemsize = sv.Type().Elem().Size()
|
|
go_qsort_compare_info.fn = fn
|
|
end note
|
|
|
|
deactivate go
|
|
|
|
go -> c: C.qsort_proxy(cmp=go_qsort_compare)
|
|
activate c
|
|
note right
|
|
void qsort_proxy(
|
|
void* base, size_t num, size_t size,
|
|
int (*compare)(const void* a, const void* b)
|
|
) {
|
|
go_qsort_compare_save_base(base);
|
|
qsort(base, num, size, compare);
|
|
}
|
|
end note
|
|
|
|
' begin
|
|
c -> c: C.go_qsort_compare_save_base
|
|
activate c #DarkSalmon
|
|
note right: callback go func
|
|
|
|
go <- c: go_qsort_compare_save_base
|
|
activate go #DarkSalmon
|
|
note left
|
|
//export go_qsort_compare_save_base
|
|
func go_qsort_compare_save_base(base unsafe.Pointer) {
|
|
go_qsort_compare_info.base = uintptr(base)
|
|
}
|
|
var go_qsort_compare_info struct {
|
|
base uintptr
|
|
elemsize uintptr
|
|
fn func(a, b int) int
|
|
sync.RWMutex
|
|
}
|
|
end note
|
|
|
|
go -> c: go_qsort_compare_save_base done
|
|
deactivate go
|
|
|
|
deactivate c
|
|
' end
|
|
|
|
loop
|
|
c -> c: C.go_qsort_compare
|
|
activate c #DarkSalmon
|
|
note right: callback go func
|
|
|
|
c -> go: go_qsort_compare
|
|
activate go #DarkSalmon
|
|
note left
|
|
//export go_qsort_compare_save_base
|
|
func go_qsort_compare_save_base(base unsafe.Pointer) {
|
|
go_qsort_compare_info.base = uintptr(base)
|
|
}
|
|
end note
|
|
|
|
go -> c: go_qsort_compare done
|
|
deactivate go
|
|
|
|
deactivate c
|
|
end
|
|
|
|
go <- c: C.qsort_proxy done
|
|
deactivate c
|
|
|
|
[<-- go: done
|
|
deactivate go
|
|
|
|
@enduml
|