PUTINFO(3PVM)

๐Ÿ“ฆ version 3.4.6, in debian bookworm, ubuntu jammy

โœจ NAME โœจ

okay bestie, welcome to the PUTINFO(3PVM) page ๐Ÿ’– this is literally the manual for pvm_putinfo, pvm_recvinfo, pvm_getmboxinfo, and pvm_delinfo โ€” they store and retrieve messages in the global mailbox, periodt ๐Ÿ’Œ.


๐ŸŒธ SYNOPSIS ๐ŸŒธ

C:

int index = pvm_putinfo( char *name, int bufid, int flags )
int bufid = pvm_recvinfo( char *name, int index, int flags )
int info = pvm_delinfo( char *name, int index, int flags )
int info = pvm_getmboxinfo( char *pattern, int *nclasses,
                            struct pvmmboxinfo **classes )

struct pvmmboxinfo {
   char *mi_name;                /* class name */
   int   mi_nentries;            /* # of entries for this class */
   int  *mi_indices;             /* mbox entry indices */
   int  *mi_owners;              /* mbox entry owner tids */
   int  *mi_flags;               /* mbox entry flags */
};

Fortran:

call pvmfputinfo( name, bufid, flags, index )
call pvmfrecvinfo( name, index, flags, bufid )
call pvmfdelinfo( name, index, flags, info )
call pvmfgetmboxinfo( pattern, name, nclasses, nentries,
                      index, owner, flags, info )

๐ŸŽ€ PARAMETERS ๐ŸŽ€

  • name โ€” the database key (class name), any null-terminated string. it's giving "name your vibe" energy โœจ
  • index โ€” the database key (class index), must be >= 0. default index = 0. so if you don't pick one, it's zero bestie ๐Ÿ’…
  • flags โ€” user specified options. (see below, we got you) ๐Ÿ‘€
  • bufid โ€” handle of message buffer to put in database, or message returned. a returned bufid < 0 indicates an error. so negative = red flag ๐Ÿšฉ
  • info โ€” resulting status code. it's the receipts ๐Ÿ“
  • pattern โ€” GNU regular expression (pattern) to match on names in mailbox database. additionally, the singular "*" will match on all names. wildcard slay ๐Ÿ’ซ
  • nclasses โ€” number of classes matching pattern. count 'em ๐Ÿ”ข
  • classes โ€” array of pvmmboxinfo mailbox entries matching pattern. it's the whole squad ๐Ÿซ‚
  • nentries โ€” number of entries for a given class. how many besties in this class ๐Ÿ’–
  • owner โ€” task id that inserted entry into mailbox database. the original main character ๐Ÿ‘‘

๐Ÿ’– DESCRIPTION ๐Ÿ’–

these functions implement a "message mailbox" database that can be used by PVM tasks to advertise information to other PVM tasks. an example would be to advertise names or locations of services. another example would be to advertise a common "context" on which two tasks may communicate. it's literally a group chat for your tasks, no cap ๐Ÿ’ฌ

the database entries are PVM messages keyed by a user specified name and an optional index value. the name may be any null-terminated string and the index a non-negative integer. the index value is assigned by PVM and is used to uniquely identify one of multiple named instances within the database. so like, same name, different index = different bestie ๐Ÿฆ‹

entries are "owned" by the task that created them. an entry is automatically removed from the database when the owner task exits unless the database entry was created with flag PvmMboxPersistent. so if the owner ghosts, the entry ghosts too โ€” unless you made it persistent ๐Ÿ‘ป

when a task exits and leaves an entry in the mailbox, the owner tid of that entry is marked as zero (0) to indicate that there is no longer an active owner task. so zero tid = no active owner, just a memory ๐Ÿ’€

pvm_putinfo inserts a record in the database, given a key and data (message). it returns mailbox index number if the record is successfully stored, PvmExists if a record with the given key already exists, or PvmDenied if an attempt is made to overwrite a locked record. so it's either a new entry, a "already taken bestie", or a "you shall not pass" ๐Ÿšซ

the following options are added together as the flags parameter to pvm_putinfo. yes, add them like toppings on a sundae ๐Ÿ“

  • PvmMboxDefault โ€” inserts entry as the only named instance for a given name. this entry may only be modified and deleted by its owner. it is automatically deleted when its owner exits. so it's exclusive, no sharing ๐Ÿ’…
  • PvmMboxPersistent โ€” entry remains in the database when the owner task exits. entries are removed from the database when PVM is halted or a reset is issued from the console. so it survives the owner's exit but not the whole system going down ๐Ÿ’€
  • PvmMboxMultiInstance โ€” permits multiple entry instances of the same name. PVM will assign an index key to each instance. so you can have a whole polycule of entries with the same name ๐Ÿ‘ฏ
  • PvmMboxOverWritable โ€” permits other tasks to overwrite and delete this database entry. so it's open for edits, no gatekeeping ๐Ÿ”“
  • PvmMboxDirectIndex( index ) โ€” performs an atomic delete and re-insert for the mailbox entry at the given index. valid index values for this macro are limited to the range [ 0 .. PvmMboxMaxDirectIndex ). the given mailbox entry must have been created with the PvmMboxOverWritable flag set. if index is greater than 0, then the mailbox must also have been created with the PvmMboxMultiInstance flag set. so it's a glow-up swap, but you gotta follow the rules bestie โœจ

