2 * Copyright (C) 2018 Francis Deslauriers <francis.deslauriers@efficios.com>
4 * SPDX-License-Identifier: LGPL-2.1-only
15 #include "callsites.h"
26 static void print_list(void)
28 fprintf(stderr
, "Test list (-t X):\n");
29 fprintf(stderr
, "\t0: dlopen() all libraries pass in arguments and execute "
31 fprintf(stderr
, "\t1: simulate the upgrade of a probe provider using dlopen() and dlclose(). \n");
32 fprintf(stderr
, "\t2: simulate the upgrade of a library containing the callsites using dlopen() and dlclose(). \n");
36 static int dl_open_all(int nb_libraries
, char **libraries
)
41 handles
= malloc(nb_libraries
* sizeof(void *));
47 /* Iterate over the libs to dlopen and save the handles. */
48 for (i
= 0; i
< nb_libraries
; i
++) {
49 handles
[i
] = dlopen(libraries
[i
], RTLD_NOW
);
65 * Takes 2 paths to libraries, dlopen() the first, trace, dlopen() the second,
66 * and dlclose the first to simulate the upgrade of a library.
68 static int upgrade_lib(int nb_libraries
, char **libraries
)
73 if (nb_libraries
!= 2) {
78 /* Iterate over the libs to dlopen and save the handles. */
79 for (i
= 0; i
< nb_libraries
; i
++) {
80 handles
[i
] = dlopen(libraries
[i
], RTLD_NOW
);
89 ret
= dlclose(handles
[0]);
103 * Simulate the upgrade of a library containing a callsite.
104 * Receives two libraries containing callsites for the same tracepoint.
106 static int upgrade_callsite(int nb_libraries
, char **libraries
)
110 void (*fct_ptr
[2])(void);
112 if (nb_libraries
!= 2) {
117 /* Load the probes in the first library. */
118 handles
[0] = dlopen(libraries
[0], RTLD_NOW
);
125 * Get the pointer to the old function containing the callsite and call it.
127 fct_ptr
[0] = dlsym(handles
[0], "call_tracepoint");
134 /* Load the new callsite library. */
135 handles
[1] = dlopen(libraries
[1], RTLD_NOW
);
142 * Get the pointer to the new function containing the callsite and call it.
144 fct_ptr
[1] = dlsym(handles
[1], "call_tracepoint");
151 /* Unload the old callsite library. */
152 ret
= dlclose(handles
[0]);
157 /* Call the function containing the callsite in the new library. */
160 ret
= dlclose(handles
[1]);
170 int main(int argc
, const char **argv
)
172 int c
, ret
= 0, test
= -1, nb_libraries
= 0;
173 char **libraries
= NULL
;
175 struct poptOption optionsTable
[] = {
176 { "test", 't', POPT_ARG_INT
, &test
, 0, "Test to run", NULL
},
177 { "list", 'l', 0, 0, 'l', "List of tests (-t X)", NULL
},
179 { NULL
, 0, 0, NULL
, 0 }
182 optCon
= poptGetContext(NULL
, argc
, argv
, optionsTable
, 0);
184 poptPrintUsage(optCon
, stderr
, 0);
189 while ((c
= poptGetNextOpt(optCon
)) >= 0) {
198 * Populate the libraries array with the arguments passed to the process.
200 while (poptPeekArg(optCon
) != NULL
) {
201 char **realloced_libraries
= NULL
;
204 realloced_libraries
= realloc(libraries
, nb_libraries
* sizeof(char *));
205 if (!realloced_libraries
) {
209 libraries
= realloced_libraries
;
210 libraries
[nb_libraries
- 1] = (char *) poptGetArg(optCon
);
216 ret
= dl_open_all(nb_libraries
, libraries
);
218 fprintf(stderr
, "Test not implemented for configuration "
219 "(HAS_CALLSITES=%d)\n", HAS_CALLSITES
== 1);
224 ret
= upgrade_lib(nb_libraries
, libraries
);
226 fprintf(stderr
, "Test not implemented for configuration "
227 "(HAS_CALLSITES=%d)\n", HAS_CALLSITES
== 1);
232 ret
= upgrade_callsite(nb_libraries
, libraries
);
234 fprintf(stderr
, "Test not implemented for configuration "
235 "(HAS_CALLSITES=%d)\n", HAS_CALLSITES
== 1);
239 fprintf(stderr
, "Test %d not implemented\n", test
);
245 poptFreeContext(optCon
);
This page took 0.037436 seconds and 5 git commands to generate.