diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
commit | 47e6e7c84f008a53061e661f31ae96629bc694ef (patch) | |
tree | 648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /qa/src/multithread2.c | |
download | pcp-debian.tar.gz |
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'qa/src/multithread2.c')
-rw-r--r-- | qa/src/multithread2.c | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/qa/src/multithread2.c b/qa/src/multithread2.c new file mode 100644 index 0000000..238241f --- /dev/null +++ b/qa/src/multithread2.c @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2012-2013 Red Hat. + * Copyright (c) 2011 Ken McDonell. All Rights Reserved. + * + * exercise multi-threaded checks for PM_SCOPE_AF and PM_SCOPE_ACL + */ + +#include <stdio.h> +#include <stdlib.h> +#include <pcp/pmapi.h> +#include <pcp/impl.h> +#include <pthread.h> + +#ifndef HAVE_PTHREAD_BARRIER_T +#include "pthread_barrier.h" +#endif + +#include "localconfig.h" + +#if PCP_VER >= 3611 +__pmSockAddr *addr; +#else +__pmIPAddr addr; +#endif + +static pthread_barrier_t barrier; + +static void +wakeup(int tag, void *data) +{ + printf("Woops, wakeup(%d, %p) called?\n", tag, data); +} + +static void * +func1(void *arg) +{ + int sts; + int afid; + struct timeval when = { 1000, 0 }; + char *fn = "func1"; + unsigned int op; + + afid = __pmAFregister(&when, NULL, wakeup); + if (afid >= 0) + printf("%s: __pmAFregister -> OK\n", fn); + else + printf("%s: __pmAFregister -> %s\n", fn, pmErrStr(afid)); + sts = __pmAFunregister(afid); + if (sts >= 0) + printf("%s: __pmAFunregister -> OK\n", fn); + else + printf("%s: __pmAFunregister -> %s\n", fn, pmErrStr(sts)); + + pthread_barrier_wait(&barrier); + pthread_barrier_wait(&barrier); + + sts = __pmAccAddOp(1); + if (sts == 0) + printf("%s: __pmAccAddOp(1) -> OK\n", fn); + else + printf("%s: __pmAccAddOp(1) -> %s\n", fn, pmErrStr(sts)); + sts = __pmAccAddOp(2); + if (sts == 0) + printf("%s: __pmAccAddOp(2) -> OK\n", fn); + else + printf("%s: __pmAccAddOp(2) -> %s\n", fn, pmErrStr(sts)); + sts = __pmAccAddHost("localhost", 1, 2, 3); + if (sts == 0) + printf("%s: __pmAccAddHost -> OK\n", fn); + else + printf("%s: __pmAccAddHost -> %s\n", fn, pmErrStr(sts)); +#if PCP_VER >= 3801 + putc('\n', stdout); +#endif + __pmAccDumpHosts(stdout); +#if PCP_VER >= 3801 + putc('\n', stdout); +#endif + sts = __pmAccSaveHosts(); + if (sts == 0) + printf("%s: __pmAccSaveHosts -> OK\n", fn); + else + printf("%s: __pmAccSaveHosts -> %s\n", fn, pmErrStr(sts)); + sts = __pmAccRestoreHosts(); + if (sts == 0) + printf("%s: __pmAccRestoreHosts -> OK\n", fn); + else + printf("%s: __pmAccRestoreHosts -> %s\n", fn, pmErrStr(sts)); + sts = __pmAccAddClient(addr, &op); + if (sts == 0) + printf("%s: __pmAccAddClient -> %d\n", fn, op); + else + printf("%s: __pmAccAddClient -> %s\n", fn, pmErrStr(sts)); + + pthread_barrier_wait(&barrier); + + pthread_exit(NULL); +} + +static void * +func2(void *arg) +{ + int sts; + int afid; + struct timeval when = { 1000, 0 }; + char *fn = "func2"; + unsigned int op; + + pthread_barrier_wait(&barrier); + + afid = __pmAFregister(&when, NULL, wakeup); + if (afid >= 0) + printf("%s: __pmAFregister -> OK\n", fn); + else + printf("%s: __pmAFregister -> %s\n", fn, pmErrStr(afid)); + sts = __pmAFunregister(afid); + if (sts >= 0) + printf("%s: __pmAFunregister -> OK\n", fn); + else + printf("%s: __pmAFunregister -> %s\n", fn, pmErrStr(sts)); + + pthread_barrier_wait(&barrier); + pthread_barrier_wait(&barrier); + + sts = __pmAccAddOp(1); + if (sts == 0) + printf("%s: __pmAccAddOp(1) -> OK\n", fn); + else + printf("%s: __pmAccAddOp(1) -> %s\n", fn, pmErrStr(sts)); + sts = __pmAccAddOp(2); + if (sts == 0) + printf("%s: __pmAccAddOp(2) -> OK\n", fn); + else + printf("%s: __pmAccAddOp(2) -> %s\n", fn, pmErrStr(sts)); + sts = __pmAccAddHost("localhost", 1, 2, 3); + if (sts == 0) + printf("%s: __pmAccAddHost -> OK\n", fn); + else + printf("%s: __pmAccAddHost -> %s\n", fn, pmErrStr(sts)); + /* expect an error here - so no need for version-specific EOLs */ + __pmAccDumpHosts(stdout); + sts = __pmAccSaveHosts(); + if (sts == 0) + printf("%s: __pmAccSaveHosts -> OK\n", fn); + else + printf("%s: __pmAccSaveHosts -> %s\n", fn, pmErrStr(sts)); + sts = __pmAccRestoreHosts(); + if (sts == 0) + printf("%s: __pmAccRestoreHosts -> OK\n", fn); + else + printf("%s: __pmAccRestoreHosts -> %s\n", fn, pmErrStr(sts)); + sts = __pmAccAddClient(addr, &op); + if (sts == 0) + printf("%s: __pmAccAddClient -> %d\n", fn, op); + else + printf("%s: __pmAccAddClient -> %s\n", fn, pmErrStr(sts)); + + pthread_exit(NULL); +} + +int +main() +{ + pthread_t tid1; + pthread_t tid2; + int sts; + char *msg; + +#if PCP_VER >= 3702 + addr = __pmLoopBackAddress(AF_INET); +#elif PCP_VER >= 3611 + addr = __pmLoopBackAddress(); +#else + addr = __pmLoopbackAddress(); +#endif + + sts = pthread_barrier_init(&barrier, NULL, 2); + if (sts != 0) { + printf("pthread_barrier_init: sts=%d\n", sts); + exit(1); + } + + /* only need this to initialize library mutexes */ + if ((sts = pmNewContext(PM_CONTEXT_LOCAL, NULL)) < 0) { + printf("pmNewContext: %s\n", pmErrStr(sts)); + exit(1); + } + + sts = pthread_create(&tid1, NULL, func1, NULL); + if (sts != 0) { + printf("thread_create: tid1: sts=%d\n", sts); + exit(1); + } + sts = pthread_create(&tid2, NULL, func2, NULL); + if (sts != 0) { + printf("thread_create: tid2: sts=%d\n", sts); + exit(1); + } + + pthread_join(tid1, (void *)&msg); + if (msg != NULL) printf("tid1: %s\n", msg); + pthread_join(tid2, (void *)&msg); + if (msg != NULL) printf("tid2: %s\n", msg); + +#if PCP_VER >= 3611 + __pmSockAddrFree(addr); +#endif + exit(0); +} |