source: trunk/kernel/syscalls/sys_close.c @ 640

Last change on this file since 640 was 625, checked in by alain, 6 years ago

Fix a bug in the vmm_remove_vseg() function: the physical pages
associated to an user DATA vseg were released to the kernel when
the target process descriptor was in the reference cluster.
This physical pages release should be done only when the page
forks counter value is zero.
All other modifications are cosmetic.

File size: 3.2 KB
Line 
1/*
2 * sys_close.c  close an open file
3 *
4 * Author    Alain Greiner (2016,2017)
5 *
6 * Copyright (c) UPMC Sorbonne Universites
7 *
8 * This file is part of ALMOS-MKH.
9 *
10 * ALMOS-MKH is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2.0 of the License.
13 *
14 * ALMOS-MKH is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#include <kernel_config.h>
25#include <hal_kernel_types.h>
26#include <hal_special.h>
27#include <vfs.h>
28#include <process.h>
29#include <thread.h>
30#include <printk.h>
31
32#include <syscalls.h>
33
34//////////////////////////////////
35int sys_close ( uint32_t file_id )
36{
37    error_t            error;
38    xptr_t             file_xp;
39    cxy_t              file_cxy;
40    vfs_file_t       * file_ptr;
41    vfs_inode_type_t   file_type;
42
43        thread_t  * this    = CURRENT_THREAD;
44        process_t * process = this->process;
45
46#if (DEBUG_SYS_CLOSE || CONFIG_INSTRUMENTATION_SYSCALLS)
47uint64_t     tm_start = hal_get_cycles();
48#endif
49
50#if DEBUG_SYS_CLOSE
51if( DEBUG_SYS_CLOSE < tm_start )
52printk("\n[%s] thread[%x,%x] enter / fdid %d / cycle %d\n",
53__FUNCTION__, process->pid, this->trdid, file_id, (uint32_t)tm_start );
54#endif
55 
56    // check file_id argument
57        if( file_id >= CONFIG_PROCESS_FILE_MAX_NR )
58        {
59
60#if DEBUG_SYSCALLS_ERROR
61printk("\n[ERROR] in %s : illegal file descriptor index = %d\n",
62__FUNCTION__ , file_id );
63#endif
64                this->errno = EBADFD;
65                return -1;
66        }
67
68    // get extended pointer on remote file descriptor
69    file_xp = process_fd_get_xptr( process , file_id );
70
71    if( file_xp == XPTR_NULL )
72    {
73
74#if DEBUG_SYSCALLS_ERROR
75printk("\n[ERROR] in %s : undefined file descriptor %d\n",
76__FUNCTION__ , file_id );
77#endif
78        this->errno = EBADFD;
79                return -1;
80    }
81
82    // get file type
83    file_cxy  = GET_CXY( file_xp );
84    file_ptr  = GET_PTR( file_xp );
85    file_type = hal_remote_l32( XPTR( file_cxy , &file_ptr->type ) );
86
87    if( file_type == INODE_TYPE_DIR ) 
88        {
89
90#if DEBUG_SYSCALLS_ERROR
91printk("\n[ERROR] in %s : file descriptor %d is a directory\n",
92__FUNCTION__ , file_id );
93#endif
94                this->errno = EBADFD;
95                return -1;
96        }
97
98    // call the relevant VFS function
99        error = vfs_close( file_xp , file_id );
100
101        if( error )
102        {
103
104#if DEBUG_SYSCALLS_ERROR
105printk("\n[ERROR] in %s : cannot close file descriptor %d\n",
106__FUNCTION__ , file_id );
107#endif
108                this->errno = error;
109                return -1;
110        }
111
112        hal_fence();
113
114#if (DEBUG_SYS_CLOSE || CONFIG_INSTRUMENTATION_SYSCALLS)
115uint64_t     tm_end = hal_get_cycles();
116#endif
117
118#if DEBUG_SYS_CLOSE
119tm_end = hal_get_cycles();
120if( DEBUG_SYS_CLOSE < tm_start )
121printk("\n[%s] thread[%x,%x] exit / cycle %d\n",
122__FUNCTION__, process->pid, this->trdid, (uint32_t)tm_end );
123#endif
124 
125#if CONFIG_INSTRUMENTATION_SYSCALLS
126hal_atomic_add( &syscalls_cumul_cost[SYS_CLOSE] , tm_end - tm_start );
127hal_atomic_add( &syscalls_occurences[SYS_CLOSE] , 1 );
128#endif
129
130        return 0;
131}
Note: See TracBrowser for help on using the repository browser.