pvm_recvinfo operates just like a pvm_recv() except the message is coming from the database. the message should be unpacked after pvm_recvinfo(). like pvm_recv, pvm_recvinfo returns a pointer to a message buffer containing the record matching the key <name,index> from the database. returned value < 0 indicates an error. so it's recv but make it database ๐Ÿ’Œ

the following options are added together as the flags parameter to pvm_recvinfo. again, add 'em up ๐Ÿงฎ

  • PvmMboxDefault โ€” exact match on key <name, index> is returned. returns PvmNotFound if exact match not found. so it's giving precise, no fuzzy vibes ๐ŸŽฏ
  • PvmMboxFirstAvail โ€” the first entry in <name> with index greater than or equal to the specified index parameter is returned. PvmMboxFirstAvail with index = 0 will produce the same results as using PvmMboxDefault. so it's the "first available" bestie, very chill ๐ŸŒˆ
  • PvmMboxReadAndDelete โ€” return entry and delete from database. task must be permitted to do both read and delete otherwise an error will occur. bufid returns PvmNotFound if entry does not exist and will return PvmDenied if the record exists but may not be deleted. so it's read and yeet, but only if you're allowed ๐Ÿ—‘๏ธ

pvm_delinfo deletes database entry specified by the key <name, index>. returns PvmOK if the record was deleted, PvmNotFound if the record does not exist, or PvmDenied if an attempt is made to remove a "locked" record. so it's the delete button, but sometimes it says no ๐Ÿ”’

there are no flags presently specified for pvm_delinfo. so no extra toppings here, it's plain vanilla ๐Ÿฆ

pvm_getmboxinfo returns an array of pvmmboxinfo for all class names in the database. this is used, for example, by programs that clean up the database or for applications to find out what is available. classes returns a pointer to the array allocated by libpvm and freed on the next call to pvm_getmboxinfo. so it's the "what's in the mailbox" tour ๐Ÿ‘€

the Fortran function returns information on one entry per call. thus, if called repeatedly until an info value of PvmNotFound is returned, all entries matching the given pattern will have been returned. if a new pattern is desired, calling pvmfgetnames() with info = -1 will reset the entry name list and obtain a new list for the given pattern. so it's one at a time, keep calling till you hit PvmNotFound ๐Ÿ


๐Ÿ”ฅ EXAMPLES ๐Ÿ”ฅ

C:

/*
*  create and insert mailbox entry
*/
sprintf( service, "Task_A_service" );
sprintf( message, "Greetings from task A." );
pvm_initsend( PvmDataDefault );
pvm_pkint( &mytid, 1, 1 );
pvm_pkint( &context, 1, 1 );
pvm_pkstr( message );
if (( pvm_putinfo( service, pvm_getsbuf(), PvmMboxDefault )) == PvmExists ){
     printf( "can't register - service already running0 );
     exit( -1 );
}

/*
*  look for and retrieve specified mailbox
*/
sprintf( service, "Task_A_service" );
if (( msg_buf = pvm_recvinfo(service, 0, PvmMboxFirstAvail )) >= 0 ){
     pvm_setrbuf( msg_buf );
     pvm_upkint( &their_tid, 1, 1 );
     pvm_upkint( &their_context, 1, 1 );
     pvm_upkstr( message );
}

Fortran:

we need the fortran examples...


๐Ÿ˜ญ ERRORS ๐Ÿ˜ญ

the following error conditions can be returned by one or more of these functions. it's giving error code realness ๐Ÿ’…

  • PvmBadParam โ€” an invalid value was specified for bufid argument. bad param bestie, fix it ๐Ÿšฉ
  • PvmNoSuchBuf โ€” message buffer bufid doesn't exist. that buffer is not in the building ๐Ÿ’€
  • PvmNoMem โ€” libpvm is unable to allocate memory to pack data. no mem, no vibes, sorry ๐Ÿ˜ญ
  • PvmExists โ€” the requested key is already in use (pvm_putinfo). it's taken, periodt ๐Ÿ’”
  • PvmNotFound โ€” the requested key does not exist (pvm_recvinfo, pvm_delinfo). not found, not today ๐Ÿ™ˆ
  • PvmDenied โ€” the key is locked by another task and cannot be replaced or deleted. denied, no entry, bye ๐Ÿ‘‘

๐Ÿฆ‹ SEE ALSO ๐Ÿฆ‹

  • pvm_initsend(3PVM)
  • pvm_getsbuf(3PVM)
  • pvm_pack(3PVM)

and that's the whole page bestie! this iconic manual is from PVM Version 3.4, dated 22 May, 1997 โ€” slay, periodt ๐Ÿ’…โœจ๐Ÿ’–

๐Ÿ“ฆ where this page comes from