MIDAS
Loading...
Searching...
No Matches
pvm3.h
Go to the documentation of this file.
1
2
/* $Id$ */
3
4
/*
5
* PVM version 3.4: Parallel Virtual Machine System
6
* University of Tennessee, Knoxville TN.
7
* Oak Ridge National Laboratory, Oak Ridge TN.
8
* Emory University, Atlanta GA.
9
* Authors: J. J. Dongarra, G. E. Fagg, M. Fischer
10
* G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
11
* P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
12
* (C) 1997 All Rights Reserved
13
*
14
* NOTICE
15
*
16
* Permission to use, copy, modify, and distribute this software and
17
* its documentation for any purpose and without fee is hereby granted
18
* provided that the above copyright notice appear in all copies and
19
* that both the copyright notice and this permission notice appear in
20
* supporting documentation.
21
*
22
* Neither the Institutions (Emory University, Oak Ridge National
23
* Laboratory, and University of Tennessee) nor the Authors make any
24
* representations about the suitability of this software for any
25
* purpose. This software is provided ``as is'' without express or
26
* implied warranty.
27
*
28
* PVM version 3 was funded in part by the U.S. Department of Energy,
29
* the National Science Foundation and the State of Tennessee.
30
*/
31
32
/*
33
* pvm3.h
34
*
35
* Libpvm3 includes.
36
*
37
* $Id$
38
*
39
*/
40
41
#ifndef _PVM3_H_
42
43
#define _PVM3_H_
44
45
/*
46
* Release version
47
*/
48
49
#define PVM_VER "3.4.2"
50
#define PVM_MAJOR_VERSION 3
51
#define PVM_MINOR_VERSION 4
52
#define PVM_PATCH_VERSION 2
53
54
#ifndef WIN32
55
#include <sys/time.h>
56
#else
57
#include "pvmwin.h"
58
#include <sys/timeb.h>
59
#include <time.h>
60
#endif
61
62
/*
63
* Data packing styles for pvm_initsend()
64
*/
65
66
#define PvmDataDefault 0
/* XDR encoding */
67
#define PvmDataRaw 1
/* Raw data copy */
68
#define PvmDataInPlace 2
/* Raw data, left in place */
69
#define PvmDataFoo PvmDataDefault
/* Internal use */
70
#define PvmDataTrace 4
/* User-Defined Trace Encoding */
71
72
/*
73
* pvm_spawn options
74
*/
75
76
#define PvmTaskDefault 0
77
#define PvmTaskHost 1
/* specify host */
78
#define PvmTaskArch 2
/* specify architecture */
79
#define PvmTaskDebug 4
/* start task in debugger */
80
#define PvmTaskTrace 8
/* process generates trace data */
81
/* for MPP ports */
82
#define PvmMppFront 16
/* spawn task on service node */
83
#define PvmHostCompl 32
/* complement host set */
84
/* for parent-less spawning */
85
#define PvmNoSpawnParent 64
86
87
/*
88
* pvm_notify kinds
89
*/
90
91
#define PvmTaskExit 1
/* on task exit */
92
#define PvmHostDelete 2
/* on host fail/delete */
93
#define PvmHostAdd 3
/* on host startup */
94
#define PvmRouteAdd 4
/* new task-task route opened */
95
#define PvmRouteDelete 5
/* task-task route closed */
96
97
/* flags combined with notify kind */
98
99
#define PvmNotifyCancel 256
/* cancel (complete immediately) notifies */
100
101
/*
102
* for pvm_setopt and pvm_getopt
103
*/
104
105
#define PvmRoute 1
/* routing policy */
106
#define PvmDontRoute 1
/* don't allow direct task-task links */
107
#define PvmAllowDirect 2
/* allow direct links, but don't request */
108
#define PvmRouteDirect 3
/* request direct links */
109
#define PvmDebugMask 2
/* debugmask */
110
#define PvmAutoErr 3
/* auto error reporting */
111
#define PvmOutputTid 4
/* stdout destination for children */
112
#define PvmOutputCode 5
/* stdout message tag */
113
#define PvmTraceTid 6
/* trace destination for children */
114
#define PvmTraceCode 7
/* trace message tag */
115
#define PvmTraceBuffer 8
/* trace buffering for children */
116
#define PvmTraceOptions 9
/* trace options for children */
117
#define PvmTraceFull 1
/* do full trace events */
118
#define PvmTraceTime 2
/* only do PVM routine timings */
119
#define PvmTraceCount 3
/* only do PVM routine profiling */
120
#define PvmFragSize 10
/* message fragment size */
121
#define PvmResvTids 11
/* allow reserved message tids and codes */
122
#define PvmSelfOutputTid 12
/* stdout destination for task */
123
#define PvmSelfOutputCode 13
/* stdout message tag */
124
#define PvmSelfTraceTid 14
/* trace destination for task */
125
#define PvmSelfTraceCode 15
/* trace message tag */
126
#define PvmSelfTraceBuffer 16
/* trace buffering for task */
127
#define PvmSelfTraceOptions 17
/* trace options for task */
128
#define PvmShowTids 18
/* pvm_catchout prints task ids with output */
129
#define PvmPollType 19
/* shared memory wait method */
130
#define PvmPollConstant 1
131
#define PvmPollSleep 2
132
#define PvmPollTime 20
/* time before sleep if PvmPollSleep */
133
#define PvmOutputContext 21
/* stdout message context */
134
#define PvmTraceContext 22
/* trace message context */
135
#define PvmSelfOutputContext 23
/* stdout message context */
136
#define PvmSelfTraceContext 24
/* trace message context */
137
#define PvmNoReset 25
/* do not kill task on reset */
138
139
/*
140
* for pvm_[sg]ettmask
141
*/
142
143
#define PvmTaskSelf 0
/* this task */
144
#define PvmTaskChild 1
/* (future) child tasks */
145
146
/*
147
* Need to have PvmBaseContext defined
148
*/
149
150
#define PvmBaseContext 0
151
152
/*
153
* for message mailbox operations: pvm_putinfo and pvm_recvinfo
154
*/
155
156
#define PvmMboxDefault 0
/* put: single locked instance */
157
/* recv: 1st entry */
158
/* start w/index=0 */
159
#define PvmMboxPersistent 1
/* entry remains after owner exit */
160
#define PvmMboxMultiInstance 2
/* multiple entries in class */
161
#define PvmMboxOverWritable 4
/* can write over this entry */
162
#define PvmMboxFirstAvail 8
/* select 1st index >= specified */
163
#define PvmMboxReadAndDelete 16
/* atomic read / delete */
164
/* requires read & delete rights */
165
#define PvmMboxWaitForInfo 32
/* for blocking recvinfo */
166
167
168
#define PVMNORESETCLASS "###_PVM_NO_RESET_###"
169
170
#define PVMHOSTERCLASS "###_PVM_HOSTER_###"
171
172
#define PVMTASKERCLASS "###_PVM_TASKER_###"
173
174
#define PVMTRACERCLASS "###_PVM_TRACER_###"
175
176
#define PVMRMCLASS "###_PVM_RM_###"
177
178
/*
179
* Libpvm error codes
180
*/
181
182
#define PvmOk 0
/* Success */
183
#define PvmBadParam -2
/* Bad parameter */
184
#define PvmMismatch -3
/* Parameter mismatch */
185
#define PvmOverflow -4
/* Value too large */
186
#define PvmNoData -5
/* End of buffer */
187
#define PvmNoHost -6
/* No such host */
188
#define PvmNoFile -7
/* No such file */
189
#define PvmDenied -8
/* Permission denied */
190
#define PvmNoMem -10
/* Malloc failed */
191
#define PvmBadMsg -12
/* Can't decode message */
192
#define PvmSysErr -14
/* Can't contact local daemon */
193
#define PvmNoBuf -15
/* No current buffer */
194
#define PvmNoSuchBuf -16
/* No such buffer */
195
#define PvmNullGroup -17
/* Null group name */
196
#define PvmDupGroup -18
/* Already in group */
197
#define PvmNoGroup -19
/* No such group */
198
#define PvmNotInGroup -20
/* Not in group */
199
#define PvmNoInst -21
/* No such instance */
200
#define PvmHostFail -22
/* Host failed */
201
#define PvmNoParent -23
/* No parent task */
202
#define PvmNotImpl -24
/* Not implemented */
203
#define PvmDSysErr -25
/* Pvmd system error */
204
#define PvmBadVersion -26
/* Version mismatch */
205
#define PvmOutOfRes -27
/* Out of resources */
206
#define PvmDupHost -28
/* Duplicate host */
207
#define PvmCantStart -29
/* Can't start pvmd */
208
#define PvmAlready -30
/* Already in progress */
209
#define PvmNoTask -31
/* No such task */
210
#define PvmNotFound -32
/* Not Found */
211
#define PvmExists -33
/* Already exists */
212
#define PvmHostrNMstr -34
/* Hoster run on non-master host */
213
#define PvmParentNotSet -35
/* Spawning parent set PvmNoSpawnParent */
214
215
/*
216
* crusty error constants from 3.3, now redefined...
217
*/
218
#define PvmNoEntry PvmNotFound
/* No such entry */
219
#define PvmDupEntry PvmDenied
/* Duplicate entry */
220
221
/*
222
* Data types for pvm_reduce(), pvm_psend(), pvm_precv()
223
*/
224
225
#define PVM_STR 0
/* string */
226
#define PVM_BYTE 1
/* byte */
227
#define PVM_SHORT 2
/* short */
228
#define PVM_INT 3
/* int */
229
#define PVM_FLOAT 4
/* real */
230
#define PVM_CPLX 5
/* complex */
231
#define PVM_DOUBLE 6
/* double */
232
#define PVM_DCPLX 7
/* double complex */
233
#define PVM_LONG 8
/* long integer */
234
#define PVM_USHORT 9
/* unsigned short int */
235
#define PVM_UINT 10
/* unsigned int */
236
#define PVM_ULONG 11
/* unsigned long int */
237
238
/*
239
* returned by pvm_config()
240
*/
241
242
struct
pvmhostinfo
{
243
int
hi_tid
;
/* pvmd tid */
244
char
*
hi_name
;
/* host name */
245
char
*
hi_arch
;
/* host arch */
246
int
hi_speed
;
/* cpu relative speed */
247
int
hi_dsig
;
/* data signature */
248
};
249
250
/*
251
* returned by pvm_tasks()
252
*/
253
254
struct
pvmtaskinfo
{
255
int
ti_tid
;
/* task id */
256
int
ti_ptid
;
/* parent tid */
257
int
ti_host
;
/* pvmd tid */
258
int
ti_flag
;
/* status flags */
259
char
*
ti_a_out
;
/* a.out name */
260
int
ti_pid
;
/* task (O/S dependent) process id */
261
};
262
263
/*
264
* for pvm_getminfo(), pvm_setminfo()
265
*/
266
267
struct
pvmminfo
{
268
int
len
;
/* message length */
269
int
ctx
;
/* context */
270
int
tag
;
/* tag */
271
int
wid
;
/* wait id */
272
int
enc
;
/* encoding */
273
int
crc
;
/* crc checksum */
274
int
src
;
/* source tid */
275
int
dst
;
/* destination tid */
276
};
277
278
/*
279
* returned by pvm_getmboxinfo()
280
*/
281
282
struct
pvmmboxinfo
{
283
char
*
mi_name
;
/* class name */
284
int
mi_nentries
;
/* # of entries for this class */
285
int
*
mi_indices
;
/* mbox entry indices */
286
int
*
mi_owners
;
/* mbox entry owner tids */
287
int
*
mi_flags
;
/* mbox entry flags */
288
};
289
290
#ifdef __ProtoGlarp__
291
#undef __ProtoGlarp__
292
#endif
293
#if defined(__STDC__) || defined(__cplusplus)
294
#define __ProtoGlarp__(x) x
295
#else
296
#define __ProtoGlarp__(x) ()
297
#endif
298
299
#ifdef __cplusplus
300
extern
"C"
{
301
#endif
302
303
int
pvm_addhosts
__ProtoGlarp__
((
char
**,
int
,
int
*));
304
int
pvm_addmhf
__ProtoGlarp__
((
int
,
int
,
int
,
int
(*)(
int
)));
305
int
pvm_archcode
__ProtoGlarp__
((
char
*));
306
int
pvm_barrier
__ProtoGlarp__
((
char
*,
int
));
307
int
pvm_bcast
__ProtoGlarp__
((
char
*,
int
));
308
int
pvm_bufinfo
__ProtoGlarp__
((
int
,
int
*,
int
*,
int
*));
309
#if defined(EOF)
310
int
pvm_catchout
__ProtoGlarp__
((
FILE
*));
311
#endif
312
int
pvm_config
__ProtoGlarp__
((
int
*,
int
*,
struct
pvmhostinfo
**));
313
int
pvm_delhosts
__ProtoGlarp__
((
char
**,
int
,
int
*));
314
int
pvm_delinfo
__ProtoGlarp__
((
char
*,
int
,
int
));
315
int
pvm_delmhf
__ProtoGlarp__
((
int
));
316
int
pvm_exit
__ProtoGlarp__
((
void
));
317
int
pvm_export
__ProtoGlarp__
((
char
*));
318
int
pvm_freebuf
__ProtoGlarp__
((
int
));
319
int
pvm_freecontext
__ProtoGlarp__
((
int
));
320
int
pvm_gather
__ProtoGlarp__
((
void
*,
void
*,
int
,
int
,
int
,
char
*,
int
));
321
int
pvm_getcontext
__ProtoGlarp__
((
void
));
322
int
pvm_getfds
__ProtoGlarp__
((
int
**));
323
int
pvm_getinst
__ProtoGlarp__
((
char
*,
int
));
324
int
pvm_getminfo
__ProtoGlarp__
((
int
,
struct
pvmminfo
*));
325
int
pvm_getnoresets
__ProtoGlarp__
((
int
**,
int
*));
326
int
pvm_getopt
__ProtoGlarp__
((
int
));
327
int
pvm_getrbuf
__ProtoGlarp__
((
void
));
328
int
pvm_getsbuf
__ProtoGlarp__
((
void
));
329
int
pvm_gettid
__ProtoGlarp__
((
char
*,
int
));
330
int
pvm_gsize
__ProtoGlarp__
((
char
*));
331
int
pvm_halt
__ProtoGlarp__
((
void
));
332
int
pvm_hostsync
__ProtoGlarp__
((
int
,
struct
timeval
*,
struct
timeval
*));
333
int
pvm_initsend
__ProtoGlarp__
((
int
));
334
int
pvm_joingroup
__ProtoGlarp__
((
char
*));
335
int
pvm_kill
__ProtoGlarp__
((
int
));
336
int
pvm_lvgroup
__ProtoGlarp__
((
char
*));
337
int
pvm_getmboxinfo
__ProtoGlarp__
((
char
*,
int
*,
struct
pvmmboxinfo
**));
338
int
pvm_mcast
__ProtoGlarp__
((
int
*,
int
,
int
));
339
int
pvm_mkbuf
__ProtoGlarp__
((
int
));
340
int
pvm_mstat
__ProtoGlarp__
((
char
*));
341
int
pvm_mytid
__ProtoGlarp__
((
void
));
342
int
pvm_newcontext
__ProtoGlarp__
((
void
));
343
int
pvm_notify
__ProtoGlarp__
((
int
,
int
,
int
,
int
*));
344
int
pvm_nrecv
__ProtoGlarp__
((
int
,
int
));
345
int
pvm_packf
__ProtoGlarp__
((
const
char
*, ...));
346
int
pvm_parent
__ProtoGlarp__
((
void
));
347
int
pvm_perror
__ProtoGlarp__
((
char
*));
348
int
pvm_pkbyte
__ProtoGlarp__
((
char
*,
int
,
int
));
349
int
pvm_pkcplx
__ProtoGlarp__
((
float
*,
int
,
int
));
350
int
pvm_pkdcplx
__ProtoGlarp__
((
double
*,
int
,
int
));
351
int
pvm_pkdouble
__ProtoGlarp__
((
double
*,
int
,
int
));
352
int
pvm_pkfloat
__ProtoGlarp__
((
float
*,
int
,
int
));
353
int
pvm_pkint
__ProtoGlarp__
((
int
*,
int
,
int
));
354
int
pvm_pklong
__ProtoGlarp__
((
long
*,
int
,
int
));
355
int
pvm_pkshort
__ProtoGlarp__
((
short
*,
int
,
int
));
356
int
pvm_pkstr
__ProtoGlarp__
((
char
*));
357
int
pvm_pkuint
__ProtoGlarp__
((
unsigned
int
*,
int
,
int
));
358
int
pvm_pkulong
__ProtoGlarp__
((
unsigned
long
*,
int
,
int
));
359
int
pvm_pkushort
__ProtoGlarp__
((
unsigned
short
*,
int
,
int
));
360
int
pvm_precv
__ProtoGlarp__
((
int
,
int
,
void
*,
int
,
int
,
int
*,
int
*,
int
*));
361
int
pvm_probe
__ProtoGlarp__
((
int
,
int
));
362
int
pvm_psend
__ProtoGlarp__
((
int
,
int
,
void
*,
int
,
int
));
363
int
pvm_pstat
__ProtoGlarp__
((
int
));
364
int
pvm_putinfo
__ProtoGlarp__
((
char
*,
int
,
int
));
365
int
pvm_recv
__ProtoGlarp__
((
int
,
int
));
366
int
(*
pvm_recvf
__ProtoGlarp__
((
int
(*)(
int
,
int
,
int
)))) ();
367
int
pvm_recvinfo
__ProtoGlarp__
((
char
*,
int
,
int
));
368
int
pvm_reduce
__ProtoGlarp__
((
void
(*)(
int
*,
void
*,
void
*,
int
*,
int
*),
369
void
*,
int
,
int
,
int
,
char
*,
int
));
370
371
/*
372
* Predefined pvm_reduce functions
373
*/
374
void
PvmMax
__ProtoGlarp__
((
int
*,
void
*,
void
*,
int
*,
int
*));
375
void
PvmMin
__ProtoGlarp__
((
int
*,
void
*,
void
*,
int
*,
int
*));
376
void
PvmSum
__ProtoGlarp__
((
int
*,
void
*,
void
*,
int
*,
int
*));
377
void
PvmProduct
__ProtoGlarp__
((
int
*,
void
*,
void
*,
int
*,
int
*));
378
379
int
pvm_reg_hoster
__ProtoGlarp__
((
void
));
380
int
pvm_reg_rm
__ProtoGlarp__
((
struct
pvmhostinfo
**));
381
int
pvm_reg_tasker
__ProtoGlarp__
((
void
));
382
int
pvm_reg_tracer
__ProtoGlarp__
((
int
,
int
,
int
,
int
,
char
*,
int
,
int
));
383
int
pvm_scatter
__ProtoGlarp__
((
void
*,
void
*,
int
,
int
,
int
,
char
*,
int
));
384
int
pvm_send
__ProtoGlarp__
((
int
,
int
));
385
int
pvm_sendsig
__ProtoGlarp__
((
int
,
int
));
386
int
pvm_setcontext
__ProtoGlarp__
((
int
));
387
int
pvm_setminfo
__ProtoGlarp__
((
int
,
struct
pvmminfo
*));
388
int
pvm_setopt
__ProtoGlarp__
((
int
,
int
));
389
int
pvm_setrbuf
__ProtoGlarp__
((
int
));
390
int
pvm_setsbuf
__ProtoGlarp__
((
int
));
391
int
pvm_siblings
__ProtoGlarp__
((
int
**));
392
int
pvm_spawn
__ProtoGlarp__
((
char
*,
char
**,
int
,
char
*,
int
,
int
*));
393
int
pvm_start_pvmd
__ProtoGlarp__
((
int
,
char
**,
int
));
394
int
pvm_tasks
__ProtoGlarp__
((
int
,
int
*,
struct
pvmtaskinfo
**));
395
int
pvm_tickle
__ProtoGlarp__
((
int
,
int
*,
int
*,
int
*));
396
int
pvm_tidtohost
__ProtoGlarp__
((
int
));
397
int
pvm_trecv
__ProtoGlarp__
((
int
,
int
,
struct
timeval
*));
398
int
pvm_unexport
__ProtoGlarp__
((
char
*));
399
int
pvm_unpackf
__ProtoGlarp__
((
const
char
*, ...));
400
int
pvm_upkbyte
__ProtoGlarp__
((
char
*,
int
,
int
));
401
int
pvm_upkcplx
__ProtoGlarp__
((
float
*,
int
,
int
));
402
int
pvm_upkdcplx
__ProtoGlarp__
((
double
*,
int
,
int
));
403
int
pvm_upkdouble
__ProtoGlarp__
((
double
*,
int
,
int
));
404
int
pvm_upkfloat
__ProtoGlarp__
((
float
*,
int
,
int
));
405
int
pvm_upkint
__ProtoGlarp__
((
int
*,
int
,
int
));
406
int
pvm_upklong
__ProtoGlarp__
((
long
*,
int
,
int
));
407
int
pvm_upkshort
__ProtoGlarp__
((
short
*,
int
,
int
));
408
int
pvm_upkstr
__ProtoGlarp__
((
char
*));
409
int
pvm_upkuint
__ProtoGlarp__
((
unsigned
int
*,
int
,
int
));
410
int
pvm_upkulong
__ProtoGlarp__
((
unsigned
long
*,
int
,
int
));
411
int
pvm_upkushort
__ProtoGlarp__
((
unsigned
short
*,
int
,
int
));
412
char
*
pvm_version
__ProtoGlarp__
((
void
));
413
414
/*
415
* these are going away in the next version.
416
* use the replacements
417
*/
418
419
#ifdef PVM33COMPAT
420
int
pvm_getmwid
__ProtoGlarp__
((
int
));
421
int
pvm_setmwid
__ProtoGlarp__
((
int
,
int
));
422
#endif
423
424
/* made backwards compatible -> now use mbox interface... */
425
int
pvm_delete
__ProtoGlarp__
((
char
*,
int
));
426
int
pvm_insert
__ProtoGlarp__
((
char
*,
int
,
int
));
427
int
pvm_lookup
__ProtoGlarp__
((
char
*,
int
,
int
*));
428
429
#ifdef __cplusplus
430
}
431
#endif
432
#endif
/*_PVM3_H_*/
__ProtoGlarp__
#define __ProtoGlarp__(x)
Definition
pvm3.h:296
pvm_recvf
int(*)() pvm_recvf((int(*)(int, int, int)))
Definition
pvm3.h:366
h1_book
TH1X EXPRT * h1_book(const char *name, const char *title, int bins, double min, double max)
Definition
rmidas.h:24
pvmhostinfo
Definition
pvm3.h:242
pvmhostinfo::hi_speed
int hi_speed
Definition
pvm3.h:246
pvmhostinfo::hi_arch
char * hi_arch
Definition
pvm3.h:245
pvmhostinfo::hi_dsig
int hi_dsig
Definition
pvm3.h:247
pvmhostinfo::hi_name
char * hi_name
Definition
pvm3.h:244
pvmhostinfo::hi_tid
int hi_tid
Definition
pvm3.h:243
pvmmboxinfo
Definition
pvm3.h:282
pvmmboxinfo::mi_name
char * mi_name
Definition
pvm3.h:283
pvmmboxinfo::mi_owners
int * mi_owners
Definition
pvm3.h:286
pvmmboxinfo::mi_nentries
int mi_nentries
Definition
pvm3.h:284
pvmmboxinfo::mi_indices
int * mi_indices
Definition
pvm3.h:285
pvmmboxinfo::mi_flags
int * mi_flags
Definition
pvm3.h:287
pvmminfo
Definition
pvm3.h:267
pvmminfo::dst
int dst
Definition
pvm3.h:275
pvmminfo::ctx
int ctx
Definition
pvm3.h:269
pvmminfo::tag
int tag
Definition
pvm3.h:270
pvmminfo::src
int src
Definition
pvm3.h:274
pvmminfo::crc
int crc
Definition
pvm3.h:273
pvmminfo::wid
int wid
Definition
pvm3.h:271
pvmminfo::enc
int enc
Definition
pvm3.h:272
pvmminfo::len
int len
Definition
pvm3.h:268
pvmtaskinfo
Definition
pvm3.h:254
pvmtaskinfo::ti_host
int ti_host
Definition
pvm3.h:257
pvmtaskinfo::ti_flag
int ti_flag
Definition
pvm3.h:258
pvmtaskinfo::ti_ptid
int ti_ptid
Definition
pvm3.h:256
pvmtaskinfo::ti_pid
int ti_pid
Definition
pvm3.h:260
pvmtaskinfo::ti_a_out
char * ti_a_out
Definition
pvm3.h:259
pvmtaskinfo::ti_tid
int ti_tid
Definition
pvm3.h:255
include
pvm3.h
Generated on Sat May 3 2025 05:01:05 for MIDAS by
1.9.8