retab
[aros:aros.git] / AROS / rom / exec / closelibrary.c
1 /*
2     Copyright © 1995-2007, The AROS Development Team. All rights reserved.
3     $Id$
4
5     Desc: Close a library.
6     Lang: english
7 */
8 #include <aros/config.h>
9 #include <exec/execbase.h>
10 #include <dos/dos.h>
11 #include <aros/libcall.h>
12 #include <proto/exec.h>
13
14 #include "exec_debug.h"
15 #ifndef DEBUG_CloseLibrary
16 #   define DEBUG_CloseLibrary 0
17 #endif
18 #undef DEBUG
19 #if DEBUG_CloseLibrary
20 #   define DEBUG 1
21 #endif
22 #include <aros/debug.h>
23 #undef kprintf
24
25 /*****************************************************************************
26
27     NAME */
28
29         AROS_LH1(void, CloseLibrary,
30
31 /*  SYNOPSIS */
32         AROS_LHA(struct Library *, library, A1),
33
34 /*  LOCATION */
35         struct ExecBase *, SysBase, 69, Exec)
36
37 /*  FUNCTION
38         Closes a previously opened library. It is legal to call this function
39         with a NULL pointer.
40
41     INPUTS
42         library - Pointer to library structure or NULL.
43
44     RESULT
45
46     NOTES
47
48     EXAMPLE
49
50     BUGS
51
52     SEE ALSO
53         OpenLibrary()
54
55     INTERNALS
56
57 ******************************************************************************/
58 {
59     AROS_LIBFUNC_INIT
60     BPTR seglist;
61
62     D(bug("CloseLibrary $%lx (\"%s\") by \"%s\"\n", library,
63         library ? library->lib_Node.ln_Name : "(null)",
64         THISCPU->ThisTask->tc_Node.ln_Name));
65
66     /* Something to do? */
67     if(library!=NULL)
68     {
69         ASSERT_VALID_PTR(library);
70
71         /* Single-thread the close routine. */
72         Forbid();
73
74         /* Do the close */
75         seglist = AROS_LVO_CALL0(BPTR,struct Library *,library,2,);
76         /*
77             Normally you'd expect the library to be expunged if this returns
78             non-zero, but this is only exec which doesn't know anything about
79             seglists - therefore dos.library has to SetFunction() into this
80             vector for the additional functionality.
81         */
82
83         /* All done. */
84         Permit();
85     }
86     else
87     {
88         /* Local vars not guaranteed to be initialised to 0. I initialise
89            it here to save an assignment in case the close went ok (common
90            path optimization). */
91         seglist = 0;
92     }
93
94     AROS_COMPAT_SETD0(seglist);
95     AROS_LIBFUNC_EXIT
96 } /* CloseLibrary */
97