Tree @HEAD (Download .tar.gz)
- ..
- add_inter.c
- aio_shim.c
- anticipatory_freeze.c
- arlinkdbg.h
- ast.h
- auto_zlink.c
- auto_zlink.h
- backup_buffer_flush.c
- bin_load.c
- bit_op.h
- buildaux.csh
- buildaux_dse.csh
- buildaux_gde.csh
- buildaux_gtcm_gnp_server.csh
- buildaux_gtcm_pkdisp.csh
- buildaux_gtcm_play.csh
- buildaux_gtcm_server.csh
- buildaux_gtcm_shmclean.csh
- buildaux_gtmcrypt.csh
- buildaux_gtmsecshr.csh
- buildaux_lke.csh
- buildaux_mupip.csh
- buildbdp.csh
- buildbta.csh
- builddbg.csh
- buildpro.csh
- buildshr.csh
- buildwarn.awk
- buildwarn.csh
- callg.c
- callintogtmxfer.c
- callintogtmxfer.h
- ccp_cluster_lock_wake.c
- ccp_fid_msg.c
- ccp_sendmsg.c
- ccp_userwait.c
- ce_init.c
- ce_substitute.c
- cenable.c
- cenable.h
- ch_cond_core.c
- ch_overrun.c
- change_fhead_timer.c
- check_encrypt_support.sh
- check_utf8_support.csh
- ci_ret_code.c
- clear_cache_array.c
- clear_cache_array.h
- cli.c
- cli.h
- cli_disallow.c
- cli_disallow.h
- cli_lex.c
- cli_parse.c
- cli_parse.h
- cmidefsp.h
- cmistub.c
- cms_load.csh
- cms_load_pre_v42.csh
- comimage.csh
- comlist.csh
- comp_lits.c
- comque.csh
- condstk_expand.c
- configure.gtc
- continue_handler.c
- continue_handler.h
- continue_proc.c
- coverage_cc.sh
- crit_wake.c
- ctrap_set.c
- ctrlc_handler.c
- ctrlc_handler.h
- ctrlc_set.c
- custom_errors_sample.txt
- cvtprot.c
- cvttime.c
- daemon_crit.c
- db_ipcs_reset.c
- db_ipcs_reset.h
- db_read.h
- db_snapshot.h
- db_write.h
- db_write_eof_block.c
- db_write_eof_block.h
- dbfilop.c
- dbinit_ch.c
- dec_err.c
- decomment.m
- deferred_signal_handler.c
- deferred_signal_handler.h
- dircompare.m.txt
- disk_block_available.c
- disk_block_available.h
- dm_audit_log.c
- dm_audit_log.h
- dm_read.c
- do_semop.c
- do_semop.h
- do_shmat.c
- do_shmat.h
- do_verify.c
- do_xform.c
- dollarh.c
- dollarh.h
- dpgbldir_sysops.c
- dpgbldir_sysops.h
- dse.c
- dse_cmd.c
- dse_cmd_disallow.c
- dse_cmd_disallow.h
- dse_ctrlc_handler.c
- dse_help.c
- dse_open.c
- dse_puttime.c
- dse_remove.c
- dsk_read.c
- dsk_write_nocache.c
- eintr_wrapper_semop.h
- encrypt_sign_db_key.sh
- err_init.c
- error_return.c
- errorsp.h
- exi_ch.c
- extract_signal_info.c
- exttab_parse.c
- exttime.c
- f_char.c
- f_piece.c
- fake_enospc.c
- fake_enospc.h
- fgn_getinfo.c
- fgncalsp.h
- file_head_read.c
- file_head_write.c
- file_input.c
- file_input.h
- filestruct.h
- fix_pages.c
- forced_exit_err_display.c
- forced_exit_err_display.h
- fork_init.h
- ftok_sem_get_common.c
- ftok_sem_incrcnt.c
- ftok_sem_incrcnt.h
- ftok_sems.c
- ftok_sems.h
- gbldirnam.h
- gcall.h
- gdedefaults.gtc
- gdeget.m
- gdeput.m
- gdeverif.m
- gds_file_size.c
- gds_rundown.c
- gds_rundown_ch.c
- gds_rundown_err_cleanup.c
- gds_rundown_err_cleanup.h
- gdsfheadsp.h
- gdsfilext.c
- gdsfilext_nojnl.c
- gdsfilext_nojnl.h
- gen_gtm_threadgbl_deftypes.csh
- gen_keypair.sh
- gen_sym_hash.sh
- gen_sym_key.sh
- gen_ttt.csh
- gen_vms_ttt.csh
- gen_xfer_desc.cmake
- gen_xfer_desc.csh
- generate_help.csh
- generic_signal_handler.c
- generic_signal_handler.h
- gengtmdeftypes.csh
- genpat.c
- get_command_line.c
- get_full_path.c
- get_page_size.c
- get_src_line.c
- get_ztimeout.c
- getcaps.c
- getcaps.h
- geteditor.c
- geteditor.h
- getjobnum.c
- getmaxfds.c
- getmaxfds.h
- getstorage.c
- getzmode.c
- getzprocess.c
- go_load.c
- golevel.c
- goq_load.c
- gpgagent.tab.in
- grab_crit.c
- grab_crit_encr_cycle_sync.c
- grab_crit_immediate.c
- grab_latch.c
- grab_lock.c
- gse.mpt
- gt_ar.csh
- gt_as.csh
- gt_cc.csh
- gt_timer.h
- gt_timers.c
- gt_timers_add_safe_hndlrs.c
- gt_timers_add_safe_hndlrs.h
- gtcmstub.c
- gtcmtrstub.c
- gtm.c
- gtm.gtc
- gtm_aio.h
- gtm_asm_establish.c
- gtm_bintim.c
- gtm_c_stack_trace.c
- gtm_c_stack_trace_semop.c
- gtm_c_stack_trace_semop.h
- gtm_compare_dir.csh
- gtm_compile.c
- gtm_compile.h
- gtm_confstr.c
- gtm_conv.c
- gtm_conv.h
- gtm_conv_init.c
- gtm_cshrc.csh
- gtm_dbjnl_dupfd_check.c
- gtm_dbjnl_dupfd_check.h
- gtm_descript.h
- gtm_dump.c
- gtm_dump_core.c
- gtm_env.csh
- gtm_env_init_sp.c
- gtm_env_translate.c
- gtm_exit_handler.c
- gtm_exit_handler.h
- gtm_fd_trace.c
- gtm_file_remove.c
- gtm_file_stat.c
- gtm_filter_command.c
- gtm_filter_command.h
- gtm_fork_n_core.c
- gtm_ftok.c
- gtm_getmsg.c
- gtm_getpwuid.c
- gtm_icu.c
- gtm_icu.h
- gtm_icu_api.h
- gtm_image_exit.c
- gtm_init_env.c
- gtm_ipc.h
- gtm_is_main_thread.c
- gtm_isanlp.c
- gtm_isanlp.h
- gtm_logicals.h
- gtm_main.c
- gtm_main.h
- gtm_multi_proc.c
- gtm_multi_proc.h
- gtm_multi_thread.c
- gtm_multi_thread.h
- gtm_permissions.c
- gtm_permissions.h
- gtm_pipe.c
- gtm_pipe.h
- gtm_poll.h
- gtm_post_startup_check_init.c
- gtm_post_startup_check_init.h
- gtm_pthread.h
- gtm_pthread_init_key.c
- gtm_pthread_init_key.h
- gtm_putmsg.c
- gtm_putmsg_list.c
- gtm_rel_quant.h
- gtm_rename.c
- gtm_repl_multi_inst.h
- gtm_sem.h
- gtm_semaphore.h
- gtm_semutils.c
- gtm_semutils.h
- gtm_signal.h
- gtm_startup.c
- gtm_startup.h
- gtm_startup_chk.c
- gtm_startup_chk.h
- gtm_statvfs.h
- gtm_stdio.c
- gtm_stdio.h
- gtm_syslog.h
- gtm_system.c
- gtm_term.h
- gtm_termios.h
- gtm_test_install.csh
- gtm_test_install.txt
- gtm_text_alloc.c
- gtm_threadgbl_asm_access.txt
- gtm_threadgbl_deftypes_asm.si
- gtm_times.h
- gtm_tls.c
- gtm_tls.h
- gtm_tls_funclist.h
- gtm_tls_impl.c
- gtm_tls_impl.h
- gtm_tls_interface.h
- gtm_tls_loadlibrary.c
- gtm_tparm.c
- gtm_tparm.h
- gtm_tputs.c
- gtm_tputs.h
- gtm_trigger.c
- gtm_trigger.h
- gtm_trigger_trc.h
- gtm_ulimit.h
- gtm_unique_file_util.c
- gtm_unlink_all.c
- gtm_unlink_all.h
- gtm_utf8.c
- gtm_utf8.h
- gtm_version_dirname.csh
- gtm_version_dirname.sed
- gtm_wake.c
- gtm_zlib.c
- gtm_zlib.h
- gtmbase.gtc
- gtmci.c
- gtmci.h
- gtmci_ch.c
- gtmci_isv.c
- gtmci_signals.c
- gtmci_signals.h
- gtmcrypt.h
- gtmcrypt_dbk_ref.c
- gtmcrypt_dbk_ref.h
- gtmcrypt_entry.c
- gtmcrypt_funclist.h
- gtmcrypt_interface.h
- gtmcrypt_pk_ref.c
- gtmcrypt_pk_ref.h
- gtmcrypt_ref.c
- gtmcrypt_ref.h
- gtmcrypt_sym_ref.c
- gtmcrypt_sym_ref.h
- gtmcrypt_util.c
- gtmcrypt_util.h
- gtmcshrc.gtc
- gtmdbgflags.h
- gtmdef.csh
- gtmdefinedtypestodb.m
- gtmexcludetypelist.txt
- gtmexe_symbols.exp
- gtmgblstat.c
- gtmgblstat.h
- gtmgblstat.xc
- gtmhelp.m
- gtmhlpld.m
- gtminstall.sh
- gtmio.h
- gtmio_ch.c
- gtmlink.c
- gtmlink.h
- gtmpcat_sh.txt
- gtmprofile.gtc
- gtmprofile_preV54000.gtc
- gtmrecv.c
- gtmrecv.h
- gtmrecv_end.c
- gtmrecv_fetchresync.c
- gtmrecv_poll_actions.c
- gtmrecv_process.c
- gtmrecv_shutdown.c
- gtmrecv_stopfilter.c
- gtmsecshr.c
- gtmsecshr.h
- gtmsecshr_sock_cleanup.c
- gtmsecshr_sock_init.c
- gtmsecshr_wrapper.c
- gtmshr_symbols.exp
- gtmsiginfo.h
- gtmsource.c
- gtmsource.h
- gtmsource_changelog.c
- gtmsource_checkforbacklog.c
- gtmsource_checkhealth.c
- gtmsource_end.c
- gtmsource_flush_fh.c
- gtmsource_freeze.c
- gtmsource_get_opt.c
- gtmsource_heartbeat.c
- gtmsource_inline.h
- gtmsource_jnl_release_timer.c
- gtmsource_jnlpool.c
- gtmsource_losttncomplete.c
- gtmsource_mode_change.c
- gtmsource_needrestart.c
- gtmsource_onln_rlbk_clnup.c
- gtmsource_process.c
- gtmsource_process_ops.c
- gtmsource_readfiles.c
- gtmsource_readpool.c
- gtmsource_rootprimary_init.c
- gtmsource_seqno_init.c
- gtmsource_showbacklog.c
- gtmsource_shutdown.c
- gtmsource_srv_latch.c
- gtmsource_srv_latch.h
- gtmsource_statslog.c
- gtmsource_stopfilter.c
- gtmsrc.csh
- gtmstart.gtc
- gtmstop.gtc
- gtmthreadgblasm.m
- gtmxc_types.h
- gv_trig_cmd_table.h
- gv_trigger.c
- gv_trigger.h
- gv_trigger_protos.h
- gvcmx_canremlk_stub.c
- gvcmx_reqremlk_stub.c
- gvcmx_resremlk_stub.c
- gvcmx_susremlk_stub.c
- gvcmy_open.h
- gvcmz_bunch_stub.c
- gvcmz_error_stub.c
- gvcmz_neterr_stub.c
- gvcmz_zflush_stub.c
- gvcst_init_sysops.c
- gvcst_spr_data.c
- gvcst_spr_kill.c
- gvcst_spr_order.c
- gvcst_spr_query.c
- gvcst_spr_queryget.c
- gvcst_spr_zprevious.c
- gvusr.c
- hex2utf.mpt
- hugetlbfs_overrides.c
- hugetlbfs_overrides.h
- import_and_sign_key.sh
- incr_link.c
- incr_link.h
- init_gtm.c
- install_debug_symbols_sh.txt
- install_gtmpcat_sh.txt
- interlock.h
- invocation_mode.h
- io_get_fgn_driver.c
- io_init_name.c
- io_is_rm.c
- io_is_sn.c
- io_open_try.c
- io_type.c
- iob.h
- iob_close.c
- iob_flush.c
- iob_open_rd.c
- iob_open_wt.c
- iob_read.c
- iob_write.c
- ioff_open.c
- iopi_iocontrol.c
- iopi_open.c
- iorm_close.c
- iorm_flush.c
- iorm_get.c
- iorm_open.c
- iorm_rdone.c
- iorm_read.c
- iorm_readfl.c
- iorm_use.c
- iorm_write.c
- iorm_wteol.c
- iormdef.h
- iosize.h
- iosocket_pass_local.c
- iosocket_tls.c
- iosp.h
- iott_close.c
- iott_edit.c
- iott_edit.h
- iott_flush.c
- iott_flush_time.h
- iott_iocontrol.c
- iott_open.c
- iott_rdone.c
- iott_read.c
- iott_readfl.c
- iott_use.c
- iott_write.c
- iottdef.h
- iottdefsp.h
- ious_iocontrol.c
- ious_open.c
- ious_rdone.c
- ious_read.c
- ious_readfl.c
- ious_write.c
- ious_wtone.c
- ipcrmid.c
- ipcrmid.h
- is_file_identical.c
- is_fstype_nfs.c
- is_fstype_nfs.h
- is_icu_symbol_rename.csh
- is_proc_alive.c
- is_raw_dev.c
- is_raw_dev.h
- jnl_file_close_timer.c
- jnl_file_close_timer.h
- jnl_file_extend.c
- jnl_file_open.c
- jnl_fsync.c
- jnl_output_sp.c
- jnl_prc_vector.c
- jnlext_merge_sort_prepare.c
- jnlext_write.c
- jnlpool_init.c
- jnlsp.h
- jobchild_init.c
- jobchild_init.h
- joberr.h
- jobexam_signal_handler.c
- jobexam_signal_handler.h
- jobsp.h
- kitstart.csh
- laberror.c
- lib_list_ar.sed
- lib_list_lint.sed
- libdse.list
- liblke.list
- libmupip.list
- libstub.list
- lintgtm.csh
- lintimage.csh
- linuxi686_badd.txt
- list_file.c
- lke.c
- lke_cmd.c
- lke_cmd_disallow.c
- lke_cmd_disallow.h
- lke_ctrlc_handler.c
- lke_fileio.c
- lke_fileio.h
- lke_getansw.c
- lke_help.c
- load.h
- lockdefs.h
- lowerc_cp.sh
- lref_parse.c
- m_zrupdate.c
- m_ztrigger.c
- make_cimode.c
- make_dmode.c
- make_mode.c
- make_mode.h
- Makefile.mk
- map_sym.c
- maskpass.c
- mdefsa.h
- mdefsp.h
- mem_access.c
- memprot.c
- memprot.h
- mkutf8dir.csh
- mmrhash.c
- mmrhash.h
- msg.h
- mu_all_version_standalone.c
- mu_all_version_standalone.h
- mu_cre_file.c
- mu_cre_structs.c
- mu_cre_structs.h
- mu_decrypt.c
- mu_decrypt.h
- mu_extract.c
- mu_getkey.c
- mu_getkey.h
- mu_getlst.c
- mu_gvis.c
- mu_int_ch.c
- mu_op_open.c
- mu_op_open.h
- mu_outofband_setup.c
- mu_replpool_grab_sem.c
- mu_replpool_release_sem.c
- mu_rndwn_all.c
- mu_rndwn_all.h
- mu_rndwn_file.c
- mu_rndwn_file.h
- mu_rndwn_repl_instance.c
- mu_rndwn_repl_instance.h
- mu_rndwn_replpool.c
- mu_rndwn_replpool.h
- mu_rndwn_rlnkctl.c
- mu_rndwn_rlnkctl.h
- mu_signal_process.c
- mu_size_arsample.c
- mu_size_impsample.c
- mu_size_scan.c
- mu_swap_root.c
- mu_term_setup.c
- mu_term_setup.h
- mu_trig_trgfile.c
- mu_trig_trgfile.h
- mu_truncate.c
- mu_truncate.h
- mu_upgrd_sig_init.h
- mubexpfilnam.c
- mubfilcpy.c
- mubgetfil.c
- mubinccpy.c
- mucblkini.c
- mumps.cmake
- mumps_clitab.c
- mup_bak_sys.c
- mupip.c
- mupip_cmd.c
- mupip_cmd_disallow.c
- mupip_cmd_disallow.h
- mupip_crypt.c
- mupip_crypt.h
- mupip_ctrl.c
- mupip_ctrl.h
- mupip_cvtgbl.c
- mupip_cvtpgm.c
- mupip_dump_fhead.c
- mupip_dump_fhead.h
- mupip_endiancvt.c
- mupip_endiancvt.h
- mupip_exit.c
- mupip_exit_handler.c
- mupip_ftok.c
- mupip_ftok.h
- mupip_hash.c
- mupip_hash.h
- mupip_help.c
- mupip_load_reg_list.c
- mupip_load_reg_list.h
- mupip_load_triggerfile.h
- mupip_quit.c
- mupip_rctldump.c
- mupip_rctldump.h
- mupip_reorg_encrypt.c
- mupip_reorg_encrypt.h
- mupip_restore.c
- mupip_rundown.c
- mupip_sems.c
- mupip_sems.h
- mupip_set_file.c
- mupip_set_jnlfile.c
- mupip_size.c
- mupip_size.h
- mupip_trigger.c
- mupip_trigger.h
- mupip_upgrade_standalone.c
- mupip_upgrade_standalone.h
- muprecsp.h
- mur_cre_file_extfmt.c
- mur_read_file_sp.c
- murgetlst.c
- mutex.c
- mutex_sock_cleanup.c
- mutex_sock_init.c
- mutex_wake_proc.c
- mutexsp.h
- obj_code.c
- obj_file.c
- obj_filesp.h
- obj_fileu.c
- offset.awk
- offset.csh
- ojchildioclean.c
- ojchildioset.c
- ojchildparms.c
- ojchkfs.c
- ojparams.c
- ojstartchild.c
- op_currhd.c
- op_fgnlookup.c
- op_fnextract.c
- op_fnextract.h
- op_fnfgncal.c
- op_fngetdvi.c
- op_fngetjpi.c
- op_fngetlki.c
- op_fngetsyi.c
- op_fnp1.c
- op_fnpiece.c
- op_fnpopulation.c
- op_fnrandom.c
- op_fnzcall.c
- op_fnzconvert.c
- op_fnzfile.c
- op_fnzlkid.c
- op_fnzparse.c
- op_fnzpeek.c
- op_fnzpid.c
- op_fnzpriv.c
- op_fnzsearch.c
- op_fnzsetprv.c
- op_fnzsyslog.c
- op_fnztrnlnm.c
- op_job.c
- op_setextract.c
- op_setp1.c
- op_setpiece.c
- op_zattach.c
- op_zedit.c
- op_zhelp_xfr.c
- op_zhorolog.c
- op_zlink.c
- op_zmess.c
- op_zrupdate.c
- op_ztrigger.c
- op_zut.c
- outc.c
- parse_file.c
- parse_file.h
- peekbyname.mpt
- pinentry-gtm.sh
- pinentry.m
- pipeint_stats.c
- pipeint_stats.h
- probecrit_rec.h
- proc_wait_stat.c
- proc_wait_stat.h
- process_reorg_encrypt_restart.c
- process_reorg_encrypt_restart.h
- put_cdidx.c
- random.c
- random.h
- rc.h
- rc_cpt.h
- rc_cpt_ops.c
- recover_truncate.c
- recover_truncate.h
- recvpool_init.c
- reg_cmcheck.c
- rel_crit.c
- rel_latch.c
- rel_lock.c
- rel_quant.c
- relinkctl.c
- relinkctl.h
- remove_rms.c
- repl_inst_create.c
- repl_inst_dump.c
- repl_inst_dump.h
- repl_inst_edit.c
- repl_inst_ftok_counter_halted.c
- repl_inst_ftok_counter_halted.h
- repl_instance.c
- repl_instance.h
- repl_ipc_cleanup.c
- repl_log.c
- repl_log_init.c
- repl_logfileinfo_get.c
- repl_msg.h
- repl_sem.c
- repl_sem.h
- repl_sem_sp.h
- repl_sp.h
- resetterm.c
- rmv_mul_slsh.c
- rmv_mul_slsh.h
- rtnhdr.h
- rtnobj.c
- rtnobj.h
- rts_error.c
- runall.csh
- runall_cc_many.csh
- runall_cc_one.csh
- same_device_check.c
- scantypedefs.m
- secshr_client.c
- secshr_client.h
- send_msg.c
- set_jnl_file_close.c
- set_library_path.csh
- set_num_additional_processors.c
- set_zstatus.c
- setactive.csh
- setterm.c
- sgtm_putmsg.c
- show_install_config.sh
- sig_init.c
- sig_init.h
- simple_timeout_timer.c
- sleep.c
- sleep.h
- source_file.c
- ss_anal_shdw_file.c
- ss_context_mgr.c
- ss_get_block.c
- ss_initiate.c
- ss_lock_facility.c
- ss_lock_facility.h
- ss_read_block.c
- ss_release.c
- ss_shdw_mgr.c
- ss_write_block.c
- std_dev_outbndset.c
- stop_image.c
- stop_image_ch.c
- str_match.c
- str_match.h
- stripmine.awk
- suspend.c
- suspsigs_handler.c
- suspsigs_handler.h
- t_recycled2free.c
- t_recycled2free.h
- tab_probecrit_rec.h
- term_setup.c
- timersp.h
- trans_log_name.c
- trigger.h
- trigger_cmd.c
- trigger_compare.c
- trigger_compare_protos.h
- trigger_delete.c
- trigger_delete_protos.h
- trigger_fill_xecute_buffer.c
- trigger_fill_xecute_buffer.h
- trigger_gbl_fill_xecute_buffer.c
- trigger_gbl_fill_xecute_buffer.h
- trigger_incr_cycle.c
- trigger_incr_cycle.h
- trigger_locate_andor_load.c
- trigger_parse.c
- trigger_parse_protos.h
- trigger_read_andor_locate.h
- trigger_scan_string.c
- trigger_scan_string.h
- trigger_select.c
- trigger_select_protos.h
- trigger_source_read_andor_verify.c
- trigger_subs_def.h
- trigger_tpwrap_ch.c
- trigger_trgfile.c
- trigger_trgfile_protos.h
- trigger_update.c
- trigger_update_protos.h
- trigger_upgrade.c
- trigger_upgrade_protos.h
- trigger_user_name.c
- trigger_user_name.h
- trmdef.h
- ttt.txt
- upd_log_init.c
- urx_remove.c
- utf2hex.mpt
- utfcgr.c
- utfcgr.h
- utfcgr_trc.h
- util_exit_handler.c
- util_help.c
- util_help.h
- util_in_open.c
- util_input.c
- util_out_print_gtmio.c
- util_out_print_vaparm.h
- util_output.c
- util_output_cm.c
- util_spawn.c
- v15_filestruct.h
- versions.csh
- wait_for_disk_space.c
- wait_for_disk_space.h
- warn_db_sz.c
- warn_db_sz.h
- wcs_clean_dbsync.c
- wcs_clean_dbsync.h
- wcs_clean_dbsync_timer.c
- wcs_flu.c
- wcs_get_space.c
- wcs_write_in_progress_wait.c
- wcs_write_in_progress_wait.h
- wcs_wt.h
- wcs_wt_restart.c
- wcs_wterror.c
- wcs_wtfini.c
- wcs_wtfini_nocrit.c
- wcs_wtstart.c
- wcs_wtstart_fini.c
- xtrgtmtypes.awk
- ygblstat.mpt
- zbreaksp.h
- zcall_package.c
- zcall_package.h
- zhist.c
- zl_cmd_qlf.c
- zlmov_lnames.c
- zro_gettok.c
- zro_load.c
- zro_search.c
- zro_shlibs.c
- zro_shlibs.h
- zroutinessp.h
- zshow_devices.c
- zshow_rctldump.c
- zshow_zcalls.c
- ztimeout_routines.c
- ztimeout_routines.h
gtmsource_readpool.c @HEAD — raw · history · blame
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 | /**************************************************************** * * * Copyright (c) 2006-2022 Fidelity National Information * * Services, Inc. and/or its subsidiaries. All rights reserved. * * * * 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 "gtm_string.h" #include "gtm_socket.h" #include "gtm_inet.h" #include "gtm_fcntl.h" #include "gtm_unistd.h" #include "gtm_stat.h" #include <sys/time.h> #include <errno.h> #ifdef VMS #include <descrip.h> /* Required for gtmsource.h */ #endif #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" #include "gtmsource.h" #include "jnl.h" #include "buddy_list.h" #include "hashtab_mname.h" /* needed for muprec.h */ #include "hashtab_int4.h" /* needed for muprec.h */ #include "hashtab_int8.h" /* needed for muprec.h */ #include "muprec.h" #include "repl_ctl.h" #include "repl_errno.h" #include "repl_dbg.h" #include "memcoherency.h" #include "repl_tr_good.h" #include "min_max.h" #include "repl_instance.h" GBLREF jnlpool_addrs_ptr_t jnlpool; GBLREF gtmsource_state_t gtmsource_state; int gtmsource_readpool(uchar_ptr_t buff, int *data_len, int maxbufflen, boolean_t read_multiple, qw_num stop_read_at) { size_t jnldata_len, read_size, avail_data; gtm_uint64_t jnlpool_size; uint4 first_tr_len, num_tr_read, orig_first_tr_len, orig_tr_len, tr_len; int64_t read, wrap_size; /* This can be negative. Must handle a signed 4G value */ uchar_ptr_t buf_top, tr_p; jnlpool_ctl_ptr_t jctl; gtmsource_local_ptr_t gtmsource_local; sm_uc_ptr_t jnldata_base; jnldata_hdr_ptr_t jnl_header; qw_num read_addr, avail_data_qw; seq_num read_jnl_seqno, jnl_seqno, next_read_seqno, next_histinfo_seqno; jnl_record *jnlrec; boolean_t trim_this_seqno; uchar_ptr_t trim_buff; jctl = jnlpool->jnlpool_ctl; jnlpool_size = jctl->jnlpool_size; DEBUG_ONLY(jnl_seqno = jctl->jnl_seqno;) /* jnl_seqno is used in an assert below. jnl_seqno is a local variable for * debugging purposes since shared memory can change from the time the assert * fails to the time the core gets created */ jnldata_base = jnlpool->jnldata_base; gtmsource_local = jnlpool->gtmsource_local; do { read = gtmsource_local->read; read_addr = gtmsource_local->read_addr; assert(stop_read_at > read_addr); /* there should be data to be read, if not how did we end up here? */ read_jnl_seqno = gtmsource_local->read_jnl_seqno; assert(read_jnl_seqno <= gtmsource_local->next_histinfo_seqno); if (read_jnl_seqno == gtmsource_local->next_histinfo_seqno) { /* Request a REPL_HISTREC message be sent first before sending any more seqnos across */ gtmsource_state = gtmsource_local->gtmsource_state = GTMSOURCE_SEND_NEW_HISTINFO; return 0; } next_histinfo_seqno = gtmsource_local->next_histinfo_seqno; next_read_seqno = read_jnl_seqno; if (!jnlpool_hasnt_overflowed(jctl, jnlpool_size, read_addr)) break; /* overflow happened, or about to happen */ /* No overflow yet. Before we read the content (including the jnldata_len read below), we have to ensure * we read up-to-date content. We rely on the memory barrier done in jnlpool_hasnt_overflowed for this. */ assert(read + SIZEOF(jnldata_hdr_struct) <= jnlpool_size); jnl_header = (jnldata_hdr_ptr_t)(jnldata_base + read); first_tr_len = jnldata_len = jnl_header->jnldata_len; if (read_multiple) { assert(stop_read_at >= read_addr); avail_data_qw = stop_read_at - read_addr; /* To catch the case of change in type of maxbufflen */ assert((0 <= maxbufflen) && (maxbufflen <= MAXPOSINT4)); avail_data = (uint4)MIN(avail_data_qw, (qw_num)maxbufflen); assert(next_read_seqno < next_histinfo_seqno); read_multiple = (first_tr_len < avail_data) && ((next_read_seqno + 1) < next_histinfo_seqno); if (read_multiple) jnldata_len = avail_data; } if (SIZEOF(jnldata_hdr_struct) < jnldata_len && jnldata_len <= jnlpool_size) { read_size = jnldata_len - SIZEOF(jnldata_hdr_struct); if (0 < read_size && read_size <= maxbufflen) { if (0 < (wrap_size = ((int64_t)read - (jnlpool_size - jnldata_len)))) read_size -= wrap_size; memcpy(buff, (sm_uc_ptr_t)jnl_header + SIZEOF(jnldata_hdr_struct), read_size); if (0 < wrap_size) memcpy(buff + read_size, jnldata_base, wrap_size); jnlrec = (jnl_record *)buff; /* Now that we have read the content, we have to ensure that we haven't read content * that may have been overwritten. We rely on the memory barrier done in * "jnlpool_hasnt_overflowed" for this. In addition, check for JRT_BAD (this is indication * of a ERR_JNLPOOLRECOVERY situation) and if so switch to READ_FILE. */ if ((jnlpool_hasnt_overflowed(jctl, jnlpool_size, read_addr)) && (JRT_BAD != jnlrec->prefix.jrec_type)) { /* No overflow. Only now are we guaranteed a good value of "first_tr_len". */ /* Check if this seqno was processed by "repl_phase2_salvage". In that case, it * would contain just one NULL record so copy just that and ignore the rest of * the reserved space (if any). Note that if the rest of the reserved space is * 0 bytes long, then we don't need any special processing. */ first_tr_len -= SIZEOF(jnldata_hdr_struct); assert(0 == (first_tr_len % JNL_WRT_END_MODULUS)); assert(first_tr_len >= NULL_RECLEN); orig_first_tr_len = first_tr_len; trim_buff = NULL; if ((JRT_NULL == jnlrec->prefix.jrec_type) && (NULL_RECLEN != first_tr_len)) { first_tr_len = NULL_RECLEN; trim_buff = buff + NULL_RECLEN; } # ifdef REPL_DEBUG assert(repl_tr_good(buff, first_tr_len, read_jnl_seqno)); num_tr_read = 1; # endif next_read_seqno++; assert(next_read_seqno <= next_histinfo_seqno); if (read_multiple) { /* Although stop_read_at - read_addr contains no partial transaction, it * is possible that stop_read_at - read_addr is more than maxbufflen, and * hence we read fewer bytes than stop_read_at - read_addr; scan what we * read to figure out if the tail is an incomplete transaction. */ assert((orig_first_tr_len + SIZEOF(jnldata_hdr_struct)) < jnldata_len); /* above must hold if multiple transactions were read */ tr_p = buff + orig_first_tr_len; buf_top = buff + jnldata_len - SIZEOF(jnldata_hdr_struct); while (SIZEOF(jnldata_hdr_struct) < (buf_top - tr_p)) { /* more than hdr available */ orig_tr_len = tr_len = ((jnldata_hdr_ptr_t)tr_p)->jnldata_len; assert(0 == (tr_len % JNL_WRT_END_MODULUS)); assert(0 < tr_len); assert(tr_len <= jnlpool_size); if (tr_len <= (buf_top - tr_p)) /* transaction completely read */ { jnlrec = (jnl_record *)(tr_p + SIZEOF(jnldata_hdr_struct)); if (JRT_BAD == jnlrec->prefix.jrec_type) { /* This is indication of a ERR_JNLPOOLRECOVERY situation * and so we need to switch to READ_FILE for this seqno. * Do that by stopping the READ_POOL until the seqno before * this one. So break out of loop that reads more seqnos. */ break; } if ((JRT_NULL == jnlrec->prefix.jrec_type) && ((NULL_RECLEN + SIZEOF(jnldata_hdr_struct)) != tr_len)) { trim_this_seqno = TRUE; tr_len = NULL_RECLEN + REPL_MSG_HDRLEN; } else trim_this_seqno = FALSE; /* The message type and len assignments are a violation of * layering; ideally, this should be done in * gtmsource_process(), but we choose to do it here for * performance reasons. If we have to do it in * gtmsource_process(), we have to scan the buffer again. */ ((repl_msg_ptr_t)tr_p)->type = REPL_TR_JNL_RECS; ((repl_msg_ptr_t)tr_p)->len = tr_len; # ifdef REPL_DEBUG assert(repl_tr_good(tr_p + REPL_MSG_HDRLEN, tr_len - REPL_MSG_HDRLEN, read_jnl_seqno + num_tr_read)); num_tr_read++; # endif if (NULL != trim_buff) { memmove(trim_buff, tr_p, tr_len); trim_buff += tr_len; } else if (trim_this_seqno) trim_buff = tr_p + tr_len; next_read_seqno++; tr_p += orig_tr_len; if (next_read_seqno >= next_histinfo_seqno) { /* Don't read more than boundary of next histinfo */ assert(next_read_seqno == next_histinfo_seqno); break; } } else { REPL_DPRINT5("Partial transaction read since jnldata_len" " %llu larger than maxbufflen %d, tr_len %d, " "remaining buffer %d\n", avail_data_qw, maxbufflen, tr_len, buf_top - tr_p); break; } } # ifdef REPL_DEBUG if (0 != (buf_top - tr_p)) { REPL_DPRINT4("Partial tr header read since jnldata_len " "%llu larger than maxbufflen %d, incomplete header" " length %d\n", avail_data_qw, maxbufflen, buf_top - tr_p); } # endif jnldata_len = (uint4)((tr_p - buff) + SIZEOF(jnldata_hdr_struct)); assert(0 == (jnldata_len % JNL_WRT_END_MODULUS)); wrap_size = ((int64_t)read - (jnlpool_size - jnldata_len)); } REPL_DPRINT4("Pool read seqno : "INT8_FMT" Num Tr read : %d Total Tr len : %d\n", INT8_PRINT(read_jnl_seqno), num_tr_read, jnldata_len); REPL_DPRINT4("Read %u : Next read : %ld : %s\n", read, (0 > wrap_size) ? read + jnldata_len : wrap_size, (0 > wrap_size) ? "" : " READ WRAPPED"); assert(next_read_seqno <= next_histinfo_seqno); /* Before sending the seqnos, check if a new histinfo got concurrently written */ assert(gtmsource_local->next_histinfo_num <= gtmsource_local->num_histinfo); if ((gtmsource_local->next_histinfo_num == gtmsource_local->num_histinfo) && (gtmsource_local->num_histinfo != jnlpool->repl_inst_filehdr->num_histinfo)) { /* We are sending seqnos of the last histinfo (that is open-ended) and * there has been at least one histinfo concurrently added to this instance * file compared to what is in our private memory. Set the next histinfo's * start_seqno and redo the read with the new "next_histinfo_seqno". */ assert(MAX_SEQNO == gtmsource_local->next_histinfo_seqno); gtmsource_set_next_histinfo_seqno(TRUE); /* Set the next histinfo's start_seqno and redo the read */ if (GTMSOURCE_WAITING_FOR_CONNECTION == gtmsource_state) { /* Connection reset in "gtmsource_set_next_histinfo_seqno" */ return 0; } continue; } read = ((0 > wrap_size) ? read + jnldata_len : wrap_size); read_addr += jnldata_len; read_jnl_seqno = next_read_seqno; assert(read_jnl_seqno <= gtmsource_local->next_histinfo_seqno); assert(stop_read_at >= read_addr); assert(jnl_seqno >= read_jnl_seqno - 1); /* In the rare case when we read the transaction read_jnl_seqno just as * it becomes available and before the GTM process that wrote it updates * jctl->jnl_seqno in t_end/tp_tend, we may return from this function * with read_jnl_seqno one more than jctl->jnl_seqno. This is such a rare * case that we don't want to add a wait loop for jctl->jnl_seqno to become * equal to read_jnl_seqno. We expect that by the time we send the just read * transaction(s) using socket I/O, jctl->jnl_seqno would have been updated. * In any case, we prevent ourselves from misinterpreting this condition when * read_jnl_seqno is compared against jctl->jnl_seqno in gtmsource_process(), * gtmsource_get_jnlrecs() and gtmsource_showbacklog(). */ assert(read == read_addr % jnlpool_size); gtmsource_local->read = read; gtmsource_local->read_addr = read_addr; gtmsource_local->read_jnl_seqno = read_jnl_seqno; *data_len = first_tr_len; if (NULL != trim_buff) jnldata_len = (uint4)((trim_buff - buff) + SIZEOF(jnldata_hdr_struct)); return (jnldata_len); } } else if (0 < read_size && jnlpool_hasnt_overflowed(jctl, jnlpool_size, read_addr)) { /* Buffer cannot accommodate data */ *data_len = read_size; return (-1); } /* else * We read a corrupt (overwritten) large value, or read_size == 0, both of which imply overflow. * read_size == 0 => overflow because every transaction generates non-zero bytes of jnl data */ } /* else * We read a corrupt (overwritten) large value, or read 0, both of which imply overflow. * jnldata_len == 0 => overflow because every transaction generates non-zero bytes of jnl data */ break; } while (TRUE); *data_len = -1; return (-1); /* Error indication */ } |