os/ossrv/glib/tsrc/BC/tests/timeloop.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/* Portion Copyright © 2008-09 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
sl@0
     2
#undef G_DISABLE_ASSERT
sl@0
     3
#undef G_LOG_DOMAIN
sl@0
     4
sl@0
     5
#include <errno.h>
sl@0
     6
#include <stdlib.h>
sl@0
     7
#include <unistd.h>
sl@0
     8
#include <stdio.h>
sl@0
     9
#include <sys/time.h>
sl@0
    10
#include <sys/resource.h>
sl@0
    11
sl@0
    12
#include <glib.h>
sl@0
    13
sl@0
    14
#ifdef SYMBIAN
sl@0
    15
#include <glib_global.h>
sl@0
    16
#include "mrt2_glib2_test.h"
sl@0
    17
#endif /*SYMBIAN*/
sl@0
    18
sl@0
    19
sl@0
    20
static int n_children = 4;
sl@0
    21
static int n_active_children;
sl@0
    22
static int n_iters = 5;
sl@0
    23
static GMainLoop *loop;
sl@0
    24
sl@0
    25
static void
sl@0
    26
io_pipe (GIOChannel **channels)
sl@0
    27
{
sl@0
    28
  int fds[2];
sl@0
    29
sl@0
    30
  if (pipe(fds) < 0)
sl@0
    31
    {
sl@0
    32
      g_print ("Cannot create pipe %s\n", g_strerror (errno));
sl@0
    33
      g_assert(FALSE && "timeloop failed");  
sl@0
    34
    
sl@0
    35
#ifdef SYMBIAN
sl@0
    36
  testResultXml("timeloop");
sl@0
    37
#endif /* EMULATOR */
sl@0
    38
      exit (1);
sl@0
    39
    }
sl@0
    40
sl@0
    41
  channels[0] = g_io_channel_unix_new (fds[0]);
sl@0
    42
  channels[1] = g_io_channel_unix_new (fds[1]);
sl@0
    43
}
sl@0
    44
sl@0
    45
static gboolean
sl@0
    46
read_all (GIOChannel *channel, char *buf, int len)
sl@0
    47
{
sl@0
    48
  gsize bytes_read = 0;
sl@0
    49
  gsize count;
sl@0
    50
  GIOError err;
sl@0
    51
sl@0
    52
  while (bytes_read < len)
sl@0
    53
    {
sl@0
    54
      err = g_io_channel_read (channel, buf + bytes_read, len - bytes_read, &count);
sl@0
    55
      if (err)
sl@0
    56
	{
sl@0
    57
	  if (err != G_IO_ERROR_AGAIN)
sl@0
    58
	  {
sl@0
    59
	  	g_assert(FALSE && "timeloop failed");
sl@0
    60
	    return FALSE;
sl@0
    61
	  }
sl@0
    62
	}
sl@0
    63
      else if (count == 0)
sl@0
    64
	return FALSE;
sl@0
    65
sl@0
    66
      bytes_read += count;
sl@0
    67
    }
sl@0
    68
sl@0
    69
  return TRUE;
sl@0
    70
}
sl@0
    71
sl@0
    72
static gboolean
sl@0
    73
write_all (GIOChannel *channel, char *buf, int len)
sl@0
    74
{
sl@0
    75
  gsize bytes_written = 0;
sl@0
    76
  gsize count;
sl@0
    77
  GIOError err;
sl@0
    78
sl@0
    79
  while (bytes_written < len)
sl@0
    80
    {
sl@0
    81
      err = g_io_channel_write (channel, buf + bytes_written, len - bytes_written, &count);
sl@0
    82
      if (err && err != G_IO_ERROR_AGAIN)
sl@0
    83
	return FALSE;
sl@0
    84
sl@0
    85
      bytes_written += count;
sl@0
    86
    }
sl@0
    87
sl@0
    88
  return TRUE;
sl@0
    89
}
sl@0
    90
sl@0
    91
gpointer
sl@0
    92
run_child (gpointer data)
sl@0
    93
{
sl@0
    94
  int i;
sl@0
    95
  int val = 1;
sl@0
    96
  GIOChannel *in_channel,*out_channel;
sl@0
    97
  GTimer *timer = g_timer_new();
sl@0
    98
  
sl@0
    99
  GIOChannel **channels = data;
sl@0
   100
  
sl@0
   101
  in_channel = channels[0];
sl@0
   102
  out_channel = channels[1];
sl@0
   103
sl@0
   104
  for (i = 0; i < n_iters; i++)
sl@0
   105
    {
sl@0
   106
      write_all (out_channel, (char *)&val, sizeof (val));
sl@0
   107
      read_all (in_channel, (char *)&val, sizeof (val));
sl@0
   108
    }
sl@0
   109
sl@0
   110
  val = 0;
sl@0
   111
  write_all (out_channel, (char *)&val, sizeof (val));
sl@0
   112
sl@0
   113
  val = g_timer_elapsed (timer, NULL) * 1000;
sl@0
   114
  
sl@0
   115
  write_all (out_channel, (char *)&val, sizeof (val));
sl@0
   116
  g_timer_destroy (timer);
sl@0
   117
sl@0
   118
  return NULL;
sl@0
   119
}
sl@0
   120
