From: John B. <bel...@cs...> - 2001-06-14 22:47:12
|
On Thursday, June 14, 2001, at 03:09 PM, Ann W. Harrison wrote: > At 02:27 PM 6/14/2001 -0700, John Bellardo wrote: >> [.....] >> Gpre produces a number of calls to internal functions (such as >> isc_compile_request) that are expecting void**. For the time being >> I've been changing the BLK* declaration to void**, and commenting it >> to fix later. What is the correct fix? Do the isc_compile_request, >> et. al functions expect a BLK* in void** clothing, or do the really >> operate on a void**. I could define a c++ type operator that converts >> a blk->void*, but that won't help with the **'s. >> Any thoughts? Thanks. > > > For starters, isc_compile_request is not an internal function, but part > of the previously documented API. My mistake. > When gpre is using that level of interface, > it should be generating request handle declarations like this: > > static isc_req_handle > isc_7 = 0; /* request handle */ > > I believe that isc_req_handle et al. resolve down to void **, though I > would > prefer to see the routines declared with the actual handle type-names > for > the sake of documentation. They were changed to void ** by the previous > administration. Sounds good, but I'm using the -g switch (see below) so I don't think it applies... > > However, for dfw.e and other .e files within the engine, gpre should be > generating > actual internal calls to routines like CMP_compile2 request > > request = (BLK) CMP_compile2 (tdbb, jrd_356, TRUE); > > If the code you're seeing in DFW is not like this, you should use the -g > switch. And that is what I am seeing. Here is a the first part of the DFW_update_index function from dfw.epp: BLK request; tdbb = GET_THREAD_DATA; dbb = tdbb->tdbb_database; request = (BLK) CMP_find_request(tdbb, irq_m_index, IRQ_REQUESTS); FOR(REQUEST_HANDLE request) IDX IN RDB$INDICES WITH IDX.RDB$INDEX_NAME EQ work->dfw_name ......... And the resulting code (after gpre) from dfw.cpp: BLK request; tdbb = GET_THREAD_DATA; dbb = tdbb->tdbb_database; request = (BLK) CMP_find_request(tdbb, irq_m_index, IRQ_REQUESTS); /*FOR(REQUEST_HANDLE request) IDX IN RDB$INDICES WITH IDX.RDB$INDEX_NAME EQ work->dfw_name*/ { { if (!DB) isc_attach_database ((long*) 0L, 0, "ODS.RDB", &DB, 0, (char*) 0); if (DB && !gds__trans) isc_start_transaction ((long*) 0L, &gds__trans, (short) 1, &DB, (shor t) 0, (char*) 0); } if (!request) isc_compile_request ((long*) 0L, &DB, &request, (short) sizeof (isc_3 56), (char ISC_FAR *) isc_356); .................... I've included enough code to see the first offender; the call to isc_compile_request third parameter. The request variable is a BLK (ie, blk*), so &request is a blk**. isc_compile_request expects a void**. I looked in a copy of Stroustrup and there is an implicit conversion from xxx* to void*, but that doesn't apply because we are using blk** to void**. Since the call generating the error is created from gpre, should gpre always include a cast to void** when it emits the calls? That would be trusting the user to do the right thing. Otherwise I need to continue changing the declaration of "request" to void* from BLK. > > There's more, of course - the blk structure is a significant part of the > internal memory management and as such, quite dear to me. What we > should > do is ditch all the memory management and use destructors and use counts > and that sort of thing - but that's a project and a half. Until then, > the > blk structure is of some considerable importance. One can always dream (or make a wish list). -John |