fis-gtm/sr_port/jnlpool_hasnt_overflowed.c

42 lines
1.9 KiB
C

/****************************************************************
* *
* Copyright 2003, 2004 Sanchez Computer Associates, Inc. *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#include "memcoherency.h"
#include "gdsroot.h"
#include "gdsblk.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "repl_msg.h"
#ifdef VMS
#include <descrip.h>
#endif
#include "gtmsource.h"
boolean_t jnlpool_hasnt_overflowed(jnlpool_ctl_ptr_t jctl, uint4 jnlpool_size, qw_num read_addr)
{ /* the advantage of passing the three arguments is they are likely (on most platforms) to be scratch registers that can also
* be used for computation. Also, besides all callers would have already loaded jctl and jnlpool_size */
/* For systems with UNORDERED memory access (example, ALPHA, POWER4, PA-RISC 2.0), on a multi processor system, it is
* possible that the source server notices the change in jnlpool_ctl->write_addr before seeing the change to the content
* to be read (including the jnl_data_header). To avoid such conditions, we should commit the order of shared memory
* updates before and after the content is updated (see t_end.c, tp_tend.c). To ensure the source server reads content
* that is correct, it should invalidate its cache before the read. After the read, to ensure that the content is correct
* (not some that may have been overwritten), it has to invalidate its cache to fetch the latest value of early_write_addr.
*
*/
SHM_READ_MEMORY_BARRIER; /* to fetch the latest early_write_addr */
return (jnlpool_size >= (jctl->early_write_addr - read_addr));
}