File: iof_base_close.c

package info (click to toggle)
openmpi 1.6.5-9.1%2Bdeb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 91,628 kB
  • ctags: 44,305
  • sloc: ansic: 408,966; cpp: 44,454; sh: 27,828; makefile: 10,486; asm: 3,882; python: 1,239; lex: 805; perl: 549; csh: 253; fortran: 232; f90: 126; tcl: 12
file content (99 lines) | stat: -rw-r--r-- 3,614 bytes parent folder | download | duplicates (2)
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
/*
 * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
 *                         University Research and Technology
 *                         Corporation.  All rights reserved.
 * Copyright (c) 2004-2005 The University of Tennessee and The University
 *                         of Tennessee Research Foundation.  All rights
 *                         reserved.
 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 
 *                         University of Stuttgart.  All rights reserved.
 * Copyright (c) 2004-2005 The Regents of the University of California.
 *                         All rights reserved.
 * Copyright (c) 2013 Cisco Systems, Inc.  All rights reserved.
 * $COPYRIGHT$
 * 
 * Additional copyrights may follow
 * 
 * $HEADER$
 */

#include "orte_config.h"
#include "orte/constants.h"

#include <stdio.h>

#include "opal/event/event.h"
#include "opal/mca/mca.h"
#include "opal/mca/base/base.h"

#include "orte/util/proc_info.h"

#include "orte/mca/iof/iof.h"
#include "orte/mca/iof/base/base.h"


int orte_iof_base_close(void)
{
    bool dump;
    opal_list_item_t *item;
    orte_iof_write_output_t *output;
    orte_iof_write_event_t *wev;
    int num_written;
    
    /* shutdown any remaining opened components */
    if (0 != opal_list_get_size(&orte_iof_base.iof_components_opened)) {
        mca_base_components_close(orte_iof_base.iof_output, 
                                  &orte_iof_base.iof_components_opened, 
                                  NULL, true);
    }
    OBJ_DESTRUCT(&orte_iof_base.iof_components_opened);

    OPAL_THREAD_LOCK(&orte_iof_base.iof_write_output_lock);
    if (!ORTE_PROC_IS_DAEMON) {
        /* check if anything is still trying to be written out */
        wev = orte_iof_base.iof_write_stdout->wev;
        if (!opal_list_is_empty(&wev->outputs)) {
            dump = false;
            /* make one last attempt to write this out */
            while (NULL != (item = opal_list_remove_first(&wev->outputs))) {
                output = (orte_iof_write_output_t*)item;
                if (!dump) {
                    num_written = write(wev->fd, output->data, output->numbytes);
                    if (num_written < output->numbytes) {
                        /* don't retry - just cleanout the list and dump it */
                        dump = true;
                    }
                }
                OBJ_RELEASE(output);
            }
        }
        OBJ_RELEASE(orte_iof_base.iof_write_stdout);
        if (!orte_xml_output) {
            /* we only opened stderr channel if we are NOT doing xml output */
            wev = orte_iof_base.iof_write_stderr->wev;
            if (!opal_list_is_empty(&wev->outputs)) {
                dump = false;
                /* make one last attempt to write this out */
                while (NULL != (item = opal_list_remove_first(&wev->outputs))) {
                    output = (orte_iof_write_output_t*)item;
                    if (!dump) {
                        num_written = write(wev->fd, output->data, output->numbytes);
                        if (num_written < output->numbytes) {
                            /* don't retry - just cleanout the list and dump it */
                            dump = true;
                        }
                    }
                    OBJ_RELEASE(output);
                }
            }
            OBJ_RELEASE(orte_iof_base.iof_write_stderr);
        }
    }
    OPAL_THREAD_UNLOCK(&orte_iof_base.iof_write_output_lock);

    OBJ_DESTRUCT(&orte_iof_base.iof_write_output_lock);


    return ORTE_SUCCESS;
}