mirror of
https://github.com/ossrs/srs.git
synced 2025-02-24 06:54:22 +00:00
1. Add live benchmark support in srs-bench, which only connects and disconnects without any media transport, to test source creation and disposal and verify source memory leaks. 2. SmartPtr: Support cleanup of HTTP-FLV stream. Unregister the HTTP-FLV handler for the pattern and clean up the objects and resources. 3. Support benchmarking RTMP/SRT with srs-bench by integrating the gosrt and oryx RTMP libraries. 4. Refine SRT and RTC sources by using a timer to clean up the sources, following the same strategy as the Live source. --------- Co-authored-by: Haibo Chen <495810242@qq.com> Co-authored-by: Jacob Su <suzp1984@gmail.com>
57 lines
1,003 B
Go
57 lines
1,003 B
Go
package pointer
|
|
|
|
// #include <stdlib.h>
|
|
import "C"
|
|
import (
|
|
"sync"
|
|
"unsafe"
|
|
)
|
|
|
|
var (
|
|
mutex sync.RWMutex
|
|
store = map[unsafe.Pointer]interface{}{}
|
|
)
|
|
|
|
func Save(v interface{}) unsafe.Pointer {
|
|
if v == nil {
|
|
return nil
|
|
}
|
|
|
|
// Generate real fake C pointer.
|
|
// This pointer will not store any data, but will bi used for indexing purposes.
|
|
// Since Go doest allow to cast dangling pointer to unsafe.Pointer, we do rally allocate one byte.
|
|
// Why we need indexing, because Go doest allow C code to store pointers to Go data.
|
|
var ptr unsafe.Pointer = C.malloc(C.size_t(1))
|
|
if ptr == nil {
|
|
panic("can't allocate 'cgo-pointer hack index pointer': ptr == nil")
|
|
}
|
|
|
|
mutex.Lock()
|
|
store[ptr] = v
|
|
mutex.Unlock()
|
|
|
|
return ptr
|
|
}
|
|
|
|
func Restore(ptr unsafe.Pointer) (v interface{}) {
|
|
if ptr == nil {
|
|
return nil
|
|
}
|
|
|
|
mutex.RLock()
|
|
v = store[ptr]
|
|
mutex.RUnlock()
|
|
return
|
|
}
|
|
|
|
func Unref(ptr unsafe.Pointer) {
|
|
if ptr == nil {
|
|
return
|
|
}
|
|
|
|
mutex.Lock()
|
|
delete(store, ptr)
|
|
mutex.Unlock()
|
|
|
|
C.free(ptr)
|
|
}
|