Skip to content

Commit c546ee8

Browse files
committed
Merge pull request #111 from JuliaParallel/eschnett/ref
Use Ref{} instead of one-element arrays to pass values by reference
2 parents f62935f + 7ed7856 commit c546ee8

File tree

3 files changed

+138
-130
lines changed

3 files changed

+138
-130
lines changed

deps/gen_functions.c

Lines changed: 55 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -9,60 +9,62 @@
99
int main(int argc, char *argv[]) {
1010
printf("const WRAPPER_VERSION = \"%s\"\n", VERSION);
1111
printf("\n");
12-
printf("const MPI_ABORT = :%s\n", STRING(MPI_ABORT));
13-
printf("const MPI_ALLGATHER = :%s\n", STRING(MPI_ALLGATHER));
14-
printf("const MPI_ALLGATHERV = :%s\n", STRING(MPI_ALLGATHERV));
15-
printf("const MPI_ALLREDUCE = :%s\n", STRING(MPI_ALLREDUCE));
16-
printf("const MPI_ALLTOALL = :%s\n", STRING(MPI_ALLTOALL));
17-
printf("const MPI_ALLTOALLV = :%s\n", STRING(MPI_ALLTOALLV));
18-
printf("const MPI_BARRIER = :%s\n", STRING(MPI_BARRIER));
19-
printf("const MPI_BCAST = :%s\n", STRING(MPI_BCAST));
20-
printf("const MPI_BSEND = :%s\n", STRING(MPI_BSEND));
21-
printf("const MPI_CANCEL = :%s\n", STRING(MPI_CANCEL));
22-
printf("const MPI_COMM_DUP = :%s\n", STRING(MPI_COMM_DUP));
23-
printf("const MPI_COMM_FREE = :%s\n", STRING(MPI_COMM_FREE));
24-
printf("const MPI_COMM_RANK = :%s\n", STRING(MPI_COMM_RANK));
25-
printf("const MPI_COMM_SIZE = :%s\n", STRING(MPI_COMM_SIZE));
26-
printf("const MPI_COMM_SPLIT = :%s\n", STRING(MPI_COMM_SPLIT));
27-
printf("const MPI_EXSCAN = :%s\n", STRING(MPI_EXSCAN));
28-
printf("const MPI_FINALIZE = :%s\n", STRING(MPI_FINALIZE));
29-
printf("const MPI_FINALIZED = :%s\n", STRING(MPI_FINALIZED));
30-
printf("const MPI_GATHER = :%s\n", STRING(MPI_GATHER));
31-
printf("const MPI_GATHERV = :%s\n", STRING(MPI_GATHERV));
32-
printf("const MPI_GET_COUNT = :%s\n", STRING(MPI_GET_COUNT));
33-
printf("const MPI_GET_PROCESSOR_NAME = :%s\n",
12+
printf("const _mpi_functions = Dict{Symbol, ASCIIString}(\n");
13+
printf(" :MPI_ABORT => \"%s\",\n", STRING(MPI_ABORT));
14+
printf(" :MPI_ALLGATHER => \"%s\",\n", STRING(MPI_ALLGATHER));
15+
printf(" :MPI_ALLGATHERV => \"%s\",\n", STRING(MPI_ALLGATHERV));
16+
printf(" :MPI_ALLREDUCE => \"%s\",\n", STRING(MPI_ALLREDUCE));
17+
printf(" :MPI_ALLTOALL => \"%s\",\n", STRING(MPI_ALLTOALL));
18+
printf(" :MPI_ALLTOALLV => \"%s\",\n", STRING(MPI_ALLTOALLV));
19+
printf(" :MPI_BARRIER => \"%s\",\n", STRING(MPI_BARRIER));
20+
printf(" :MPI_BCAST => \"%s\",\n", STRING(MPI_BCAST));
21+
printf(" :MPI_BSEND => \"%s\",\n", STRING(MPI_BSEND));
22+
printf(" :MPI_CANCEL => \"%s\",\n", STRING(MPI_CANCEL));
23+
printf(" :MPI_COMM_DUP => \"%s\",\n", STRING(MPI_COMM_DUP));
24+
printf(" :MPI_COMM_FREE => \"%s\",\n", STRING(MPI_COMM_FREE));
25+
printf(" :MPI_COMM_RANK => \"%s\",\n", STRING(MPI_COMM_RANK));
26+
printf(" :MPI_COMM_SIZE => \"%s\",\n", STRING(MPI_COMM_SIZE));
27+
printf(" :MPI_COMM_SPLIT => \"%s\",\n", STRING(MPI_COMM_SPLIT));
28+
printf(" :MPI_EXSCAN => \"%s\",\n", STRING(MPI_EXSCAN));
29+
printf(" :MPI_FINALIZE => \"%s\",\n", STRING(MPI_FINALIZE));
30+
printf(" :MPI_FINALIZED => \"%s\",\n", STRING(MPI_FINALIZED));
31+
printf(" :MPI_GATHER => \"%s\",\n", STRING(MPI_GATHER));
32+
printf(" :MPI_GATHERV => \"%s\",\n", STRING(MPI_GATHERV));
33+
printf(" :MPI_GET_COUNT => \"%s\",\n", STRING(MPI_GET_COUNT));
34+
printf(" :MPI_GET_PROCESSOR_NAME => \"%s\",\n",
3435
STRING(MPI_GET_PROCESSOR_NAME));
35-
printf("const MPI_INIT = :%s\n", STRING(MPI_INIT));
36-
printf("const MPI_INITIALIZED = :%s\n", STRING(MPI_INITIALIZED));
37-
printf("const MPI_IPROBE = :%s\n", STRING(MPI_IPROBE));
38-
printf("const MPI_IRECV = :%s\n", STRING(MPI_IRECV));
39-
printf("const MPI_ISEND = :%s\n", STRING(MPI_ISEND));
40-
printf("const MPI_OP_CREATE = :%s\n", STRING(MPI_OP_CREATE));
41-
printf("const MPI_OP_FREE = :%s\n", STRING(MPI_OP_FREE));
42-
printf("const MPI_PACK = :%s\n", STRING(MPI_PACK));
43-
printf("const MPI_PACK_SIZE = :%s\n", STRING(MPI_PACK_SIZE));
44-
printf("const MPI_PROBE = :%s\n", STRING(MPI_PROBE));
45-
printf("const MPI_RECV = :%s\n", STRING(MPI_RECV));
46-
printf("const MPI_RECV_INIT = :%s\n", STRING(MPI_RECV_INIT));
47-
printf("const MPI_REDUCE = :%s\n", STRING(MPI_REDUCE));
48-
printf("const MPI_REQUEST_FREE = :%s\n", STRING(MPI_REQUEST_FREE));
49-
printf("const MPI_RSEND = :%s\n", STRING(MPI_RSEND));
50-
printf("const MPI_SCAN = :%s\n", STRING(MPI_SCAN));
51-
printf("const MPI_SCATTER = :%s\n", STRING(MPI_SCATTER));
52-
printf("const MPI_SCATTERV = :%s\n", STRING(MPI_SCATTERV));
53-
printf("const MPI_SEND = :%s\n", STRING(MPI_SEND));
54-
printf("const MPI_SEND_INIT = :%s\n", STRING(MPI_SEND_INIT));
55-
printf("const MPI_SSEND = :%s\n", STRING(MPI_SSEND));
56-
printf("const MPI_TEST = :%s\n", STRING(MPI_TEST));
57-
printf("const MPI_TESTALL = :%s\n", STRING(MPI_TESTALL));
58-
printf("const MPI_TESTANY = :%s\n", STRING(MPI_TESTANY));
59-
printf("const MPI_TESTSOME = :%s\n", STRING(MPI_TESTSOME));
60-
printf("const MPI_UNPACK = :%s\n", STRING(MPI_UNPACK));
61-
printf("const MPI_WAIT = :%s\n", STRING(MPI_WAIT));
62-
printf("const MPI_WAITALL = :%s\n", STRING(MPI_WAITALL));
63-
printf("const MPI_WAITANY = :%s\n", STRING(MPI_WAITANY));
64-
printf("const MPI_WAITSOME = :%s\n", STRING(MPI_WAITSOME));
65-
printf("const MPI_WTIME = :%s\n", STRING(MPI_WTIME));
36+
printf(" :MPI_INIT => \"%s\",\n", STRING(MPI_INIT));
37+
printf(" :MPI_INITIALIZED => \"%s\",\n", STRING(MPI_INITIALIZED));
38+
printf(" :MPI_IPROBE => \"%s\",\n", STRING(MPI_IPROBE));
39+
printf(" :MPI_IRECV => \"%s\",\n", STRING(MPI_IRECV));
40+
printf(" :MPI_ISEND => \"%s\",\n", STRING(MPI_ISEND));
41+
printf(" :MPI_OP_CREATE => \"%s\",\n", STRING(MPI_OP_CREATE));
42+
printf(" :MPI_OP_FREE => \"%s\",\n", STRING(MPI_OP_FREE));
43+
printf(" :MPI_PACK => \"%s\",\n", STRING(MPI_PACK));
44+
printf(" :MPI_PACK_SIZE => \"%s\",\n", STRING(MPI_PACK_SIZE));
45+
printf(" :MPI_PROBE => \"%s\",\n", STRING(MPI_PROBE));
46+
printf(" :MPI_RECV => \"%s\",\n", STRING(MPI_RECV));
47+
printf(" :MPI_RECV_INIT => \"%s\",\n", STRING(MPI_RECV_INIT));
48+
printf(" :MPI_REDUCE => \"%s\",\n", STRING(MPI_REDUCE));
49+
printf(" :MPI_REQUEST_FREE => \"%s\",\n", STRING(MPI_REQUEST_FREE));
50+
printf(" :MPI_RSEND => \"%s\",\n", STRING(MPI_RSEND));
51+
printf(" :MPI_SCAN => \"%s\",\n", STRING(MPI_SCAN));
52+
printf(" :MPI_SCATTER => \"%s\",\n", STRING(MPI_SCATTER));
53+
printf(" :MPI_SCATTERV => \"%s\",\n", STRING(MPI_SCATTERV));
54+
printf(" :MPI_SEND => \"%s\",\n", STRING(MPI_SEND));
55+
printf(" :MPI_SEND_INIT => \"%s\",\n", STRING(MPI_SEND_INIT));
56+
printf(" :MPI_SSEND => \"%s\",\n", STRING(MPI_SSEND));
57+
printf(" :MPI_TEST => \"%s\",\n", STRING(MPI_TEST));
58+
printf(" :MPI_TESTALL => \"%s\",\n", STRING(MPI_TESTALL));
59+
printf(" :MPI_TESTANY => \"%s\",\n", STRING(MPI_TESTANY));
60+
printf(" :MPI_TESTSOME => \"%s\",\n", STRING(MPI_TESTSOME));
61+
printf(" :MPI_UNPACK => \"%s\",\n", STRING(MPI_UNPACK));
62+
printf(" :MPI_WAIT => \"%s\",\n", STRING(MPI_WAIT));
63+
printf(" :MPI_WAITALL => \"%s\",\n", STRING(MPI_WAITALL));
64+
printf(" :MPI_WAITANY => \"%s\",\n", STRING(MPI_WAITANY));
65+
printf(" :MPI_WAITSOME => \"%s\",\n", STRING(MPI_WAITSOME));
66+
printf(" :MPI_WTIME => \"%s\",\n", STRING(MPI_WTIME));
67+
printf(")\n");
6668
printf("\n");
6769
printf("bitstype %d CComm\n", (int)(sizeof(MPI_Comm) * 8));
6870

src/MPI.jl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,13 @@ include("cman.jl")
1313
function __init__()
1414
# need to open libmpi with RTLD_GLOBAL flag for Linux, before any ccall
1515
# cannot use RTLD_DEEPBIND; this leads to segfaults at least on Ubuntu 15.10
16-
Libdl.dlopen(libmpi, Libdl.RTLD_LAZY|Libdl.RTLD_GLOBAL)
16+
@eval const libmpi_handle =
17+
Libdl.dlopen(libmpi, Libdl.RTLD_LAZY | Libdl.RTLD_GLOBAL)
18+
19+
# look up all symbols ahead of time
20+
for (jname, fname) in _mpi_functions
21+
eval(:(const $jname = Libdl.dlsym(libmpi_handle, $fname)))
22+
end
1723
end
1824

1925
end

0 commit comments

Comments
 (0)