1 #include <aros/asmcall.h>
2 #include <aros/symbolsets.h>
3 #include <proto/exec.h>
5 #include "bsdsocket_intern.h"
6 #include "bsdsocket_util.h"
8 extern APTR BSDSocket_FuncTable
[];
10 static AROS_UFH2(LONG
, TaskKeyCompare
,
11 AROS_UFHA(const struct AVLNode
*, td
, A0
),
12 AROS_UFHA(AVLKey
, key
, A1
))
16 AVLKey id
= ((struct TaskNode
*)td
)->task
;
28 static AROS_UFH2(LONG
, TaskNodeCompare
,
29 AROS_UFHA(const struct AVLNode
*, td1
, A0
),
30 AROS_UFHA(const struct AVLNode
*, td2
, A1
))
34 IPTR t1
= (IPTR
)((struct TaskNode
*)td1
)->task
;
35 IPTR t2
= (IPTR
)((struct TaskNode
*)td2
)->task
;
47 AROS_LH1(struct TaskBase
*, BSDSocket_OpenLib
,
48 AROS_LHA (ULONG
, version
, D0
),
49 struct bsdsocketBase
*, SocketBase
, 1, BSDSocket
)
54 struct Task
*task
= FindTask(NULL
);
55 struct TaskNode
*tn
= (struct TaskNode
*)AVL_FindNode(SocketBase
->tasks
, task
, TaskKeyCompare
);
57 D(bug("[OpenLib] Task 0x%p\n", task
));
60 D(bug("[OpenLib] Found TaskBase 0x%p\n", tb
));
62 APTR pool
= CreatePool(MEMF_ANY
, 2048, 1024);
64 D(bug("[OpenLib] Created pool 0x%p\n", pool
));
68 tb
= (struct TaskBase
*)MakeLibrary(BSDSocket_FuncTable
, NULL
, NULL
, sizeof(struct TaskBase
), NULL
);
69 D(bug("[OpenLib] Created TaskBase 0x%p\n", tb
));
76 tb
->lib
.lib_Node
.ln_Name
= SocketBase
->lib
.lib_Node
.ln_Name
;
77 tb
->lib
.lib_Node
.ln_Type
= NT_LIBRARY
;
78 tb
->lib
.lib_Node
.ln_Pri
= SocketBase
->lib
.lib_Node
.ln_Pri
;
79 tb
->lib
.lib_Flags
= LIBF_CHANGED
;
80 tb
->lib
.lib_Version
= SocketBase
->lib
.lib_Version
;
81 tb
->lib
.lib_Revision
= SocketBase
->lib
.lib_Revision
;
82 tb
->lib
.lib_IdString
= SocketBase
->lib
.lib_IdString
;
88 tb
->glob
= SocketBase
;
90 tb
->errnoPtr
= &tb
->errnoVal
;
91 tb
->errnoSize
= sizeof(tb
->errnoVal
);
92 tb
->sigintr
= SIGBREAKF_CTRL_C
;
94 SetDTableSize(FD_SETSIZE
, tb
);
96 AVL_AddNode(&SocketBase
->tasks
, &tb
->n
.node
, TaskNodeCompare
);
101 tb
->lib
.lib_OpenCnt
++;
102 SocketBase
->lib
.lib_OpenCnt
++;
103 D(bug("[socket] Task open count %u, global open count %u\n", tb
->lib
.lib_OpenCnt
, SocketBase
->lib
.lib_OpenCnt
));
111 AROS_LH0(BPTR
, BSDSocket_CloseLib
,
112 struct TaskBase
*, tb
, 2, BSDSocket
)
116 struct bsdsocketBase
*SocketBase
= tb
->glob
;
118 D(bug("[CloseLib] TaskBase 0x%p\n", tb
));
120 tb
->lib
.lib_OpenCnt
--;
121 SocketBase
->lib
.lib_OpenCnt
--;
122 D(bug("[CloseLib] Task open count %u, global open count %u\n", tb
->lib
.lib_OpenCnt
, SocketBase
->lib
.lib_OpenCnt
));
124 if (!tb
->lib
.lib_OpenCnt
)
129 D(bug("[CloseLib] dTableSize is %u\n", tb
->dTableSize
));
130 for (i
= 0; i
< tb
->dTableSize
; i
++)
131 IntCloseSocket(i
, tb
);
133 AVL_RemNodeByAddress(&SocketBase
->tasks
, &tb
->n
.node
);
135 DeletePool(tb
->pool
);
137 addr
= (APTR
)tb
- tb
->lib
.lib_NegSize
;
138 FreeMem(addr
, tb
->lib
.lib_NegSize
+ tb
->lib
.lib_PosSize
);
141 if (SocketBase
->lib
.lib_OpenCnt
)
144 if (SocketBase
->lib
.lib_Flags
& LIBF_DELEXP
)
145 return AROS_LC1(BPTR
, BSDSocket_ExpungeLib
,
146 AROS_LCA(struct bsdsocketBase
*, SocketBase
, D0
),
147 struct bsdsocketBase
*, SocketBase
, 3, BSDSocket
);