41 __fdman_sema = CreateSema(&sema);
42 if (__fdman_sema <= 0) {
53 __descriptormap[STDIN_FILENO] = &__descriptor_data_pool[STDIN_FILENO];
54 __libcglue_init_stdio(&(__descriptormap[STDIN_FILENO]->info), 0);
56 __descriptormap[STDOUT_FILENO] = &__descriptor_data_pool[STDOUT_FILENO];
57 __libcglue_init_stdio(&(__descriptormap[STDOUT_FILENO]->info), 1);
59 __descriptormap[STDERR_FILENO] = &__descriptor_data_pool[STDERR_FILENO];
60 __libcglue_init_stdio(&(__descriptormap[STDERR_FILENO]->info), 1 );
65 if (__fdman_sema > 0) {
66 DeleteSema(__fdman_sema);
71int __fdman_get_new_descriptor()
75 WaitSema(__fdman_sema);
76 for (i = 0; i < __FILENO_MAX; i++) {
77 if (__descriptormap[i] == NULL) {
78 __descriptormap[i] = &__descriptor_data_pool[i];
79 __descriptormap[i]->ref_count++;
80 SignalSema(__fdman_sema);
84 SignalSema(__fdman_sema);
91int __fdman_get_dup_descriptor(
int fd)
95 if (!__IS_FD_VALID(fd)) {
100 WaitSema(__fdman_sema);
101 for (i = 0; i < __FILENO_MAX; i++) {
102 if (__descriptormap[i] == NULL) {
103 __descriptormap[i] = &__descriptor_data_pool[fd];
104 __descriptormap[i]->ref_count++;
105 SignalSema(__fdman_sema);
109 SignalSema(__fdman_sema);
115int __fdman_get_dup2_descriptor(
int fd,
int newfd)
117 if (!__IS_FD_VALID(fd)) {
122 WaitSema(__fdman_sema);
123 __descriptormap[newfd] = &__descriptor_data_pool[fd];
124 __descriptormap[newfd]->ref_count++;
125 SignalSema(__fdman_sema);
130void __fdman_release_descriptor(
int fd)
132 if (!__IS_FD_VALID(fd)) {
137 __descriptormap[fd]->ref_count--;
139 if (__descriptormap[fd]->ref_count == 0) {
142 __descriptormap[fd] = NULL;