File: ojchildioclean.c

package info (click to toggle)
fis-gtm 7.1-006-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 32,908 kB
  • sloc: ansic: 344,906; asm: 5,184; csh: 4,859; sh: 2,000; awk: 294; makefile: 73; sed: 13
file content (79 lines) | stat: -rw-r--r-- 2,940 bytes parent folder | download | duplicates (5)
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
/****************************************************************
 *								*
 * Copyright (c) 2009-2017 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.	*
 *								*
 ****************************************************************/

 /*
 * -------------------------------------------------------
 * This routine cleans up the child process prior to the exec
 * -------------------------------------------------------
 */
#include "mdef.h"

#include "gtm_fcntl.h"
#include "gdsroot.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "dpgbldir.h"
#include "jnl.h"
#include "jobsp.h"
#include "gtmio.h"
#include "gtmcrypt.h"
#include <rtnhdr.h>
#include "relinkctl.h"

GBLREF	int			mutex_sock_fd;

void ojchildioclean(void)
{
	int			rc;
	unix_db_info		*udi;
	sgmnt_addrs		*csa;
	sgmnt_data_ptr_t	csd;
	gd_region		*r_top, *r_local;
	gd_addr			*addr_ptr;
	open_relinkctl_sgm 	*linkctl;
	DCL_THREADGBL_ACCESS;

	SETUP_THREADGBL_ACCESS;
	/* Close any encryption related fds that the plug-in might have opened */
	GTMCRYPT_CLOSE;
	/* Run through the list of databases to simply close them out (still open by parent) */
	for (addr_ptr = get_next_gdr(NULL); addr_ptr; addr_ptr = get_next_gdr(addr_ptr))
	{
		for (r_local = addr_ptr->regions, r_top = r_local + addr_ptr->n_regions; r_local < r_top; r_local++)
		{
			if (r_local->open && !r_local->was_open && IS_REG_BG_OR_MM(r_local))
			{
				udi = (unix_db_info *)(r_local->dyn.addr->file_cntl->file_info);
				csa = &udi->s_addrs;
				csd = csa->hdr;
				/* Close journal file if open. Check for JNL_ALLOWED instead of JNL_ENABLED to ensure
				 * we do not miss out on closing open journal file descriptors in the case where the
				 * current jnl_state is "jnl_closed" but we had opened the file when it was "jnl_open".
				 */
				if (JNL_ALLOWED(csd) && (NULL != csa->jnl) && (NOJNL != csa->jnl->channel))
					CLOSEFILE_RESET(csa->jnl->channel, rc);	/* resets "channel" to FD_INVALID */
				CLOSEFILE_RESET(udi->fd, rc);	/* resets "udi->fd" to FD_INVALID */
			}
		}
	}
#ifndef MUTEX_MSEM_WAKE
	/* We don't need the parent's mutex socket anymore either (if we are using the socket) */
	if (FD_INVALID != mutex_sock_fd)
		CLOSEFILE_RESET(mutex_sock_fd, rc);	/* resets "mutex_sock_fd" to FD_INVALID */
#endif
	/* Since we are removing artifacts from the originating process (which still has these files open), there is
	 * no need to decrement the counts (they will increase if this process links the same files). The FALSE
	 * argument prevents the relinkctl-attach & rtnobj-reference counts from being modified in this cleanup.
	 */
	ARLINK_ONLY(relinkctl_rundown(FALSE, FALSE));
}