Skip to content

Commit

Permalink
made library, created test
Browse files Browse the repository at this point in the history
  • Loading branch information
AJ ONeal committed Feb 7, 2011
1 parent c21949b commit 396458d
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 168 deletions.
9 changes: 9 additions & 0 deletions pseudo-fd/CmakeLists.txt
@@ -0,0 +1,9 @@
cmake_minimum_required(VERSION 2.6)

add_definitions (-Wall -Werror -ggdb3)

add_library (pseudofd STATIC pseudo-fd.c)
# add_library (pseudofd SHARED pseudo-fd.c)

add_executable(pseudofd-test pseudo-fd-test.c)
target_link_libraries(pseudofd-test pseudofd)
10 changes: 0 additions & 10 deletions pseudo-fd/Makefile

This file was deleted.

16 changes: 16 additions & 0 deletions pseudo-fd/Makefile.make
@@ -0,0 +1,16 @@
CC_OPTS = -Wall -Werror -lev -ggdb3 -I./include -lpthread

ifeq ($(shell uname), Darwin)
LIBFLAG=
else
LIBFLAG=-Wl
endif


all: pseudo-fd

clean:
rm -f pseudo-fd-test.bin

pseudo-fd:
$(CC) $(CC_OPTS) -o pseudo-fd-test.bin pseudo-fd-test.c pseudo-fd.c
151 changes: 3 additions & 148 deletions pseudo-fd/psuedo-fd-test.c → pseudo-fd/pseudo-fd-test.c
Expand Up @@ -6,25 +6,7 @@
#include <fcntl.h> // fcntl
#include <sys/socket.h> // setsockopt

#define PFD_MAX_BUF 8192
#define PFD_MIN_CHUNK 960

enum PFD_STATUS {
PFD_NONE = 0,
PFD_READ = 1,
PFD_WRITE = 2,
PFD_MAX = 3
};

struct pfd {
// first two are ints
// can be casted to int*
int fd;
int priv_fd;
enum PFD_STATUS status;
char buffer[PFD_MAX_BUF];
int max_write;
};
#include "pseudo-fd.h"

/*
void* do_stuff_thread(void* args)
Expand Down Expand Up @@ -53,135 +35,6 @@ void* do_things_thread(void* args)
}
*/

struct pfd*
pfd_create()
{
int sv[2];
struct pfd* pfd;
int buflen = 1;
int flags;
int result = 0;

// todo try SOCK_DGRAM
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == -1) {
perror("socketpair");
exit(1);
}

// Put in non-block mode
flags = fcntl(sv[0], F_GETFL);
flags |= O_NONBLOCK;
fcntl(sv[0], F_SETFL, flags);
flags = fcntl(sv[1], F_GETFL);
flags |= O_NONBLOCK;
fcntl(sv[1], F_SETFL, flags);

// Shrink buffer to two bytes (only works with AF_UNIX, not AF_INET)
setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &buflen, sizeof(int));
setsockopt(sv[0], SOL_SOCKET, SO_RCVBUF, &buflen, sizeof(int));
setsockopt(sv[1], SOL_SOCKET, SO_SNDBUF, &buflen, sizeof(int));
setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &buflen, sizeof(int));

pfd = malloc(sizeof(struct pfd));
pfd->fd = sv[0];
pfd->priv_fd = sv[1];
pfd->status = 0;
pfd->max_write = 0;

do
{
result = write(pfd->fd, &pfd->buffer, PFD_MAX_BUF);
pfd->max_write += result;
} while (PFD_MAX_BUF == result);

return pfd;
}

void
pfd_destroy(struct pfd* pfd)
{
free(pfd);
}

void
pfd_make_readable(struct pfd* pfd)
{
int result;

if (pfd->status & PFD_READ)
{
return;
}
pfd->status |= PFD_READ;

result = write(pfd->priv_fd, &pfd->buffer, 1);
if (1 == result)
{
return;
}
else
{
printf("should have written 1 byte but wrote %i\n", result);
}
}

