Update year range in gprofng copyright notices
[binutils-gdb.git] / gprofng / testsuite / gprofng.display / synprog / callsx.c
bloba6e94d51fa1433c7a7566232a22d063d7b2a6c2f
1 /* Copyright (C) 2021-2023 Free Software Foundation, Inc.
2 Contributed by Oracle.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <dlfcn.h>
24 #include <errno.h>
25 #include <string.h>
26 #include "stopwatch.h"
29 #define DYNSOROUTINE "sx_cputime"
30 #define DYNSONAME "./so_syx.so"
32 /* callsx -- dynamically link a shared object, and call a routine in it */
34 #ifndef NONSHARED
36 static void *sx_object = NULL;
37 static void closesx (void);
39 int
40 callsx (int k)
42 int i;
43 char buf[1024];
44 char *p;
45 char *q = DYNSONAME;
46 int errnum;
48 hrtime_t start = gethrtime ();
49 hrtime_t vstart = gethrvtime ();
51 /* Log the event */
52 wlog ("start of callsx", NULL);
54 /* see if already linked */
55 if (sx_object != NULL)
57 fprintf (stderr, "Execution error -- callsx: sx_object already linked\n");
58 return 0;
61 /* open the dynamic shared object */
62 /* open the dynamic shared object */
63 sx_object = NULL;
64 while (sx_object == NULL)
66 sx_object = dlopen (DYNSONAME, RTLD_NOW);
67 if (sx_object != NULL)
68 break;
69 p = dlerror ();
70 if (q == NULL) q = "DYNSONAME";
71 if (p == NULL) p = "dlerror() returns NULL";
72 errnum = errno;
73 if (errnum == EINTR)
74 continue; /* retry */
75 else
77 fprintf (stderr, "Execution error -- callso: dlopen of %s failed--%s, errno=%d (%s)\n",
78 q, p, errnum, strerror (errnum));
79 return (0);
83 /* look up the routine name in it */
84 int (*sx_routine)() = (int (*)())dlsym (sx_object, DYNSOROUTINE);
85 if (sx_routine == NULL)
87 fprintf (stderr, "Execution error -- callsx: dlsym %s not found\n",
88 DYNSOROUTINE);
89 return (0);
92 /* invoke the routine */
93 long long count = 0;
96 i = (*sx_routine)();
97 count++;
99 while (start + testtime * 1e9 > gethrtime ());
101 closesx ();
102 sprintf (buf, "end of callsx, %s returned %d", DYNSOROUTINE, i);
103 wlog (buf, NULL);
104 fprintf (stderr, " Performed %lld while-loop iterations\n", count);
105 whrvlog ((gethrtime () - start), (gethrvtime () - vstart), "callsx", NULL);
106 return 0;
109 /* closesx -- close a DSO */
110 void
111 closesx (void)
113 /* Log the event */
114 wlog ("start of closesx", NULL);
116 /* ensure already linked */
117 if (sx_object == NULL)
119 fprintf (stderr, "Execution error -- closesx: sx_object not linked\n");
120 return;
123 #if 0
124 /* close the dynamic shared object */
125 rc = dlclose (sx_object);
126 if (rc != 0)
128 fprintf (stderr, "Execution error -- closesx: dlclose() failed--%s\n",
129 dlerror ());
130 return;
132 /* clear the pointer */
133 sx_object = NULL;
134 #endif
135 wlog ("end of closesx", NULL);
136 return;
139 #else /* NONSHARED */
142 callsx (int i)
144 return 0;
147 void
148 closesx (void)
150 return;
152 #endif /* NONSHARED */