xiaoxiang781216 commented on code in PR #6197: URL: https://github.com/apache/incubator-nuttx/pull/6197#discussion_r870661724
########## libs/libc/stdlib/lib_cxa_atexit.c: ########## @@ -0,0 +1,81 @@ +/**************************************************************************** + * libs/libc/stdlib/lib_cxa_atexit.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <nuttx/compiler.h> +#include <nuttx/lib/lib.h> + +#include <assert.h> +#include <stdlib.h> + +#include <sys/atexit.h> + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#if defined(__cplusplus) +extern "C" +{ +#endif + + FAR void *__dso_handle weak_data; + +#if defined(__cplusplus) +} +#endif + +FAR void *__dso_handle = &__dso_handle; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: __cxa_atexit Review Comment: need move __aeabi_atexit to libs/libc/machine/arm/? ########## libs/libc/stdlib/lib_onexit.c: ########## @@ -0,0 +1,69 @@ +/**************************************************************************** + * libs/libc/stdlib/lib_onexit.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <sys/atexit.h> + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: on_exit + * + * Description: + * Registers a function to be called at program exit. + * The on_exit() function registers the given function to be called + * at normal process termination, whether via exit or via return from + * the program's main(). The function is passed the status argument + * given to the last call to exit and the arg argument from on_exit(). + * + * NOTE 1: This function comes from SunOS 4, but is also present in + * libc4, libc5 and glibc. It no longer occurs in Solaris (SunOS 5). + * Avoid this function, and use the standard atexit() instead. + * + * NOTE 2: CONFIG_SCHED_ONEXIT must be defined to enable this function Review Comment: remove note 2? ########## sched/task/exit.c: ########## @@ -108,3 +106,8 @@ void exit(int status) _exit(status); } + +void exit(int status) Review Comment: why provide two exit implementation? ########## libs/libc/stdlib/lib_atexit.c: ########## @@ -0,0 +1,148 @@ +/**************************************************************************** + * libs/libc/stdlib/lib_atexit.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> +#include <sched.h> +#include <stdlib.h> + +#include <sys/atexit.h> + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static struct atexit_list_s g_atexit_head; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: atexit + * + * Description: + * Registers a function to be called at program exit. + * The atexit() function registers the given function to be called + * at normal process termination, whether via exit or via return from + * the program's main(). + * + * Limitations in the current implementation: + * + * 1. Only a single atexit function can be registered unless + * CONFIG_LIBC_MAX_EXITFUNS defines a larger number. + * 2. atexit functions are not inherited when a new task is + * created. + * + * Input Parameters: + * func - A pointer to the function to be called when the task exits. + * + * Returned Value: + * Zero on success. Non-zero on failure. + * + ****************************************************************************/ + +int atexit(CODE void (*func)(void)) +{ + return __atexit_register(ATTYPE_ATEXIT, func, NULL, NULL); +} + +int __atexit_register(int type, CODE void (*func)(void), FAR void *arg, + FAR void *dso) +{ + FAR struct atexit_list_s *aehead; + int idx; + int ret = ERROR; + + /* REVISIT: Missing logic */ + + UNUSED(dso); + + /* The following must be atomic */ + + aehead = &g_atexit_head; + + if (func) + { + sched_lock(); Review Comment: sched_lock can't work with SMP, use ta_sem instead ########## include/nuttx/tls.h: ########## @@ -132,6 +133,7 @@ struct task_info_s char ta_domain[NAME_MAX]; /* Current domain for gettext */ # endif #endif + struct atexit_list_s ta_exit; /* Exit functions */ Review Comment: merge to the first patch ########## libs/libc/stdlib/lib_cxa_atexit.c: ########## @@ -0,0 +1,81 @@ +/**************************************************************************** + * libs/libc/stdlib/lib_cxa_atexit.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <nuttx/compiler.h> +#include <nuttx/lib/lib.h> + +#include <assert.h> +#include <stdlib.h> + +#include <sys/atexit.h> + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#if defined(__cplusplus) +extern "C" +{ +#endif + + FAR void *__dso_handle weak_data; + +#if defined(__cplusplus) +} +#endif + +FAR void *__dso_handle = &__dso_handle; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: __cxa_atexit + * + * Description: + * __cxa_atexit() registers a destructor function to be called by exit(). + * On a call to exit(), the registered functions should be called with + * the single argument 'arg'. Destructor functions shall always be + * called in the reverse order to their registration (i.e. the most + * recently registered function shall be called first), + * + * If shared libraries were supported, the callbacks should be invoked + * when the shared library is unloaded as well. + * + * Reference: + * Linux base + * + ****************************************************************************/ + +int __cxa_atexit(void (*func)(void *), FAR void *arg, FAR void *dso_handle) +{ + return __atexit_register(ATTYPE_CXA, (void (*)(void))func, arg, NULL); Review Comment: NULL->dso_handle ########## include/stdlib.h: ########## @@ -81,6 +81,13 @@ #define strtoll_l(s, e, b, l) strtoll(s, e, b) #define strtoull_l(s, e, b, l) strtoull(s, e, b) +/* Temporary fix for undefined exit() */ + +#ifndef __KERNEL__ +# undef exit +# define exit nx_exit Review Comment: why ########## libs/libc/stdlib/lib__Exit.c: ########## @@ -1,5 +1,5 @@ /**************************************************************************** - * libs/libc/stdlib/lib_Exit.c + * libs/libc/stdlib/lib__Exit.c Review Comment: let's create a new PR to merge this patch quickly? ########## include/sys/atexit.h: ########## @@ -0,0 +1,81 @@ +/**************************************************************************** + * include/sys/atexit.h Review Comment: it's not good to add a non standard header file in include/sys folder and is better to define atexit related type and help function to tls.h. ########## include/sys/atexit.h: ########## @@ -0,0 +1,81 @@ +/**************************************************************************** + * include/sys/atexit.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you 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. + * + ****************************************************************************/ + +#ifndef __INCLUDE_SYS_ATEXIT_H +#define __INCLUDE_SYS_ATEXIT_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> +#include <stdlib.h> + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Amount of exit functions */ + +#define _ATEXIT_MAX (CONFIG_LIBC_MAX_EXITFUNS) + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +enum atexit_type_e +{ + ATTYPE_NONE, + ATTYPE_ATEXIT, + ATTYPE_ONEXIT, + ATTYPE_CXA +}; + +struct atexit_s +{ + int type; + CODE void (*func)(void); + FAR void *arg; +}; + +struct atexit_list_s +{ + int idx; + struct atexit_s funcs[_ATEXIT_MAX]; +}; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#if defined(__cplusplus) +extern "C" +{ +#endif + +int __atexit_register(int type, CODE void (*func)(void), FAR void *arg, + FAR void *dso); + +void __atexit_call_exitfuncs(int status); Review Comment: remove __ too ########## include/sys/atexit.h: ########## @@ -0,0 +1,81 @@ +/**************************************************************************** + * include/sys/atexit.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you 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. + * + ****************************************************************************/ + +#ifndef __INCLUDE_SYS_ATEXIT_H +#define __INCLUDE_SYS_ATEXIT_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> +#include <stdlib.h> + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Amount of exit functions */ + +#define _ATEXIT_MAX (CONFIG_LIBC_MAX_EXITFUNS) + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +enum atexit_type_e +{ + ATTYPE_NONE, + ATTYPE_ATEXIT, + ATTYPE_ONEXIT, + ATTYPE_CXA +}; + +struct atexit_s +{ + int type; + CODE void (*func)(void); + FAR void *arg; +}; + +struct atexit_list_s +{ + int idx; + struct atexit_s funcs[_ATEXIT_MAX]; +}; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#if defined(__cplusplus) +extern "C" +{ +#endif + +int __atexit_register(int type, CODE void (*func)(void), FAR void *arg, Review Comment: remove __ ########## include/sys/atexit.h: ########## @@ -0,0 +1,81 @@ +/**************************************************************************** + * include/sys/atexit.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you 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. + * + ****************************************************************************/ + +#ifndef __INCLUDE_SYS_ATEXIT_H +#define __INCLUDE_SYS_ATEXIT_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> +#include <stdlib.h> + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Amount of exit functions */ + +#define _ATEXIT_MAX (CONFIG_LIBC_MAX_EXITFUNS) + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +enum atexit_type_e +{ + ATTYPE_NONE, + ATTYPE_ATEXIT, + ATTYPE_ONEXIT, + ATTYPE_CXA +}; + +struct atexit_s +{ + int type; + CODE void (*func)(void); + FAR void *arg; +}; + +struct atexit_list_s +{ + int idx; Review Comment: idx->next ########## include/sys/atexit.h: ########## @@ -0,0 +1,81 @@ +/**************************************************************************** + * include/sys/atexit.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you 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. + * + ****************************************************************************/ + +#ifndef __INCLUDE_SYS_ATEXIT_H +#define __INCLUDE_SYS_ATEXIT_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> +#include <stdlib.h> + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Amount of exit functions */ + +#define _ATEXIT_MAX (CONFIG_LIBC_MAX_EXITFUNS) Review Comment: remove _? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@nuttx.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org