void
pfd_make_unreadable(struct pfd* pfd)
{
int result;

if (!(pfd->status & PFD_READ))
{
return;
}
pfd->status &= ~PFD_READ;

result = read(pfd->fd, &pfd->buffer, PFD_MAX_BUF);
if (1 != result)
{
printf("should have read %i byte but read %i\n", 1, result);
}
}


// Take one byte off the buffer
void
pfd_make_writable(struct pfd* pfd)
{
int result;

if (pfd->status & PFD_WRITE)
{
return;
}
pfd->status |= PFD_WRITE;

result = read(pfd->priv_fd, &pfd->buffer, PFD_MIN_CHUNK);
if (PFD_MIN_CHUNK != result)
{
printf("should have read %i byte but read %i\n", PFD_MIN_CHUNK, result);
}
}

// Put one byte back on the buffer
void
pfd_make_unwritable(struct pfd* pfd)
{
int result;

if (!(pfd->status & PFD_WRITE))
{
return;
}
pfd->status &= ~PFD_WRITE;

result = write(pfd->fd, &pfd->buffer, PFD_MAX_BUF);
if (PFD_MIN_CHUNK != result)
{
printf("should have written %i byte but wrote %i\n", PFD_MIN_CHUNK, result);
}
}

void
assert(int maybe)
{
Expand All @@ -203,6 +56,7 @@ main(int argc, char* argv[])
assert(!(PFD_READ & pfd->status));
assert(!(PFD_WRITE & pfd->status));

puts("\nREAD TESTS (passes perfectly if no output)");
pfd_make_readable(pfd);
assert(PFD_READ & pfd->status);
pfd_make_readable(pfd);
Expand All @@ -222,6 +76,7 @@ main(int argc, char* argv[])
pfd_make_unreadable(pfd);
assert(!(PFD_READ & pfd->status));

puts("\n\nWRITE TESTS (passes if no output or read and write the same despite expectation)");
pfd_make_writable(pfd);
assert(PFD_WRITE & pfd->status);
pfd_make_writable(pfd);
Expand Down
17 changes: 8 additions & 9 deletions pseudo-fd/pseudo-fd.c
Expand Up @@ -8,8 +8,7 @@

#include "pseudo-fd.h"

#define PFD_MAX_BUF 8192
#define PFD_MIN_CHUNK 960
static int max_write = 0; // varies by platform

struct pfd*
pfd_create()
Expand Down Expand Up @@ -44,13 +43,13 @@ pfd_create()
pfd->fd = sv[0];
pfd->priv_fd = sv[1];
pfd->status = 0;
pfd->max_write = 0;

do
{
result = write(pfd->fd, &pfd->buffer, PFD_MAX_BUF);
pfd->max_write += result;
max_write += result;
} while (PFD_MAX_BUF == result);
max_write = max_write;

return pfd;
}
Expand Down Expand Up @@ -114,10 +113,10 @@ pfd_make_writable(struct pfd* pfd)
}
pfd->status |= PFD_WRITE;

result = read(pfd->priv_fd, &pfd->buffer, PFD_MIN_CHUNK);
if (PFD_MIN_CHUNK != result)
result = read(pfd->priv_fd, &pfd->buffer, max_write);
if (max_write != result)
{
printf("should have read %i byte but read %i\n", PFD_MIN_CHUNK, result);
printf("should have read %i byte but read %i\n", max_write, result);
}
}

Expand All @@ -134,8 +133,8 @@ pfd_make_unwritable(struct pfd* pfd)
pfd->status &= ~PFD_WRITE;

result = write(pfd->fd, &pfd->buffer, PFD_MAX_BUF);
if (PFD_MIN_CHUNK != result)
if (max_write != result)
{
printf("should have written %i byte but wrote %i\n", PFD_MIN_CHUNK, result);
printf("should have written %i byte but wrote %i\n", max_write, result);
}
}
2 changes: 1 addition & 1 deletion pseudo-fd/pseudo-fd.h
@@ -1,7 +1,7 @@
#ifndef _PFD_H_
#define _PFD_H_

#define PFD_MAX_BUF 8192
#define PFD_MAX_BUF 1920
#define PFD_MIN_CHUNK 960

enum PFD_STATUS {
Expand Down

0 comments on commit 396458d

Please sign in to comment.