sl@0
   121
static gboolean
sl@0
   122
input_callback (GIOChannel   *source,
sl@0
   123
		GIOCondition  condition,
sl@0
   124
		gpointer      data)
sl@0
   125
{
sl@0
   126
  int val;
sl@0
   127
  GIOChannel *dest = (GIOChannel *)data;
sl@0
   128
  
sl@0
   129
  if (!read_all (source, (char *)&val, sizeof(val)))
sl@0
   130
    {
sl@0
   131
      g_print("Unexpected EOF\n");
sl@0
   132
      g_assert(FALSE && "timeloop failed");
sl@0
   133
    #ifdef SYMBIAN
sl@0
   134
  testResultXml("timeloop");
sl@0
   135
#endif /* EMULATOR */
sl@0
   136
      exit (1);
sl@0
   137
    }
sl@0
   138
sl@0
   139
  if (val)
sl@0
   140
    {
sl@0
   141
      write_all (dest, (char *)&val, sizeof(val));
sl@0
   142
      
sl@0
   143
      return TRUE;
sl@0
   144
    }
sl@0
   145
  else
sl@0
   146
    {
sl@0
   147
      g_io_channel_close (source);
sl@0
   148
      g_io_channel_close (dest);
sl@0
   149
      
sl@0
   150
      g_io_channel_unref (source);
sl@0
   151
      g_io_channel_unref (dest);
sl@0
   152
sl@0
   153
      n_active_children--;
sl@0
   154
      if (n_active_children == 0)
sl@0
   155
	g_main_loop_quit (loop);
sl@0
   156
      
sl@0
   157
      return FALSE;
sl@0
   158
    }
sl@0
   159
}
sl@0
   160
sl@0
   161
static void
sl@0
   162
create_child (void)
sl@0
   163
{
sl@0
   164
  GError *err = NULL;
sl@0
   165
  GIOChannel *in_channels[2];
sl@0
   166
  GIOChannel *out_channels[2];
sl@0
   167
  
sl@0
   168
  GIOChannel **sub_channels;
sl@0
   169
  
sl@0
   170
  sub_channels = g_new (GIOChannel *, 2);
sl@0
   171
  
sl@0
   172
  io_pipe (in_channels);
sl@0
   173
  io_pipe (out_channels);
sl@0
   174
  
sl@0
   175
  sub_channels[0] = in_channels[0];
sl@0
   176
  sub_channels[1] = out_channels[1];
sl@0
   177
sl@0
   178
  g_io_add_watch (out_channels[0], G_IO_IN | G_IO_HUP,
sl@0
   179
		      input_callback, in_channels[1]);
sl@0
   180
  
sl@0
   181
  g_thread_create(run_child,sub_channels,FALSE,&err);
sl@0
   182
}
sl@0
   183
sl@0
   184
int 
sl@0
   185
main (int argc, char **argv)
sl@0
   186
{
sl@0
   187
  int i;
sl@0
   188
  
sl@0
   189
  #ifdef SYMBIAN
sl@0
   190
  g_log_set_handler (NULL,  G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL);
sl@0
   191
  #endif /*SYMBIAN*/
sl@0
   192
	  
sl@0
   193
  g_thread_init(NULL);
sl@0
   194
  
sl@0
   195
  if (argc > 1)
sl@0
   196
    n_children = atoi(argv[1]);
sl@0
   197
sl@0
   198
  if (argc > 2)
sl@0
   199
    n_iters = atoi(argv[2]);
sl@0
   200
sl@0
   201
  //printf ("Children: %d     Iters: %d\n", n_children, n_iters);
sl@0
   202
sl@0
   203
  n_active_children = n_children;
sl@0
   204
  for (i = 0; i < n_children; i++)
sl@0
   205
    create_child ();
sl@0
   206
sl@0
   207
  loop = g_main_loop_new (NULL, FALSE);
sl@0
   208
  
sl@0
   209
  g_assert(loop != NULL);
sl@0
   210
  
sl@0
   211
  g_main_loop_run (loop);
sl@0
   212
  #ifdef SYMBIAN
sl@0
   213
  testResultXml("timeloop");
sl@0
   214
  #endif /* EMULATOR */
sl@0
   215
  return 0;
sl@0
   216
}