3
"$Id: pvmgsu_core.c,v 1.14 1997/10/22 22:14:17 pvmsrc Exp $";
6
* PVM version 3.4: Parallel Virtual Machine System
7
* University of Tennessee, Knoxville TN.
8
* Oak Ridge National Laboratory, Oak Ridge TN.
9
* Emory University, Atlanta GA.
10
* Authors: J. J. Dongarra, G. E. Fagg, M. Fischer
11
* G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
12
* P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
13
* (C) 1997 All Rights Reserved
17
* Permission to use, copy, modify, and distribute this software and
18
* its documentation for any purpose and without fee is hereby granted
19
* provided that the above copyright notice appear in all copies and
20
* that both the copyright notice and this permission notice appear in
21
* supporting documentation.
23
* Neither the Institutions (Emory University, Oak Ridge National
24
* Laboratory, and University of Tennessee) nor the Authors make any
25
* representations about the suitability of this software for any
26
* purpose. This software is provided ``as is'' without express or
29
* PVM version 3 was funded in part by the U.S. Department of Energy,
30
* the National Science Foundation and the State of Tennessee.
34
* pvmgsu_core.c - Core group library routines
35
* Revision 1.4 1994/11/07 21:09:38 manchek
36
* include stdlib if available.
37
* function prototypes for SCO.
38
* remove spurious breaks after returns
40
* Revision 1.3 1994/10/15 21:57:34 manchek
41
* disable output collection and tracing while spawning group server
43
* Revision 1.2 1994/10/15 18:53:48 manchek
44
* added tids to BCAST1 trace message
47
* 05 Mar 1993 Adam Beguelin adamb@cs.cmu.edu
48
* 05 Mar 1993 Fixed malloc() in pvm_bcast()
49
* 05 Mar 1993 pvm_barrier now returns 0 or an error
50
* 20 Mar 1993 pvm_bcast does not send to itself, beguelin
51
* 01 Jun 1993 Fixed saving and restoring of mbufs, beguelin
52
* 30 Nov 1993 Fixed gs_getgstid() to check spawn return correctly,
54
* 8 Mar 1994 optimized gs_getgstid().
55
* 8 Mar 1994 Added reduce & assoc routines. Donato & P.Papadopoulos
56
* 24 Apr 1994 Added scatter, gather, gs_get_datasize routines. Donato
57
* 15 Jun 1995 Add static groups, clear local tables if tid changes
81
static int myoldtid = -1;
86
extern struct Pvmtracer pvmtrc;
88
/* Declarations for static group information */
90
static GROUP_LIST sgroup_list[HASHSIZE];
91
static int ngroups = -1;
92
/* ================ gs_getgstid() ==================================== */
93
/* int info = getgstid() */
94
/* gs_getgstid returns the tid of the group server, starts the server */
95
/* if it is not running */
109
if (gstid >= 0 && mytid == myoldtid)
112
srbuf = pvm_setrbuf(0);
114
if ( pvm_recvinfo(GSNAME, 0, PvmMboxDefault) == PvmNotFound )
116
/* Don't trace output from the spawned group server */
118
otid = pvm_setopt(PvmOutputTid, 0);
119
ttid = pvm_setopt(PvmTraceTid, 0);
121
info = pvm_spawn("pvmgs", (char **)0, PvmMppFront,
122
(char *)0, 1, &gstid);
124
pvm_setopt(PvmOutputTid, otid);
125
pvm_setopt(PvmTraceTid, ttid);
129
if (info == 0 && gstid < 0)
132
pvm_perror("gs_getgstid() failed to start group server");
137
while( pvm_recvinfo(GSNAME, 0, PvmMboxDefault) == PvmNotFound )
138
/* wait for it to register */ ;
141
/* unpack the group server tid */
142
pvm_upkint(&gstid,1,1);
145
/* initialize storage for static group information */
150
gs_hash_init(sgroup_list);
153
gs_hash_clear(sgroup_list, &ngroups, HASHSIZE);
160
/* ================ pvm_joingroup()=================================== */
162
int inum = pvm_joingroup(char* group)
164
Adds the calling tid to the named group and returns its instance number.
165
Always adds the task in the first available slot such that
166
if one task leaves a group and another later joins, then the later
167
task will get the instance number freed by the earlier task.
168
This allows users to keep a contiguous block of instance numbers [0,p-1].
180
BGN_TRACE( TEV_JOINGROUP, group, 0, (int *) NULL );
182
int_query_server(group, JOIN, "pvm_joingroup", &gid, 0);
184
END_TRACE( TEV_JOINGROUP, TEV_DID_CC, &gid );
192
/* ================ pvm_lvgroup()=================================== */
194
int info = pvm_lvgroup(char* group)
195
Removes the calling tid from the named group.
196
Returns only after getting confirmation from server.
197
This allows users to coordinate leaving and joining.
207
GROUP_STRUCT_PTR sgroup;
211
BGN_TRACE( TEV_LVGROUP, group, 0, (int *) NULL );
213
/* delete any statically held group information */
214
gs_delete_group(group, sgroup_list, &ngroups);
216
int_query_server(group, LEAVE, "pvm_lvgroup", &rc, 0);
218
END_TRACE( TEV_LVGROUP, TEV_DID_CC, &rc );
228
/* ================ pvm_getinst() ==================================== */
229
/* int inum = pvm_getinst(char* group, int tid)
230
Returns the instance number of the specified tid in the named group.
231
Can be called by any task.
234
pvm_getinst(group, tid)
244
BGN_TRACE( TEV_GETINST, group, TEV_DID_GT, &tid );
246
inst = gs_getinst(group, tid, sgroup_list, &ngroups, &foo);
248
if (inst < 0) /* didn't find the info in local memory */
249
int_query_server(group, GETINST, "pvm_getinst", &inst, tid);
251
END_TRACE( TEV_GETINST, TEV_DID_GI, &inst );
259
/* ================ pvm_gettid() ===================================== */
261
int tid = pvm_gettid(char * group, int inum)
262
Returns the tid of the task defined by the group/inum pair.
263
Can be called by any task.
266
pvm_gettid(group, inst)
276
BGN_TRACE( TEV_GETTID, group, TEV_DID_GI, &inst );
278
tid = gs_gettid(group, inst, sgroup_list, &ngroups, &foo);
280
if (tid < 0) /* didn't find the info in local memory */
281
int_query_server(group, GETTID, "pvm_gettid", &tid, inst);
283
END_TRACE( TEV_GETTID, TEV_DID_GT, &tid );
291
/* ================ pvm_gsize() ====================================== */
293
int gsize = pvm_gsize(char* group)
294
Returns the present size of the named group.
307
BGN_TRACE( TEV_GSIZE, group, 0, (int *) NULL );
309
size= gs_gsize(group, sgroup_list, &ngroups, &foo);
311
if (size < 0) /* didn't find the info in local memory */
312
int_query_server(group, GSIZE, "pvm_gsize", &size, 0);
314
END_TRACE( TEV_GSIZE, TEV_DID_GS, &size );
321
/* ================ pvm_bcast() ===================================== */
323
int info = pvm_bcast(char* group, int msgtag)
324
Broadcast message to all members presently in the named group
325
(excluding yourself if you are in the group).
326
Calling tid need not be in the group.
329
pvm_bcast(group, msgtag)
340
int *tids = (int *) NULL;
345
BGN_TRACE( TEV_BCAST, group, TEV_DID_MC, &msgtag );
347
if ((cc = gs_get_tidlist(group, msgtag, &ntids, &tids, 0)) < 0)
350
if ((mytid = pvm_mytid()) < 0 && ! bailout)
352
pvm_perror("pvm_bcast");
357
/* if I'm the only one in the group */
358
if ((ntids == 1) && (tids[0] == mytid ) && ! bailout)
366
for (i = 0; i < ntids; i++) /* remove my tid */
368
if (tids[i] == mytid)
370
/* move the last tid to here and shorten the list */
371
tids[i] = tids[--ntids];
376
if ((cc = pvm_mcast(tids, ntids, msgtag)) > 0)
383
if ( TEV_AMEXCL ) /* Special handling of tracing for bcast */
385
if (TEV_DO_TRACE(TEV_BCAST,TEV_EVENT_EXIT))
387
TEV_PACK_INT( TEV_DID_CC, TEV_DATA_SCALAR, &cc, 1, 1 );
390
TEV_PACK_INT( TEV_DID_MDL, TEV_DATA_ARRAY,
391
(int *) NULL, 0, 1 );
395
TEV_PACK_INT( TEV_DID_MDL, TEV_DATA_ARRAY,
409
/* ================ pvm_barrier() ==================================== */
411
int info = pvm_barrier(char* group, int count)
413
Calling task waits until count members of named group also
414
call pvm_barrier. If user places -1 for count then the present
415
size of the group is used. Note this option is not useful if
416
the size of the group is changing.
417
A process must be a member of a group to call pvm_barrier on
422
pvm_barrier(group, cnt)
429
#if defined(IMA_PGON)
437
extern int pvmpgonpartsize;
443
BGN_TRACE( TEV_BARRIER, group, TEV_DID_GBC, &cnt);
445
/* use gsync when possible on the PGON.
446
1) The group must be static
447
2) The size of the PGON partition must equal number pgon nodes in group
448
3) If group has other hosts besides pgon, then 1 node from pgon
449
represents all the nodes to the group server.
451
#if defined(IMA_PGON)
454
rc = gs_host_char(group,sgroup_list, &ngroups,
456
gs_tidtohost(mytid), &pcoord, &nmem, &nhosts, &gstate);
458
if (rc == 0 && nmem == pvmpgonpartsize ) /*use gsync */
462
if ( rc >= 0 && nhosts > 1) /* sync'ed pgon, now sync w/others */
465
int_query_server(group, BARRIERV, "pvm_barrier", &rc, cnt);
473
int_query_server(group, BARRIER, "pvm_barrier", &rc, cnt);
478
END_TRACE( TEV_BARRIER, TEV_DID_CC, &rc );
486
/* ================ pvm_freezegroup() =============================== */
488
int info = pvm_freezegroup(char *group, int size)
489
The named dynamic group is frozen. Group information is cached by
494
pvm_freezegroup(group, size)
501
/* BGN_TRACE( TEV_FREEZE, group, TEV_DID_GS, &size ); */
503
int_query_server(group, STATICGROUP, "pvm_freezegroup", &rc, size);
505
/* END_TRACE( TEV_FREEZE, TEV_DID_CC, &rc ); */
511
/* **************** ROUTINES THAT DIRECTLY CONTACT THE SERVER ************/
513
/* ================ pvm_gsdump() ==================================== */
516
* ask pvmgs to dump it's state. Assumes pvmgs is running
524
savectx = pvm_setcontext( SYSCTX_DG );
526
sbuf = pvm_mkbuf(PvmDataDefault);
528
sbuf = pvm_setsbuf(sbuf);
530
pvm_send(gstid, DUMP);
532
pvm_freebuf(pvm_setsbuf(sbuf));
534
pvm_setcontext( savectx );
537
/* ================ int_query_server() =============================== */
538
/* Query server to get a single integer of information. Single integer */
539
/* int info = int_query_server(char *group, int request, char *caller,
540
* int *rvalue, int optarg)
541
* group - string to identify the group
542
* request - integer ID of request
543
* requests are: JOIN, LEAVE, GETTID, GETINST, BARRIER, GSIZE
545
* caller - string to use in error reporting
546
* rvalue - value returned by server
547
* optarg - optional argument used by some requests (e.g., barrier,
550
* The request is made of the group server for group. It is possible
551
* for the server to not only return the information, but to tack on
552
* the instance map of the group. If this happens, then a new entry
553
* is kept locally to cache the info for this group.
557
int_query_server(group, request, caller, rvalue, optarg)
571
GROUP_STRUCT_PTR sgroup;
575
if (group == (char*)0)
576
return (*rvalue = PvmNullGroup);
578
if ( (stid = gs_getgstid()) < 0) /* find the server's tid */
579
return (*rvalue = PvmSysErr);
581
/* set context for dynamic groups */
582
savectx = pvm_setcontext( SYSCTX_DG );
584
/* send the request to the group server. */
585
if ((sbuf = pvm_mkbuf(PvmDataDefault)) < 0)
588
if ((sbuf = pvm_setsbuf(sbuf)) < 0)
591
if (pvm_pkstr(group) < 0)
594
if (request == GETINST
596
|| request == BARRIER
597
|| request == BARRIERV
598
|| request == STATICGROUP)
601
if (pvm_pkint(&optarg, 1, 1 ) < 0)
605
if (pvm_send(stid, request) < 0)
608
if ((rbuf = pvm_setrbuf(0)) < 0) /* get return value from server */
611
if (request == BARRIERV) request = BARRIER;
613
if (pvm_recv(stid, request) < 0)
617
if (pvm_upkint(rvalue, 1, 1) < 0)
620
if (request == JOIN || request == LEAVE || request == BARRIER
622
state = DYNAMIC; /* no state data will be returned */
624
pvm_upkint(&state,1,1);
626
if (state == STATIC) /* we've got new static group info */
627
gs_cachegroup(sgroup_list, &ngroups, &sgroup);
629
pvm_freebuf(pvm_setsbuf(sbuf)); /* restore the users mbufs */
631
pvm_freebuf(pvm_setrbuf(rbuf));
633
/* restore user context */
634
pvm_setcontext( savectx );
639
/* ================ gs_get_tidlist() ================================= */
641
int info = gs_get_tidlist(char *group, int msgtag, int *ntids, int **tids,
642
int holes_not_allowed)
644
msgtag - msgtag to use for querying server
645
ntids - number of tids in the tidlist
646
tids - the tidlist itself. Malloc'ed
647
holes_not_allowed - flag to indicate tid list must not have holes.
651
gs_get_tidlist(group, msgtag, ntids, tids, holes_not_allowed)
656
int holes_not_allowed;
662
int sbuf, state, stid;
665
GROUP_STRUCT_PTR sgroup;
667
if ( group == (char*)0 )
668
return(PvmNullGroup);
670
/* look up to see if the information is held locally */
672
sgroup = gs_group(group, sgroup_list, &ngroups, NOCREATE);
674
if (sgroup != (GROUP_STRUCT_PTR) NULL)
676
if (holes_not_allowed)
678
for (i=0; i < sgroup->ntids; i++)
679
if (sgroup->tids[i] == NOTID)
686
*tids = (int *) PVM_ALLOC(sgroup->maxntids*sizeof(int),"tidlist");
688
for (i = 0; i < sgroup->maxntids; i++)
689
(*tids)[i] = sgroup->tids[i];
691
*ntids = sgroup->ntids;
696
/* find out the server's tid, start the server if need be */
697
if ( (stid = gs_getgstid()) < 0 )
700
sbuf = pvm_mkbuf(PvmDataDefault); /* send rqst to server */
702
sbuf = pvm_setsbuf(sbuf);
704
rbuf = pvm_setrbuf(0);
708
/* set context for dynamic groups */
709
savectx = pvm_setcontext( SYSCTX_DG );
711
if (holes_not_allowed)
713
pvm_send(stid, TIDLIST); /* e.g. scatter, gather */
714
pvm_recv(stid, TIDLIST);
718
pvm_send(stid, BCAST); /* e.g. bcast */
719
pvm_recv(stid, BCAST);
722
/* restore user context */
723
pvm_setcontext( savectx );
725
pvm_upkint(ntids, 1, 1);
727
if (*ntids < 0) /* check for number of tids in group */
729
pvm_freebuf(pvm_setsbuf(sbuf));
730
pvm_freebuf(pvm_setrbuf(rbuf));
735
if (*ntids == 0) /* if there is no one in the group */
737
pvm_freebuf(pvm_setsbuf(sbuf));
738
pvm_freebuf(pvm_setrbuf(rbuf));
743
/* make room for the tids */
744
*tids = (int *)PVM_ALLOC((*ntids) * sizeof(int), "gs_get_tidlist");
746
if ((*tids) == (int *) NULL)
748
pvm_freebuf(pvm_setsbuf(sbuf));
749
pvm_freebuf(pvm_setrbuf(rbuf));
754
pvm_upkint(*tids, *ntids, 1);
756
pvm_upkint(&state,1,1);
758
if (state == STATIC) /* we've got new static group info */
759
gs_cachegroup(sgroup_list, &ngroups, &sgroup);
761
pvm_freebuf(pvm_setsbuf(sbuf)); /* restore the users mbufs */
763
pvm_freebuf(pvm_setrbuf(rbuf));
768
/* ================ gs_cachegroup() ================================== */
769
/* int info = gs_cachegroup(GROUP_LIST_PTR sgroup_list, int *ngroups,
770
GROUP_STRUCT_PTR *rsgroup);
772
sgroup_list - hash table that holds any static group information
773
ngroups - number of groups in the hash table
774
*rsgroup - pointer to structure that holds static info
776
unpack group information from a message and then create the group in
780
gs_cachegroup(sgroup_list, ngroups, rsgroup)
781
GROUP_LIST_PTR sgroup_list;
783
GROUP_STRUCT_PTR *rsgroup;
785
char *newname = (char *) NULL;
790
GROUP_STRUCT_PTR sgroup;
792
*rsgroup = (GROUP_STRUCT_PTR) NULL;
794
if ( (info = pvm_upkint(&len,1,1)) < 0 )
795
DO_ERROR_RTN( info, "gs_cachegroup" );
797
if (len < 0) /* didn't get a valid groupname */
800
if ( (newname = (char *) PVM_ALLOC(sizeof(char)*(len + 1),
801
"gs_cachegroup") ) == (char *) NULL)
802
DO_ERROR_RTN( PvmNoMem, "gs_cachegroup" );
804
if ( (info = pvm_upkstr(newname)) < 0 )
807
DO_ERROR_RTN( info, "gs_cachegroup" );
810
sgroup = gs_group(newname, sgroup_list, ngroups, CREATE);
812
if (sgroup != (GROUP_STRUCT_PTR) NULL)
814
if ( (info = pvm_upkint(&(sgroup->ntids),1,1) ) < 0 )
817
DO_ERROR_RTN( info, "gs_cachegroup" );
820
if ( (info = pvm_upkint(&(sgroup->maxntids),1,1) ) < 0 )
823
DO_ERROR_RTN( info, "gs_cachegroup" );
826
sgroup->tids = (int *) PVM_ALLOC(sgroup->maxntids*sizeof(int),
829
if (sgroup->tids == (int *) NULL)
830
gs_delete_group(newname, sgroup_list, ngroups);
833
if ( (info = pvm_upkint(sgroup->tids,sgroup->maxntids,1) ) < 0)
835
gs_delete_group(newname, sgroup_list, ngroups);
837
DO_ERROR_RTN( info, "gs_cachegroup" );
840
info = pvm_upkint(&(sgroup->nhosts),1,1);
842
sgroup->np_onhost = (int *) PVM_ALLOC(sizeof(int) *
843
sgroup->nhosts,"gs_cachegroup");
845
sgroup->pcoord = (int *) PVM_ALLOC(sizeof(int) *
846
sgroup->nhosts,"gs_cachegroup");
848
pvm_upkint(sgroup->np_onhost,sgroup->nhosts,1);
850
info = pvm_upkint(sgroup->pcoord,sgroup->nhosts,1);
854
gs_delete_group(newname, sgroup_list, ngroups);
856
DO_ERROR_RTN( info, "gs_cachegroup" );
859
sgroup->maxhosts = sgroup->nhosts;
862
sgroup->staticgroup = STATIC;
863
*rsgroup = sgroup; /* set the pointer to the group struct */
866
PVM_FREE(newname); /* free the malloc'ed memory */
871
/* ================ pvm_grphostinfo() =============================== */
872
/* int info = pvm_grphostinfo(char *group, int hosttid, int *coord,
873
int *nmem_onhost, int *nhosts)
874
* return information about how many hosts are represented in the group and
875
* which tid should be used to coordinate local (on-host) group operations
879
pvm_grphostinfo(group, hosttid, coord, nmem_onhost, nhosts)
881
int hosttid, *coord, *nmem_onhost, *nhosts;
883
GROUP_STRUCT_PTR sgroup;
888
int sbuf, state, stid;
892
/* BGN_TRACE( TEV_GRPHOST, group, TEV_DID_HPT, &hosttid ); */
894
info = gs_host_char(group, sgroup_list, &ngroups, hosttid,
895
coord, nmem_onhost, nhosts, &foo);
897
if (info != PvmOk ) /* info not local */
899
if ( (stid = gs_getgstid()) < 0) { /* find the server's ti */
901
/* END_TRACE( TEV_GRPHOST, TEV_DID_CC, &info ); */
905
/* set context for dynamic groups */
906
savectx = pvm_setcontext( SYSCTX_DG );
908
sbuf = pvm_mkbuf(PvmDataDefault);
910
rbuf = pvm_setrbuf(0);
912
sbuf = pvm_setsbuf(sbuf);
914
if ((info = pvm_pkstr(group)) < 0 )
917
if ((info = pvm_pkint(&hosttid,1,1)) < 0)
920
if ((info = pvm_send(stid,HOSTCHAR)) < 0)
923
if ((info = pvm_recv(stid,HOSTCHAR)) < 0)
926
if ((info = pvm_upkint(nhosts,1,1)) < 0)
929
if ((info = pvm_upkint(nmem_onhost,1,1)) < 0)
932
if ((info = pvm_upkint(coord,1,1)) < 0)
935
if (( info = pvm_upkint(&state,1,1)) < 0)
938
if (state == STATIC) /* we've got new static group info */
939
gs_cachegroup(sgroup_list, &ngroups, &sgroup);
943
sbuf = pvm_setsbuf(sbuf);
945
rbuf = pvm_setrbuf(rbuf);
951
/* restore user context */
952
pvm_setcontext( savectx );
955
/* END_TRACE( TEV_GRPHOST, TEV_DID_CC, &info ); */
960
/* ================ pvm_grpvhostinfo() =============================== */
961
/* int info = pvm_grpvhostinfo(char *group, int **coord,
962
int **nmem_onhost, int *nhosts)
963
* return #vectors# of information about how may hosts are represented in
964
* a group, the local coordinating tid for each host, and #procs on each host
966
* NOTE: for efficiency, the data in the vectors *nmem_host and
967
*coord are valid only until the next call to pvm_grpvhostinfo
970
static int *gsu_coordv = (int *) NULL;
971
static int *gsu_onhostv = (int *) NULL;
972
static int gsu_maxhosts = 0;
975
pvm_grpvhostinfo(group, coordv, nmem_onhostv, nhosts)
977
int **coordv, **nmem_onhostv, *nhosts;
983
int sbuf, state, stid;
987
GROUP_STRUCT_PTR sgroup;
989
/* BGN_TRACE( TEV_GRPVHOST, group, TEV_DID_HPT, &hosttid ); */
991
info = gs_host_all(group, sgroup_list, &ngroups,
992
coordv, nmem_onhostv, nhosts, &foo);
994
if (info != PvmOk ) /* info not local */
996
if ( (stid = gs_getgstid()) < 0) { /* find the server's ti */
998
/* END_TRACE( TEV_GRPHOST, TEV_DID_CC, &info ); */
1002
/* set context for dynamic groups */
1003
savectx = pvm_setcontext( SYSCTX_DG );
1005
sbuf = pvm_mkbuf(PvmDataDefault);
1007
rbuf = pvm_setrbuf(0);
1009
sbuf = pvm_setsbuf(sbuf);
1011
if ((info = pvm_pkstr(group)) < 0)
1014
if ((info = pvm_send(stid,HOSTCHARV)) < 0)
1017
if ((info = pvm_recv(stid,HOSTCHARV)) < 0)
1020
if ((info = pvm_upkint(nhosts,1,1)) < 0)
1023
if (*nhosts > gsu_maxhosts)
1026
PVM_FREE(gsu_coordv);
1029
PVM_FREE(gsu_onhostv);
1031
gsu_coordv = (int *) PVM_ALLOC(*nhosts*sizeof(int),
1034
gsu_onhostv = (int *) PVM_ALLOC(*nhosts*sizeof(int),
1037
gsu_maxhosts = *nhosts;
1040
if (gsu_onhostv == (int *) NULL || gsu_coordv == (int *) NULL)
1046
if ((info = pvm_upkint(gsu_onhostv,*nhosts,1)) < 0)
1049
if ((info = pvm_upkint(gsu_coordv,*nhosts,1)) < 0)
1052
if ((info = pvm_upkint(&state,1,1)) < 0)
1055
if (state == STATIC) /* we've got new static group info */
1056
gs_cachegroup(sgroup_list, &ngroups, &sgroup);
1059
sbuf = pvm_setsbuf(sbuf);
1061
rbuf = pvm_setrbuf(rbuf);
1067
/* restore user context */
1068
pvm_setcontext( savectx );
1070
*nmem_onhostv = gsu_onhostv;
1072
*coordv = gsu_coordv;
1075
/* END_TRACE( TEV_GRPVHOST, TEV_DID_CC, &info ); */