From d7d663c97167086258dd2e85f6754d966045168a Mon Sep 17 00:00:00 2001 From: cmz <3256005191@qq.com> Date: Mon, 23 Dec 2024 20:04:26 +0800 Subject: [PATCH] 11 --- src/kernel/mpoller - 改.c | 122 +++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 src/kernel/mpoller - 改.c diff --git a/src/kernel/mpoller - 改.c b/src/kernel/mpoller - 改.c new file mode 100644 index 0000000..139312e --- /dev/null +++ b/src/kernel/mpoller - 改.c @@ -0,0 +1,122 @@ +// °æÈ¨ÉùÃ÷£¬±íÃ÷Õâ¶Î´úÂëÊÇSogou, Inc.ÔÚ2019Äê°æÈ¨ËùÓе쬲¢ÇÒÕâ¶Î´úÂëÊÇÔÚApache License 2.0ÏÂÊÚȨµÄ¡£ +/* + Copyright (c) 2019 Sogou, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Author: Xie Han (xiehan@sogou-inc.com) +*/ + +#include // °üº¬±ê×¼¶¨ÒåÍ·Îļþ£¬±ÈÈçNULLºÍsize_tµÄ¶¨Òå +#include // °üº¬±ê×¼¿âÍ·Îļþ£¬±ÈÈçmallocºÍfreeº¯ÊýµÄ¶¨Òå +#include "poller.h" // °üº¬pollerµÄÍ·Îļþ£¬¶¨ÒåÁ˵¥Ïß³ÌpollerµÄ½Ó¿Ú +#include "mpoller.h" // °üº¬¶àÏß³ÌpollerµÄÍ·Îļþ£¬¶¨ÒåÁËmpollerµÄ½Ó¿Ú + +// ÍⲿÉùÃ÷µÄº¯Êý£¬ÓÃÓÚ´´½¨ºÍÏú»Ùpoller¶ÔÏó¡£ +extern poller_t* __poller_create(void**, const struct poller_params*); +extern void __poller_destroy(poller_t*); + +// ¾²Ì¬º¯Êý£¬ÓÃÓÚ´´½¨¶àÏß³Ìpoller¶ÔÏó¡£ +static int __mpoller_create(const struct poller_params* params, + mpoller_t* mpoller) +{ + void** nodes_buf = (void**)calloc(params->max_open_files, sizeof(void*)); // ·ÖÅäÄÚ´æÓÃÓÚ±£´æpoller¶ÔÏó + unsigned int i; + + if (nodes_buf) // Èç¹ûÄÚ´æ·ÖÅä³É¹¦ + { + for (i = 0; i < mpoller->nthreads; i++) // Ñ­»·´´½¨¶à¸öpoller¶ÔÏó + { + mpoller->poller[i] = __poller_create(nodes_buf, params); // ´´½¨µ¥¸öpoller + if (!mpoller->poller[i]) // Èç¹û´´½¨Ê§°Ü + break; // Í˳öÑ­»· + } + + if (i == mpoller->nthreads) // Èç¹ûËùÓÐpoller¶ÔÏó¶¼´´½¨³É¹¦ + { + mpoller->nodes_buf = nodes_buf; // ±£´ænodes_bufÖ¸Õë + return 0; // ·µ»Ø³É¹¦ + } + + while (i > 0) // Èç¹û´´½¨Ê§°Ü£¬Ïú»ÙÒѾ­´´½¨µÄpoller¶ÔÏó + __poller_destroy(mpoller->poller[--i]); + + free(nodes_buf); // ÊÍ·Ånodes_bufÄÚ´æ + } + + return -1; // ·µ»ØÊ§°Ü +} + +// º¯ÊýÓÃÓÚ´´½¨¶àÏß³Ìpoller¶ÔÏó¡£ +mpoller_t* mpoller_create(const struct poller_params* params, size_t nthreads) +{ + mpoller_t* mpoller; // ÉùÃ÷mpoller¶ÔÏóÖ¸Õë + size_t size; // ÉùÃ÷size±äÁ¿£¬ÓÃÓÚ¼ÆËãËùÐèÄÚ´æ´óС + + if (nthreads == 0) // Èç¹ûÏß³ÌÊýΪ0£¬ÔòĬÈÏΪ1 + nthreads = 1; + + size = offsetof(mpoller_t, poller) + nthreads * sizeof(void*); // ¼ÆËãËùÐèÄÚ´æ´óС + mpoller = (mpoller_t*)malloc(size); // ·ÖÅäÄÚ´æ + if (mpoller) // Èç¹ûÄÚ´æ·ÖÅä³É¹¦ + { + mpoller->nthreads = (unsigned int)nthreads; // ÉèÖÃÏß³ÌÊý + if (__mpoller_create(params, mpoller) >= 0) // Èç¹û´´½¨³É¹¦ + return mpoller; // ·µ»Ømpoller¶ÔÏó + + free(mpoller); // Èç¹û´´½¨Ê§°Ü£¬ÊÍ·ÅÄÚ´æ + } + + return NULL; // ·µ»ØNULL +} + +// º¯ÊýÓÃÓÚÆô¶¯¶àÏß³Ìpoller¶ÔÏó¡£ +int mpoller_start(mpoller_t* mpoller) +{ + size_t i; // Ñ­»·±äÁ¿ + + for (i = 0; i < mpoller->nthreads; i++) // Ñ­»·Æô¶¯Ã¿¸öpollerÏß³Ì + { + if (poller_start(mpoller->poller[i]) < 0) // Èç¹ûÆô¶¯Ê§°Ü + break; // Í˳öÑ­»· + } + + if (i == mpoller->nthreads) // Èç¹ûËùÓÐÏ̶߳¼Æô¶¯³É¹¦ + return 0; // ·µ»Ø³É¹¦ + + while (i > 0) // Èç¹ûÆô¶¯Ê§°Ü£¬Í£Ö¹ÒѾ­Æô¶¯µÄÏß³Ì + poller_stop(mpoller->poller[--i]); + + return -1; // ·µ»ØÊ§°Ü +} + +// º¯ÊýÓÃÓÚÍ£Ö¹¶àÏß³Ìpoller¶ÔÏó¡£ +void mpoller_stop(mpoller_t* mpoller) +{ + size_t i; // Ñ­»·±äÁ¿ + + for (i = 0; i < mpoller->nthreads; i++) // Ñ­»·Í£Ö¹Ã¿¸öpollerÏß³Ì + poller_stop(mpoller->poller[i]); +} + +// º¯ÊýÓÃÓÚÏú»Ù¶àÏß³Ìpoller¶ÔÏó¡£ +void mpoller_destroy(mpoller_t* mpoller) +{ + size_t i; // Ñ­»·±äÁ¿ + + for (i = 0; i < mpoller->nthreads; i++) // Ñ­»·Ïú»Ùÿ¸öpoller¶ÔÏó + __poller_destroy(mpoller->poller[i]); + + free(mpoller->nodes_buf); // ÊÍ·Ånodes_bufÄÚ´æ + free(mpoller); // ÊÍ·Åmpoller¶ÔÏóÄÚ´æ +} \ No newline at end of file