This is Unofficial EPICS BASE Doxygen Site
caConnTest.cpp
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2002 The University of Chicago, as Operator of Argonne
3 * National Laboratory.
4 * Copyright (c) 2002 The Regents of the University of California, as
5 * Operator of Los Alamos National Laboratory.
6 * EPICS BASE is distributed subject to a Software License Agreement found
7 * in file LICENSE that is included with this distribution.
8 \*************************************************************************/
9 
10 #include <stdio.h>
11 #include <stdlib.h>
12 
13 #define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
14 
15 #include "cadef.h"
16 #include "epicsTime.h"
17 
18 static unsigned channelCount = 0u;
19 static unsigned connCount = 0u;
20 static bool subsequentConnect = false;
21 
22 epicsTime begin;
23 
24 extern "C" void caConnTestConnHandler ( struct connection_handler_args args )
25 {
26  if ( args.op == CA_OP_CONN_UP ) {
27  if ( connCount == 0u ) {
28  if ( subsequentConnect ) {
29  printf ("the first channel connected\n");
30  begin = epicsTime::getCurrent ();
31  }
32  }
33  connCount++;
34  // printf ( "." );
35  // fflush ( stdout );
36  if ( connCount == channelCount ) {
37  epicsTime current = epicsTime::getCurrent ();
38  double delay = current - begin;
39  printf ( "all channels connected after %f sec ( %f sec per channel)\n",
40  delay, delay / channelCount );
41  }
42  }
43  else if ( args.op == CA_OP_CONN_DOWN ) {
44  if ( connCount == channelCount ) {
45  printf ( "channels are disconnected\n" );
46  subsequentConnect = true;
47  }
48  connCount--;
49  if ( connCount == 0u ) {
50  printf ( "all channels are disconnected\n" );
51  }
52  }
53  else {
54  assert ( 0 );
55  }
56 }
57 
58 void caConnTest ( const char *pNameIn, unsigned channelCountIn, double delayIn )
59 {
60  unsigned iteration = 0u;
61  int status;
62  unsigned i;
63  chid *pChans;
64 
65  channelCount = channelCountIn;
66 
67  pChans = new chid [channelCount];
68 
69  while ( 1 ) {
70  connCount = 0u;
71  subsequentConnect = false;
72  begin = epicsTime::getCurrent ();
73 
74  printf ( "initializing CA client library\n" );
75 
76  status = ca_task_initialize();
77  SEVCHK ( status, "CA init failed" );
78 
79  printf ( "creating channels\n" );
80 
81  for ( i = 0u; i < channelCount; i++ ) {
82  status = ca_search_and_connect ( pNameIn,
83  &pChans[i], caConnTestConnHandler, 0 );
84  SEVCHK ( status, "CA search problems" );
85  }
86 
87  printf ( "all channels were created\n" );
88 
89  ca_pend_event ( delayIn );
90 
91  if ( iteration & 1 ) {
92  for ( i = 0u; i < channelCount; i++ ) {
93  status = ca_clear_channel ( pChans[i] );
94  SEVCHK ( status, "ca_clear_channel() problems" );
95  }
96  printf ( "all channels were destroyed\n" );
97  }
98 
99  printf ( "shutting down CA client library\n" );
100 
101  status = ca_task_exit ();
102  SEVCHK ( status, "task exit problems" );
103 
104  iteration++;
105  }
106 
107  //delete [] pChans;
108 }
int epicsStdCall ca_task_exit()
Definition: access.cpp:251
#define CA_OP_CONN_UP
Definition: cadef.h:128
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
pvd::Status status
int i
Definition: scan.c:967
void caConnTest(const char *pNameIn, unsigned channelCountIn, double delayIn)
Definition: caConnTest.cpp:58
int epicsStdCall ca_search_and_connect(const char *name_str, chid *chanptr, caCh *conn_func, void *puser)
Definition: access.cpp:279
#define printf
Definition: epicsStdio.h:41
epicsTime begin
Definition: caConnTest.cpp:22
int epicsStdCall ca_pend_event(ca_real timeout)
Definition: access.cpp:457
#define SEVCHK(CA_ERROR_CODE, MESSAGE_STRING)
Definition: cadef.h:137
int epicsStdCall ca_task_initialize(void)
Definition: access.cpp:166
int epicsStdCall ca_clear_channel(chid pChan)
Definition: access.cpp:363
#define CA_OP_CONN_DOWN
Definition: cadef.h:129
void caConnTestConnHandler(struct connection_handler_args args)
Definition: caConnTest.cpp:24
EPICS time-stamps (epicsTimeStamp), epicsTime C++ class and C functions for handling wall-clock times...