## modules/th/thread.c

/* [<][>][^][v][top][bottom][index][help] */

## FUNCTIONS

This source file includes following functions.

1. TH_acquire_read_lock
2. TH_release_read_lock
3. TH_acquire_write_lock
4. TH_release_write_lock
5. TH_init_read_write_lock
6. TH_get_id
7. TH_to_string
8. TH_create

       1 /***************************************
       2   $Revision: 1.20 $
       3
       4   Example code: A thread.
       5
       6   Status: NOT REVUED, NOT TESTED
       7
       8  Authors:       Chris Ottrey
       9                 Joao Damas
      10
      11   +html+ <DL COMPACT>
      12   +html+ <DT>Online References:
      13   +html+ <DD><UL>
      14   +html+ </UL>
      15   +html+ </DL>
      16
      17   ******************/ /******************
      18   Modification History:
      19         ottrey (02/03/1999) Created.
      20         ottrey (08/03/1999) Modified.
      21         ottrey (17/06/1999) Stripped down.
      22         joao   (22/06/1999) Redid thread startup
      23   ******************/ /******************
      24   Copyright (c) 1999                              RIPE NCC
      25
      26   All Rights Reserved
      27
      28   Permission to use, copy, modify, and distribute this software and its
      29   documentation for any purpose and without fee is hereby granted,
      30   provided that the above copyright notice appear in all copies and that
      31   both that copyright notice and this permission notice appear in
      32   supporting documentation, and that the name of the author not be
      33   used in advertising or publicity pertaining to distribution of the
      34   software without specific, written prior permission.
      35
      36   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
      37   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
      38   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
      39   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
      40   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
      41   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      42   ***************************************/
      43 #include <pthread.h>       /* Posix thread library */
      44 #include <stdio.h>
      45 #include <strings.h>
      46
      47 #include "thread.h"
      48 #include "socket.h"
      49 #include "protocol_whois.h"
      50 #include "protocol_config.h"
      51 #include "protocol_mirror.h"
      52 #include "constants.h"
      53 #include "server.h"
      54 #include "memwrap.h"
      55
      56 /*+ String sizes +*/
      57 #define STR_S   63
      58 #define STR_M   255
      59 #define STR_L   1023
      60 #define STR_XL  4095
      61 #define STR_XXL 16383
      62
      63 //typedef struct th_args {
      64 //      void *function;
      65 //      int sock;
      66 //} th_args;
      67
      68
      69 /* TH_acquire_read_lock() */
      70 /*++++++++++++++++++++++++++++++++++++++
      71
      72   Aquire a readers lock.
      73
      74   rw_lock_t *prw_lock Readers writers lock.
      75
      76   Reference: "Multithreaded Programming Techniques - Prasad p.192"
      77   More:
      78   +html+ <PRE>
      79   Author:
      80         ottrey
      81   +html+ </PRE>
      82   ++++++++++++++++++++++++++++++++++++++*/
      83 void TH_acquire_read_lock(rw_lock_t *prw_lock) {
         /* [<][>][^][v][top][bottom][index][help] */
      84   pthread_mutex_lock(&prw_lock->rw_mutex);
      85
      86   while (prw_lock->rw_count < 0) {
      87     pthread_cond_wait(&prw_lock->rw_cond, &prw_lock->rw_mutex);
      88   }
      89
      90   ++prw_lock->rw_count;
      91   pthread_mutex_unlock(&prw_lock->rw_mutex);
      92
      93 } /* TH_acquire_read_lock() */
      94
      95 /* TH_release_read_lock() */
      96 /*++++++++++++++++++++++++++++++++++++++
      97
      98   Release a readers lock.
      99
     100   rw_lock_t *prw_lock Readers writers lock.
     101
     102   Reference: "Multithreaded Programming Techniques - Prasad p.192"
     103   More:
     104   +html+ <PRE>
     105   Author:
     106         ottrey
     107   +html+ </PRE>
     108   ++++++++++++++++++++++++++++++++++++++*/
     109 void TH_release_read_lock(rw_lock_t *prw_lock) {
         /* [<][>][^][v][top][bottom][index][help] */
     110   pthread_mutex_lock(&prw_lock->rw_mutex);
     111
     112   --prw_lock->rw_count;
     113
     114   if (!prw_lock->rw_count) {
     115     pthread_cond_signal(&prw_lock->rw_cond);
     116   }
     117
     118   pthread_mutex_unlock(&prw_lock->rw_mutex);
     119
     120 } /* TH_release_read_lock() */
     121
     122 /* TH_acquire_write_lock() */
     123 /*++++++++++++++++++++++++++++++++++++++
     124
     125   Aquire a writers lock.
     126
     127   rw_lock_t *prw_lock Readers writers lock.
     128
     129   Reference: "Multithreaded Programming Techniques - Prasad p.192"
     130   More:
     131   +html+ <PRE>
     132   Author:
     133         ottrey
     134   +html+ </PRE>
     135   ++++++++++++++++++++++++++++++++++++++*/
     136 void TH_acquire_write_lock(rw_lock_t *prw_lock) {
         /* [<][>][^][v][top][bottom][index][help] */
     137   pthread_mutex_lock(&prw_lock->rw_mutex);
     138
     139   while (prw_lock->rw_count != 0) {
     140     pthread_cond_wait(&prw_lock->rw_cond, &prw_lock->rw_mutex);
     141   }
     142
     143   prw_lock->rw_count = -1;
     144   pthread_mutex_unlock(&prw_lock->rw_mutex);
     145
     146 } /* TH_acquire_write_lock() */
     147
     148 /* TH_release_write_lock() */
     149 /*++++++++++++++++++++++++++++++++++++++
     150
     151   Release a writers lock.
     152
     153   rw_lock_t *prw_lock Readers writers lock.
     154
     155   Reference: "Multithreaded Programming Techniques - Prasad p.192"
     156   More:
     157   +html+ <PRE>
     158   Author:
     159         ottrey
     160   +html+ </PRE>
     161   ++++++++++++++++++++++++++++++++++++++*/
     162 void TH_release_write_lock(rw_lock_t *prw_lock) {
         /* [<][>][^][v][top][bottom][index][help] */
     163   pthread_mutex_lock(&prw_lock->rw_mutex);
     164   prw_lock->rw_count = 0;
     165   pthread_mutex_unlock(&prw_lock->rw_mutex);
     166   pthread_cond_broadcast(&prw_lock->rw_cond);
     167
     168 } /* TH_release_write_lock() */
     169
     170 /* TH_init_read_write_lock() */
     171 /*++++++++++++++++++++++++++++++++++++++
     172
     173   Initialize a readers/writers lock.
     174
     175   rw_lock_t *prw_lock Readers writers lock.
     176
     177   Side effect: the lock is set to open(?)
     178
     179   Reference: "Multithreaded Programming Techniques - Prasad p.192"
     180   More:
     181   +html+ <PRE>
     182   Author:
     183         ottrey
     184   +html+ </PRE>
     185   ++++++++++++++++++++++++++++++++++++++*/
     186 void TH_init_read_write_lock(rw_lock_t *prw_lock) {
         /* [<][>][^][v][top][bottom][index][help] */
     187   pthread_mutex_init(&prw_lock->rw_mutex, NULL);
     188   pthread_cond_init(&prw_lock->rw_cond, NULL);
     189   prw_lock->rw_count = 0;
     190
     191 } /* TH_init_read_write_lock() */
     192
     193 int TH_get_id(void) {
         /* [<][>][^][v][top][bottom][index][help] */
     194
     195   return (int)pthread_self();
     196
     197 } /* TH_get_id() */
     198
     199 /* TH_to_string() */
     200 char *TH_to_string(void) {
         /* [<][>][^][v][top][bottom][index][help] */
     201   char *thread_info;
     202   char tmp[STR_L];
     203   char thread_info_buffer[STR_XL];
     204
     205   strcpy(thread_info_buffer, "Thread = { ");
     206
     207   sprintf(tmp, "[pthread_self] = \"%d\" ", pthread_self());
     208   strcat(thread_info_buffer, tmp);
     209
     210   /*
     211   thread_name = (char *)pthread_getspecific(Name);
     212
     213   if (thread_name == NULL ) {
     214     sprintf(tmp, "[Name] = \"%s\" ", "didn't work!");
     215   }
     216   else {
     217     sprintf(tmp, "[Name] = \"%s\" ", thread_name);
     218   }
     219   strcat(thread_info_buffer, tmp);
     220   */
     221
     222   strcat(thread_info_buffer, "}");
     223
     224   dieif( wr_malloc((void **)&thread_info,
     225                    strlen(thread_info_buffer)+1) != UT_OK);
     226
     227   strcpy(thread_info, thread_info_buffer);
     228
     229   return thread_info;
     230 } /* TH_to_string() */
     231
     232
     233 /*++++++++++++++++++++++++++++++++++++++
     234
     235   This is the routine that creates a thread.
     236
     237    More:
     238   +html+ <PRE>
     239   Author:
     240         ottrey
     241         joao
     242         andrei
     243   +html+ </PRE>
     244   ++++++++++++++++++++++++++++++++++++++*/
     245 void TH_create(void *do_function(void *), void *arguments ) {
         /* [<][>][^][v][top][bottom][index][help] */
     246   pthread_t tid;
     247   pthread_attr_t attr;
     248
     249     /* Start a new thread. */
     250     pthread_attr_init(&attr);     /* initialize attr with default attributes */
     251     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
     252     pthread_create(&tid, &attr, do_function, arguments);
     253
     254 } /* TH_run() */
     255
     256
     257

/* [<][>][^][v][top][bottom][index][help] */