Re: Check existence of data area in ILE C
Jevgeni Astanovski <[email protected]>
| Newsgroups | gmane.comp.lang.as400.c |
|---|---|
| Message-ID | <CAJuVQr1_Bk2Duwe_nMOq2q3GUkDk+2wBAQHZ0kJoAX2=kny9jQ@mail.gmail.com> |
Also my thanks to Chuck for _CTLA_HANDLE_NO_MSG. I had no idea about this option. Of course a piece I shared was written by someone here in the previous millenium. And the fact that _CTLA_HANDLE does generate error message into the log in our particular case was rather useful.... Jevgeni. On Wed, Mar 11, 2015 at 9:56 AM, Zvi Kave <[email protected]> wrote: > Hi Chris, > > I shall try it later because I need a quick solution. > In the meantime I need only to replace _CTLA_HANDLE with > _CTLA_HANDLE_NO_MSG > in the exception handler. > Do I save CPU in your solution or it is the same, but without exception > handler ? > > Thanks, > > Zvi > > On 10/03/2015 20:10, [1]chrish-lbwoW8fqX/3W0OUqm4st0/d9D2ou9A/[email protected] wrote: > > Here is a quick sample for a data area which is a decimal data area (cannot > be retrieved using the QXX API's) > > #include <stdio.h> > #include <stdlib.h> > #include <string.h> > #include <qusec.h> > #include <decimal.h> > #include <qwcrdtaa.h> > > > typedef _Packed struct DA_content_x { > Qwc_Rdtaa_Data_Returned_t hdr; > char data[10]; > } DA_content_t; > > int main(int argc, char **argv) { > int rcvr_count = 0; > DA_content_t Dta_Content; /* data area content */ > decimal(5,0) *d_ptr; > char DA_Name[20] = "NBROFRCV CHLIB "; /* Name */ > Qus_EC_t Error_Code = {0}; /* error code struct */ > > Error_Code.Bytes_Provided = sizeof(Error_Code); > > QWCRDTAA(&Dta_Content, > sizeof(Dta_Content), > DA_Name, > 1, > 5, > &Error_Code); > if(Error_Code.Bytes_Available > 0) { > // do something about the error > printf("Error received %.7s\n",Error_Code.Exception_Id); > return -1; > } > printf("Available = %d\n",Dta_Content.hdr.Bytes_Available); > printf("Returned = %d\n",Dta_Content.hdr.Bytes_Returned); > printf("Type = %.10s\n",Dta_Content.hdr.Type_Value_Returned); > printf("Length = %.10s\n",Dta_Content.hdr.Length_Value_Returned); > printf("Decimal pos = %d\n",Dta_Content.hdr.Number_Decimal_Positions); > d_ptr = (decimal(5,0)*)Dta_Content.data; printf("Content = > %D(5,0)\n",*d_ptr); return 1; > } > > It's simple and easy to understand and does not require you to build in your > own error handler. Write it up as a generic handler for retrieving any data > area content. > > Chris... > > -----Original Message----- > From: C400-L [[2]mailto:c400-l-bounces-Zwy7GipZuJhWk0Htik3J/[email protected]] On Behalf Of Zvi Kave > Sent: March 10, 2015 12:04 PM > To: [3]c400-l-Zwy7GipZuJhWk0Htik3J/[email protected] > Subject: Re: [C400-L] Check existence of data area in ILE C > > Very nice. > _CTLA_HANDLE_NO_MSG made the trick!! > > Many thanks, > > Zvi > > On 10/03/2015 17:36, CRPence wrote: > > On 10-Mar-2015 10:20 -0500, Zvi Kave wrote: > > Sorry. It is too much complicated for me. > Waiting for simpler solution. > Perhaps a change in the exception handler?: > #pragma exception_handler(ERROR_OCCURED, ca, 0, _C2_MH_ESCAPE, \ > _CTLA_HANDLE, "MCH3401") > > Of course that would not resolve the issue of concurrency introduced > by performing a separate /check for existence/ test prior to invoking > the request to /Retrieve Data Area/ that itself performs the same > existence check. Nevertheless... > > I was unaware that the capability to suppress the messaging was > exposed externally in any of the HLLs, but a quick search of the > KnowledgeCenter revealed that there are both of the Exception Control > Actions available to the C language, "_CTLA_IGNORE_NO_MSG" and > "_CTLA_HANDLE_NO_MSG", which apparently provide the equivalent effect > of > the message suppression: > > [1][4]<http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzarf/prag_excep > tion_handler.htm%23prag_exception_handler> > "... > ctl_action > > Specifies an integer constant to indicate what action should take > place for this exception handler. If handler is a function, the default > value is _CTLA_INVOKE. If handler is a label, the default value is > _CTLA_HANDLE. This parameter is optional. > > The following are valid exception control actions that are defined > in the <except.h> header file: > > #define name Defined value and action > ... > _CTLA_HANDLE_NO_MSG Defined to 3. The exception is handled but > messages are not logged before calling the handler. The exception will > no longer be active when the handler gets control. Exception messages > are not logged. Msg_Ref_Key in the typedef _INTRPT_Hndlr_Parms_T is set > to zero. Exception processing ends when the exception handler returns. > This is valid for functions and labels. > ... > _CTLA_IGNORE_NO_MSG Defined to 132. The exception is handled and > messages are not logged. Control is not passed to the handler function > named on the directive and exception will no longer be active. > Execution > resumes at the instruction immediately following the instruction that > caused the exception. This is valid for functions only. > ..." > > References > > Visible links > 1. > [5]http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzarf/prag_exception > _handler.htm%23prag_exception_handler > -- > This is the Bare Metal Programming IBM i (AS/400 and iSeries) (C400-L) > mailing list To post a message email: [6]C400-L-Zwy7GipZuJhWk0Htik3J/[email protected] To subscribe, > unsubscribe, or change list options, > visit: [7]http://lists.midrange.com/mailman/listinfo/c400-l > or email: [8]C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected] > Before posting, please take a moment to review the archives at > [9]http://archive.midrange.com/c400-l. > > References > > Visible links > 1. mailto:chrish-lbwoW8fqX/3W0OUqm4st0/d9D2ou9A/[email protected] > 2. mailto:c400-l-bounces-Zwy7GipZuJhWk0Htik3J/[email protected] > 3. mailto:c400-l-Zwy7GipZuJhWk0Htik3J/[email protected] > 4. http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzarf/prag_exception_handler.htm%23prag_exception_handler > 5. http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzarf/prag_exception > 6. mailto:C400-L-Zwy7GipZuJhWk0Htik3J/[email protected] > 7. http://lists.midrange.com/mailman/listinfo/c400-l > 8. mailto:C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected] > 9. http://archive.midrange.com/c400-l > -- > This is the Bare Metal Programming IBM i (AS/400 and iSeries) (C400-L) mailing list > To post a message email: C400-L-Zwy7GipZuJhWk0Htik3J/[email protected] > To subscribe, unsubscribe, or change list options, > visit: http://lists.midrange.com/mailman/listinfo/c400-l > or email: C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected] > Before posting, please take a moment to review the archives > at http://archive.midrange.com/c400-l. > -- This is the Bare Metal Programming IBM i (AS/400 and iSeries) (C400-L) mailing list To post a message email: C400-L-Zwy7GipZuJhWk0Htik3J/[email protected] To subscribe, unsubscribe, or change list options, visit: http://lists.midrange.com/mailman/listinfo/c400-l or email: C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected] Before posting, please take a moment to review the archives at http://archive.midrange.com/c400-l.