*
* Connection Manager
*
- * Copyright (C) 2011 Intel Corporation. All rights reserved.
+ * Copyright (C) 2012 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
#endif
#include <stdio.h>
+#include <stdbool.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
static guint install_watch = 0;
static guint uart_watch = 0;
-static gint install_count = 0;
+static int install_count = 0;
#define NCCS2 19
struct termios2 {
DBG("");
f = fopen(TIST_SYSFS_BAUD, "r");
- if (f == NULL)
+ if (!f)
return -EIO;
err = fscanf(f, "%lu", baud);
memset(uart_name, 0, uart_name_len);
f = fopen(TIST_SYSFS_UART, "r");
- if (f == NULL)
+ if (!f)
return -EIO;
err = fscanf(f, "%s", uart_name);
if (ioctl(uart_fd, TIOCSETD, &ldisc) < 0)
goto err;
- g_atomic_int_set(&install_count, 0);
+ install_count = 1;
+ __sync_synchronize();
return FALSE;
err:
- g_atomic_int_set(&install_count, 0);
+ install_count = 0;
+ __sync_synchronize();
+
g_io_channel_shutdown(channel, TRUE, NULL);
g_io_channel_unref(channel);
return FALSE;
}
-static int install_ldisc(GIOChannel *channel, gboolean install)
+static int install_ldisc(GIOChannel *channel, bool install)
{
int uart_fd, err;
struct speed_change_cmd cmd;
DBG("%d %p", install, uart_channel);
- if (install == FALSE) {
- g_atomic_int_set(&install_count, 0);
+ if (!install) {
+ install_count = 0;
+ __sync_synchronize();
- if (uart_channel == NULL) {
+ if (!uart_channel) {
DBG("UART channel is NULL");
return 0;
}
return 0;
}
- if (uart_channel != NULL) {
+ if (uart_channel) {
g_io_channel_shutdown(uart_channel, TRUE, NULL);
g_io_channel_unref(uart_channel);
uart_channel = NULL;
}
DBG("opening %s custom baud %lu", uart_dev_name, baud_rate);
-
+
uart_fd = open(uart_dev_name, O_RDWR | O_CLOEXEC);
if (uart_fd < 0)
return -EIO;
- uart_channel = g_io_channel_unix_new(uart_fd);
+ uart_channel = g_io_channel_unix_new(uart_fd);
g_io_channel_set_close_on_unref(uart_channel, TRUE);
g_io_channel_set_encoding(uart_channel, NULL, NULL);
uart_channel = NULL;
}
- g_atomic_int_set(&install_count, 0);
+ install_count = 0;
+ __sync_synchronize();
return 0;
}
{
GIOStatus status = G_IO_STATUS_NORMAL;
unsigned int install_state;
- gboolean install;
+ bool install;
char buf[8];
gsize len;
return FALSE;
}
- if (g_atomic_int_get(&install_count) != 0) {
+ __sync_synchronize();
+ if (install_count != 0) {
status = g_io_channel_seek_position(channel, 0, G_SEEK_SET, NULL);
if (status != G_IO_STATUS_NORMAL) {
g_io_channel_shutdown(channel, TRUE, NULL);
}
/* Read the install value */
- status = g_io_channel_read_chars(channel, (gchar *) buf, 8, &len, NULL);
+ status = g_io_channel_read_chars(channel, (gchar *) buf,
+ 8, &len, NULL);
if (status != G_IO_STATUS_NORMAL) {
g_io_channel_shutdown(channel, TRUE, NULL);
g_io_channel_unref(channel);
return TRUE;
} else {
- g_atomic_int_set(&install_count, 1);
+ install_count = 1;
+ __sync_synchronize();
}
status = g_io_channel_seek_position(channel, 0, G_SEEK_SET, NULL);
if (install_ldisc(channel, install) < 0) {
connman_error("ldisc installation failed");
- g_atomic_int_set(&install_count, 0);
+ install_count = 0;
+ __sync_synchronize();
return TRUE;
}
install_event, NULL, NULL);
if (install_state) {
- g_atomic_int_set(&install_count, 1);
- err = install_ldisc(install_channel, TRUE);
+ install_count = 1;
+ __sync_synchronize();
+
+ err = install_ldisc(install_channel, true);
if (err < 0) {
- connman_error("ldisc installtion failed");
+ connman_error("ldisc installation failed");
return err;
}
}
g_io_channel_shutdown(install_channel, TRUE, NULL);
g_io_channel_unref(install_channel);
- if (uart_channel != NULL) {
+ if (uart_channel) {
g_io_channel_shutdown(uart_channel, TRUE, NULL);
g_io_channel_unref(uart_channel);
uart_channel = NULL;