All:
I have written a C program using threads and have a question. I have an
external message table that I need to be persistent between threads. The
message table is loaded from an external QSAM file. Program in Cobol loads the
table. I want to be able to use the message table in other threads. Does anyone
know is Working-Storage from one thread available to other threads ?
/*------------------------------------------------------*/
/* program: VOYTHR01 - modelled after pthread5 */
/* Company: IDF */
/* Author: Scott Ford */
/* Date-Created: 05-05-??-2013 */
/* Narative: Calls cobol subprograms */
/*------------------------------------------------------*/
#define _OPEN_THREADS
#pragma runopts(POSIX(ON))
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void *msgload (void *threadid)
{
printf("Thread entered - Fine\n");
int rc;
char func[35];
memset(func,0,sizeof(func));
strcpy(func,"LOAD NONE NONE");
printf("func: %s",func);
rc = IDFMSGUT(func);
}
main()
{
pthread_t thread1;
int ret1;
int t;
t = 1;
ret1 = pthread_create( &thread1, NULL, *msgload, (void *)t);
if (ret1 == 0)
{ printf("Thread Created - Fine\n");
}
pthread_join(thread1,NULL);
exit(0)
}
CBL NOC(E),FLAG(W),DATA(31),NODYN,RES,RENT,OPT,MAP,NOSSR
CBL NOZWB,NUM,NOTERM,NOVBREF,X,APOST,LIB,LIST
CBL THREAD
IDENTIFICATION DIVISION.
PROGRAM-ID. IDFMSGUT IS RECURSIVE.
AUTHOR. IDENTITY-FORGE.
******************************************************************
* 05/05/2014
* SF - cloned voyager to build idfmsgdi module
******************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-370.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT MSGTBL
ASSIGN TO MSGTBL
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS MSGTBL-STATUS.
DATA DIVISION.
FILE SECTION.
FD MSGTBL
BLOCK CONTAINS 0
RECORD CONTAINS 130 CHARACTERS.
01 MSGTBL-INREC.
05 MSGTBL-DATA PIC X(130) VALUE SPACES.
WORKING-STORAGE SECTION.
LOCAL-STORAGE SECTION.
01 MSGTBL-STATUS PIC 99.
01 MSGTBL-FLAG PIC X VALUE 'X'.
88 EOF-ON-MESSAGE VALUE 'T'.
01 MSGTBL-TBL.
10 MSGS-IN OCCURS 200 TIMES INDEXED BY TBL-INDX.
15 MSG-KEY PIC X(6).
15 MSG-ID PIC X(9).
15 MSG-TXT PIC X(115).
01 SEARCH-TXT PIC X(116).
01 SEARCH-KEY PIC X(6).
01 MSGCTR PIC 9999.
01 TBL-KEY PIC X(8).
01 X PIC 9999.
01 LOAD-STAT PIC 9.
01 FUNC PIC X(6).
01 MSGID PIC X(9).
01 MSGVAR PIC X(20).
LINKAGE SECTION.
77 CSTRING PIC X(35).
PROCEDURE DIVISION USING CSTRING.
UNSTRING CSTRING
DELIMITED BY X'00'
INTO
FUNC
MSGID
MSGVAR
END-UNSTRING.
DISPLAY 'FUNC: ' FUNC
IF FUNC(1:4) = 'LOAD' THEN
PERFORM 010-LOAD-MSGTBL THRU 010-LOAD-MSGTBL-EXIT
MOVE 0 TO LOAD-STAT
END-IF.
IF FUNC(1:6) = 'SEARCH' THEN
PERFORM 010-SEARCH-MSGTBL THRU 010-SEARCH-MSGTBL-EXIT
END-IF
GOBACK.
010-LOAD-MSGTBL.
OPEN INPUT MSGTBL
IF MSGTBL-STATUS = 0 THEN
DISPLAY 'IDFMSGUT Opened external msgtbl ok'
READ MSGTBL AT END
MOVE 'T' TO MSGTBL-FLAG
END-READ
MOVE 1 TO X
PERFORM UNTIL EOF-ON-MESSAGE
MOVE MSGTBL-INREC TO MSGS-IN (X)
DISPLAY 'MSGCTR: ' MSGCTR ' ' MSGTBL-INREC
ADD +1 TO MSGCTR
ADD 1 TO X
READ MSGTBL AT END
MOVE 'T' TO MSGTBL-FLAG
END-READ
END-PERFORM
DISPLAY 'IDFMSGUT Loaded: ' MSGCTR' Messages'
CLOSE MSGTBL
END-IF.
010-LOAD-MSGTBL-EXIT.
EXIT.
010-SEARCH-MSGTBL.
SET TBL-INDX TO 1
SEARCH MSGS-IN
AT END PERFORM 010-MSGID-NOTFND THRU
010-MSGID-NOTFND-EXIT
WHEN MSG-KEY(TBL-INDX) = SEARCH-KEY
PERFORM 010-SRCHREP-VAR THRU
010-SRCHREP-VAR-EXIT
END-SEARCH.
010-SEARCH-MSGTBL-EXIT.
EXIT.
010-MSGID-NOTFND.
DISPLAY 'MSG-KEY: ' MSG-KEY (TBL-INDX)
DISPLAY ' >> MSG-KEY NOT FOUND ERROR <<'.
010-MSGID-NOTFND-EXIT.
EXIT.
010-SRCHREP-VAR.
010-SRCHREP-VAR-EXIT.
EXIT.
The above code as it stands works fine. I want MSGTBL to be persistent between
threads.
Regards,
Scott
www.identityforge.com
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN