Skip to content

Commit 282bfa8

Browse files
authored
Merge pull request #61 from doujiang24/cgo
[p2pstore] fix memory leaking in cgo.
2 parents 39d7e81 + ce28302 commit 282bfa8

File tree

2 files changed

+45
-14
lines changed

2 files changed

+45
-14
lines changed

mooncake-p2p-store/src/p2pstore/transfer_engine.go

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,29 @@
1414

1515
package p2pstore
1616

17+
/*
18+
* All memory pointed to by the "char *" parameters will not be used
19+
* after the C function returns.
20+
* This means that the caller can free the memory pointed to by "char *"
21+
* parameters, after the call is completed.
22+
* All the C functions used here follow this convention.
23+
*/
24+
1725
//#cgo LDFLAGS: -L../../../build/mooncake-transfer-engine/src -L../../../thirdparties/lib -ltransfer_engine -lstdc++ -lnuma -lglog -libverbs -ljsoncpp -letcd-cpp-api -lprotobuf -lgrpc++ -lgrpc
1826
//#include "../../../mooncake-transfer-engine/include/transfer_engine_c.h"
1927
import "C"
2028

2129
import (
22-
"unsafe"
2330
"net"
2431
"strconv"
32+
"unsafe"
2533
)
2634

2735
type BatchID int64
2836

2937
type TransferEngine struct {
3038
engine C.transfer_engine_t
31-
xport C.transport_t
39+
xport C.transport_t
3240
}
3341

3442
func parseServerName(serverName string) (host string, port int) {
@@ -45,35 +53,45 @@ func parseServerName(serverName string) (host string, port int) {
4553
return host, port
4654
}
4755

56+
const (
57+
rdmaCStr = C.CString("rdma")
58+
)
59+
4860
func NewTransferEngine(metadata_uri string, local_server_name string, nic_priority_matrix string) (*TransferEngine, error) {
4961
// For simplifiy, local_server_name must be a valid IP address or hostname
5062
connectable_name, rpc_port := parseServerName(local_server_name)
5163

52-
native_engine := C.createTransferEngine(C.CString(metadata_uri),
53-
C.CString(local_server_name),
54-
C.CString(connectable_name),
55-
C.uint64_t(rpc_port))
64+
metadataUri := C.CString(metadata_uri)
65+
localServerName := C.CString(local_server_name)
66+
connectableName := C.CString(connectable_name)
67+
nicPriorityMatrix := C.CString(nic_priority_matrix)
68+
defer C.free(unsafe.Pointer(metadataUri))
69+
defer C.free(unsafe.Pointer(localServerName))
70+
defer C.free(unsafe.Pointer(connectableName))
71+
defer C.free(unsafe.Pointer(nicPriorityMatrix))
72+
73+
native_engine := C.createTransferEngine(metadataUri, localServerName, connectableName, C.uint64_t(rpc_port))
5674
if native_engine == nil {
5775
return nil, ErrTransferEngine
5876
}
5977

6078
var args [2]unsafe.Pointer
61-
args[0] = unsafe.Pointer(C.CString(nic_priority_matrix))
79+
args[0] = unsafe.Pointer(nicPriorityMatrix)
6280
args[1] = nil
63-
xport := C.installTransport(native_engine, C.CString("rdma"), &args[0])
81+
xport := C.installTransport(native_engine, rdmaCStr, &args[0])
6482
if xport == nil {
6583
C.destroyTransferEngine(native_engine)
6684
return nil, ErrTransferEngine
6785
}
6886

6987
return &TransferEngine{
7088
engine: native_engine,
71-
xport:xport,
89+
xport: xport,
7290
}, nil
7391
}
7492

7593
func (engine *TransferEngine) Close() error {
76-
ret := C.uninstallTransport(engine.engine, C.CString("rdma"))
94+
ret := C.uninstallTransport(engine.engine, rdmaCStr)
7795
if ret < 0 {
7896
return ErrTransferEngine
7997
}
@@ -83,7 +101,9 @@ func (engine *TransferEngine) Close() error {
83101
}
84102

85103
func (engine *TransferEngine) registerLocalMemory(addr uintptr, length uint64, location string) error {
86-
ret := C.registerLocalMemory(engine.engine, unsafe.Pointer(addr), C.size_t(length), C.CString(location), 1)
104+
locationCStr := C.CString(location)
105+
defer C.free(unsafe.Pointer(locationCStr))
106+
ret := C.registerLocalMemory(engine.engine, unsafe.Pointer(addr), C.size_t(length), locationCStr, 1)
87107
if ret < 0 {
88108
return ErrTransferEngine
89109
}
@@ -163,7 +183,10 @@ func (engine *TransferEngine) freeBatchID(batchID BatchID) error {
163183
}
164184

165185
func (engine *TransferEngine) openSegment(name string) (int64, error) {
166-
ret := C.openSegment(engine.engine, C.CString(name))
186+
nameCStr := C.CString(name)
187+
defer C.free(unsafe.Pointer(nameCStr))
188+
189+
ret := C.openSegment(engine.engine, nameCStr)
167190
if ret < 0 {
168191
return -1, ErrTransferEngine
169192
}
@@ -184,4 +207,4 @@ func (engine *TransferEngine) syncSegmentCache() error {
184207
return ErrTransferEngine
185208
}
186209
return nil
187-
}
210+
}

mooncake-transfer-engine/include/transfer_engine_c.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@ typedef struct segment_desc segment_desc_t;
8585
typedef void *transfer_engine_t;
8686
typedef void *transport_t;
8787

88+
/*
89+
* All memory pointed to by the "char *" parameters will not be used
90+
* after the C function returns.
91+
* This means that the caller can free the memory pointed to by "char *"
92+
* parameters, after the call is completed.
93+
* All the C functions here follow this convention.
94+
*/
95+
8896
transfer_engine_t createTransferEngine(const char *metadata_conn_string,
8997
const char *local_server_name,
9098
const char *ip_or_host_name,
@@ -129,4 +137,4 @@ int syncSegmentCache(transfer_engine_t engine);
129137
}
130138
#endif // __cplusplus
131139

132-
#endif // TRANSFER_ENGINE_C
140+
#endif // TRANSFER_ENGINE_C

0 commit comments

Comments
 (0)