Home | History | Annotate | Download | only in iomgr
      1 /*
      2  *
      3  * Copyright 2016 gRPC authors.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  */
     18 
     19 #include <grpc/support/port_platform.h>
     20 
     21 #include <grpc/support/alloc.h>
     22 #include <grpc/support/log.h>
     23 
     24 #include "src/core/lib/iomgr/polling_entity.h"
     25 
     26 grpc_polling_entity grpc_polling_entity_create_from_pollset_set(
     27     grpc_pollset_set* pollset_set) {
     28   grpc_polling_entity pollent;
     29   pollent.pollent.pollset_set = pollset_set;
     30   pollent.tag = GRPC_POLLS_POLLSET_SET;
     31   return pollent;
     32 }
     33 
     34 grpc_polling_entity grpc_polling_entity_create_from_pollset(
     35     grpc_pollset* pollset) {
     36   grpc_polling_entity pollent;
     37   pollent.pollent.pollset = pollset;
     38   pollent.tag = GRPC_POLLS_POLLSET;
     39   return pollent;
     40 }
     41 
     42 grpc_pollset* grpc_polling_entity_pollset(grpc_polling_entity* pollent) {
     43   if (pollent->tag == GRPC_POLLS_POLLSET) {
     44     return pollent->pollent.pollset;
     45   }
     46   return nullptr;
     47 }
     48 
     49 grpc_pollset_set* grpc_polling_entity_pollset_set(
     50     grpc_polling_entity* pollent) {
     51   if (pollent->tag == GRPC_POLLS_POLLSET_SET) {
     52     return pollent->pollent.pollset_set;
     53   }
     54   return nullptr;
     55 }
     56 
     57 bool grpc_polling_entity_is_empty(const grpc_polling_entity* pollent) {
     58   return pollent->tag == GRPC_POLLS_NONE;
     59 }
     60 
     61 void grpc_polling_entity_add_to_pollset_set(grpc_polling_entity* pollent,
     62                                             grpc_pollset_set* pss_dst) {
     63   if (pollent->tag == GRPC_POLLS_POLLSET) {
     64     // CFStream does not use file destriptors. When CFStream is used, the fd
     65     // pollset is possible to be null.
     66     if (pollent->pollent.pollset != nullptr) {
     67       grpc_pollset_set_add_pollset(pss_dst, pollent->pollent.pollset);
     68     }
     69   } else if (pollent->tag == GRPC_POLLS_POLLSET_SET) {
     70     GPR_ASSERT(pollent->pollent.pollset_set != nullptr);
     71     grpc_pollset_set_add_pollset_set(pss_dst, pollent->pollent.pollset_set);
     72   } else {
     73     gpr_log(GPR_ERROR, "Invalid grpc_polling_entity tag '%d'", pollent->tag);
     74     abort();
     75   }
     76 }
     77 
     78 void grpc_polling_entity_del_from_pollset_set(grpc_polling_entity* pollent,
     79                                               grpc_pollset_set* pss_dst) {
     80   if (pollent->tag == GRPC_POLLS_POLLSET) {
     81 #ifdef GRPC_CFSTREAM
     82     if (pollent->pollent.pollset != nullptr) {
     83       grpc_pollset_set_del_pollset(pss_dst, pollent->pollent.pollset);
     84     }
     85 #else
     86     GPR_ASSERT(pollent->pollent.pollset != nullptr);
     87     grpc_pollset_set_del_pollset(pss_dst, pollent->pollent.pollset);
     88 #endif
     89   } else if (pollent->tag == GRPC_POLLS_POLLSET_SET) {
     90     GPR_ASSERT(pollent->pollent.pollset_set != nullptr);
     91     grpc_pollset_set_del_pollset_set(pss_dst, pollent->pollent.pollset_set);
     92   } else {
     93     gpr_log(GPR_ERROR, "Invalid grpc_polling_entity tag '%d'", pollent->tag);
     94     abort();
     95   }
     96 }
     97