]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/frr_pthread.h
lib: enforce vrf_name_to_id by returning default_vrf when name is null
[mirror_frr.git] / lib / frr_pthread.h
index 2cc50196a897b81ca103c0c6f3c6ba56314653ae..b9e60511d56aa7e725593e87c8533bad699e1202 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Utilities and interfaces for managing POSIX threads within FRR.
- * Copyright (C) 2017  Cumulus Networks
+ * Copyright (C) 2017  Cumulus Networks, Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 DECLARE_MTYPE(FRR_PTHREAD);
 DECLARE_MTYPE(PTHREAD_PRIM);
 
+#define OS_THREAD_NAMELEN 16
+
 struct frr_pthread;
 struct frr_pthread_attr;
 
 struct frr_pthread_attr {
-       int id;
        void *(*start)(void *);
        int (*stop)(struct frr_pthread *, void **);
-       const char *name;
 };
 
 struct frr_pthread {
 
+       /*
+        * Mutex protecting this structure. Must be taken for reading some
+        * fields, denoted by a 'Requires: mtx'.
+        */
+       pthread_mutex_t mtx;
+
        /* pthread id */
        pthread_t thread;
 
@@ -73,8 +79,20 @@ struct frr_pthread {
         * Fake thread-specific storage. No constraints on usage. Helpful when
         * creating reentrant pthread implementations. Can be used to pass
         * argument to pthread entry function.
+        *
+        * Requires: mtx
         */
        void *data;
+
+       /*
+        * Human-readable thread name.
+        *
+        * Requires: mtx
+        */
+       char *name;
+
+       /* Used in pthread_set_name max 16 characters */
+       char os_name[OS_THREAD_NAMELEN];
 };
 
 extern struct frr_pthread_attr frr_pthread_attr_default;
@@ -107,9 +125,24 @@ void frr_pthread_finish(void);
  * frr_pthread will cause them to run on that pthread.
  *
  * @param attr - the thread attributes
+ * @param name - Human-readable name
+ * @param os_name - 16 characters (including '\0') thread name to set in os,
  * @return the created frr_pthread upon success, or NULL upon failure
  */
-struct frr_pthread *frr_pthread_new(struct frr_pthread_attr *attr);
+struct frr_pthread *frr_pthread_new(struct frr_pthread_attr *attr,
+                                   const char *name, const char *os_name);
+
+/*
+ * Changes the name of the frr_pthread.
+ *
+ * @param fpt - the frr_pthread to operate on
+ * @param name - Human-readable name
+ * @param os_name - 16 characters thread name , including the null
+ * terminator ('\0') to set in os.
+ * @return -  on success returns 0 otherwise nonzero error number.
+ */
+int frr_pthread_set_name(struct frr_pthread *fpt, const char *name,
+                        const char *os_name);
 
 /*
  * Destroys an frr_pthread.
@@ -120,13 +153,6 @@ struct frr_pthread *frr_pthread_new(struct frr_pthread_attr *attr);
  */
 void frr_pthread_destroy(struct frr_pthread *fpt);
 
-/*
- * Gets an existing frr_pthread by its id.
- *
- * @return frr_thread associated with the provided id, or NULL on error
- */
-struct frr_pthread *frr_pthread_get(unsigned int id);
-
 /*
  * Creates a new pthread and binds it to a frr_pthread.
  *
@@ -184,20 +210,8 @@ int frr_pthread_stop(struct frr_pthread *fpt, void **result);
 /* Stops all frr_pthread's. */
 void frr_pthread_stop_all(void);
 
-/* Yields the current thread of execution */
-void frr_pthread_yield(void);
-
-/*
- * Returns a unique identifier for use with frr_pthread_new().
- *
- * Internally, this is an integer that increments after each call to this
- * function. Because the number of pthreads created should never exceed INT_MAX
- * during the life of the program, there is no overflow protection. If by
- * chance this function returns an ID which is already in use,
- * frr_pthread_new() will fail when it is provided.
- *
- * @return unique identifier
- */
-unsigned int frr_pthread_get_id(void);
+#ifndef HAVE_PTHREAD_CONDATTR_SETCLOCK
+#define pthread_condattr_setclock(A, B)
+#endif
 
 #endif /* _FRR_PTHREAD_H */