patacongo commented on a change in pull request #3170:
URL: https://github.com/apache/incubator-nuttx/pull/3170#discussion_r604117937
##########
File path: include/nuttx/sched.h
##########
@@ -529,6 +530,12 @@ struct task_group_s
tls_ndxset_t tg_tlsset; /* Set of TLS data indexes allocated
*/
#endif
+ /* Task-specific Data
*********************************************************/
+
+#ifndef CONFIG_BUILD_KERNEL
+ FAR struct libvars_s *tg_libvars; /* C library global variables */
+#endif
+
Review comment:
This field is for convenience only. By buffering a copy of the
allocated per-task variables, it saves having to look up the pointer when a
pthread inherits it. No essential but a good simplifier.
##########
File path: libs/libc/unistd/lib_getoptvars.c
##########
@@ -0,0 +1,83 @@
+/****************************************************************************
+ * libs/libc/unistd/lib_getoptvars.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 <unistd.h>
+#include <assert.h>
+
+#include <nuttx/tls.h>
+#include <nuttx/lib/libvars.h>
+
+#include <arch/tls.h>
+
+#include "unistd.h"
+#include "libc.h"
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+#ifdef CONFIG_BUILD_KERNEL
+/* Data is naturally process-specific in the KERNEL build so no special
+ * access to process-specific global data is needed.
+ */
+
+FAR struct getopt_s g_getopt_vars =
+{
+ NULL,
+ 0,
+ 1,
+ '?',
+ NULL,
+ false
+};
+#endif
+
Review comment:
This is the fallback globals used for the KERNEL build.
##########
File path: sched/group/Make.defs
##########
@@ -57,6 +57,10 @@ ifneq ($(CONFIG_TLS_NELEM),0)
CSRCS += group_tlsalloc.c group_tlsfree.c
endif
+ifndef CONFIG_BUILD_KERNEL
+CSRCS += group_taskdata.c
+endif
+
Review comment:
This is a TLS function, but I decided to put it into the group
sub-directory instead of the libc because it it not an appropriate function for
use in libc
##########
File path: sched/group/group_taskdata.c
##########
@@ -0,0 +1,75 @@
+/****************************************************************************
+ * sched/group/group_taskdata.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 <assert.h>
+
+#include <nuttx/tls.h>
+
+#include "group/group.h"
+
+#ifndef CONFIG_BUILD_KERNEL
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: tls_set_taskdata
+ *
+ * Description:
+ * Set task-specific data pointer in TLS.
+ *
+ * Input Parameters:
+ * tcb - Identifies task to set TLS data
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+void tls_set_taskdata(FAR struct tcb_s *tcb)
+{
+ FAR struct tls_info_s *info;
+ FAR struct task_group_s *group;
+
+ DEBUGASSERT(tcb != NULL && tcb->group != NULL);
+ group = tcb->group;
+
+ /* This currently assumes a push-down stack. The TLS data lies at the
+ * lowest address of the stack allocation.
+ */
+
+ info = (FAR struct tls_info_s *)tcb->stack_alloc_ptr;
+
+ /* Copy the task data point buffer in the group structure into the
+ * thread's TLS data.
+ */
+
+ info->tl_libvars = group->tg_libvars;
+}
Review comment:
Here the copy in the group structure is used rather than looking up the
source in the main thread stack data.
--
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.
For queries about this service, please contact Infrastructure at:
[email protected]