29 extern int __fdman_sema;
32 #ifdef F___descriptor_data_pool
38 #ifdef F___descriptormap
54 __fdman_sema = CreateSema(&sema);
55 if (__fdman_sema <= 0) {
66 __descriptormap[STDIN_FILENO] = &__descriptor_data_pool[STDIN_FILENO];
67 __libcglue_init_stdio(&(__descriptormap[STDIN_FILENO]->
info), 0);
69 __descriptormap[STDOUT_FILENO] = &__descriptor_data_pool[STDOUT_FILENO];
70 __libcglue_init_stdio(&(__descriptormap[STDOUT_FILENO]->
info), 1);
72 __descriptormap[STDERR_FILENO] = &__descriptor_data_pool[STDERR_FILENO];
73 __libcglue_init_stdio(&(__descriptormap[STDERR_FILENO]->
info), 1 );
77 #ifdef F___fdman_deinit
80 if (__fdman_sema > 0) {
81 DeleteSema(__fdman_sema);
87 #ifdef F___fdman_get_new_descriptor
88 int __fdman_get_new_descriptor()
92 WaitSema(__fdman_sema);
93 for (i = 0; i < __FILENO_MAX; i++) {
94 if (__descriptormap[i] == NULL) {
95 __descriptormap[i] = &__descriptor_data_pool[i];
96 __descriptormap[i]->ref_count++;
97 SignalSema(__fdman_sema);
101 SignalSema(__fdman_sema);
109 #ifdef F___fdman_get_dup_descriptor
110 int __fdman_get_dup_descriptor(
int fd)
114 if (!__IS_FD_VALID(fd)) {
119 WaitSema(__fdman_sema);
120 for (i = 0; i < __FILENO_MAX; i++) {
121 if (__descriptormap[i] == NULL) {
122 __descriptormap[i] = &__descriptor_data_pool[fd];
123 __descriptormap[i]->ref_count++;
124 SignalSema(__fdman_sema);
128 SignalSema(__fdman_sema);
135 #ifdef F___fdman_get_dup_descriptor
136 int __fdman_get_dup2_descriptor(
int fd,
int newfd)
138 if (!__IS_FD_VALID(fd)) {
143 WaitSema(__fdman_sema);
144 __descriptormap[newfd] = &__descriptor_data_pool[fd];
145 __descriptormap[newfd]->ref_count++;
146 SignalSema(__fdman_sema);
152 #ifdef F___fdman_release_descriptor
153 void __fdman_release_descriptor(
int fd)
155 if (!__IS_FD_VALID(fd)) {
160 __descriptormap[fd]->ref_count--;
162 if (__descriptormap[fd]->ref_count == 0) {
165 __descriptormap[fd] = NULL;